Skip to content

Commit

Permalink
Add support for multiple predicates to is.any (#104)
Browse files Browse the repository at this point in the history
  • Loading branch information
scraggo authored Feb 17, 2020
1 parent f97029f commit d1929ad
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 5 deletions.
14 changes: 12 additions & 2 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -420,9 +420,9 @@ Returns `true` if `value` is an even integer.

Returns `true` if `value` is an odd integer.

##### .any(predicate, ...values)
##### .any(predicate | predicate[], ...values)

Returns `true` if **any** of the input `values` returns true in the `predicate`:
Using a single `predicate` argument, returns `true` if **any** of the input `values` returns true in the `predicate`:

```js
is.any(is.string, {}, true, '🦄');
Expand All @@ -432,6 +432,16 @@ is.any(is.boolean, 'unicorns', [], new Map());
//=> false
```

Using an array of `predicate[]`, returns `true` if **any** of the input `values` returns true for **any** of the `predicates` provided in an array:

```js
is.any([is.string, is.number], {}, true, '🦄');
//=> true

is.any([is.boolean, is.number], 'unicorns', [], new Map());
//=> false
```

##### .all(predicate, ...values)

Returns `true` if **all** of the input `values` returns true in the `predicate`:
Expand Down
12 changes: 9 additions & 3 deletions source/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,13 @@ const predicateOnArray = (method: ArrayMethod, predicate: Predicate, values: unk
return method.call(values, predicate);
};

is.any = (predicate: Predicate, ...values: unknown[]): boolean => predicateOnArray(Array.prototype.some, predicate, values);
is.any = (predicate: Predicate | Predicate[], ...values: unknown[]): boolean => {
const predicates = is.array(predicate) ? predicate : [predicate];
return predicates.some(singlePredicate =>
predicateOnArray(Array.prototype.some, singlePredicate, values)
);
};

is.all = (predicate: Predicate, ...values: unknown[]): boolean => predicateOnArray(Array.prototype.every, predicate, values);

const assertType = (condition: boolean, description: string, value: unknown): asserts condition => {
Expand Down Expand Up @@ -526,7 +532,7 @@ interface Assert {
inRange: (value: number, range: number | number[]) => asserts value is number;

// Variadic functions.
any: (predicate: Predicate, ...values: unknown[]) => void | never;
any: (predicate: Predicate | Predicate[], ...values: unknown[]) => void | never;
all: (predicate: Predicate, ...values: unknown[]) => void | never;
}

Expand Down Expand Up @@ -616,7 +622,7 @@ export const assert: Assert = {
inRange: (value: number, range: number | number[]): asserts value is number => assertType(is.inRange(value, range), AssertionTypeDescription.inRange, value),

// Variadic functions.
any: (predicate: Predicate, ...values: unknown[]): void | never => assertType(is.any(predicate, ...values), AssertionTypeDescription.any, values),
any: (predicate: Predicate | Predicate[], ...values: unknown[]): void | never => assertType(is.any(predicate, ...values), AssertionTypeDescription.any, values),
all: (predicate: Predicate, ...values: unknown[]): void | never => assertType(is.all(predicate, ...values), AssertionTypeDescription.all, values)
};

Expand Down
2 changes: 2 additions & 0 deletions test/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1458,6 +1458,8 @@ test('is.any', t => {
t.true(is.any(is.object, false, {}, 'unicorns'));
t.false(is.any(is.boolean, '🦄', [], 3));
t.false(is.any(is.integer, true, 'lol', {}));
t.true(is.any([is.string, is.number], {}, true, '🦄'));
t.false(is.any([is.boolean, is.number], 'unicorns', [], new Map()));

t.throws(() => {
is.any(null as any, true);
Expand Down

0 comments on commit d1929ad

Please sign in to comment.