-
-
Notifications
You must be signed in to change notification settings - Fork 447
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,185 @@ | ||
/* | ||
* @license Apache-2.0 | ||
* | ||
* Copyright (c) 2019 The Stdlib Authors. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
// TypeScript Version: 2.0 | ||
|
||
type Returns = 'values' | 'indices' | '*'; | ||
|
||
/** | ||
* Interface defining function options. | ||
*/ | ||
interface Options { | ||
/** | ||
* Execution context. | ||
*/ | ||
thisArg?: any; | ||
|
||
/** | ||
* If `values`, values are returned; if `indices`, indices are returned; if `*`, both indices and values are returned. | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong. |
||
*/ | ||
returns?: Returns; | ||
} | ||
|
||
/** | ||
* Returns a boolean indicating which group an object's own and inherited property values belongs to. | ||
* | ||
* @returns boolean indicating whether a property value should be placed in the first or second group | ||
*/ | ||
type Nullary = () => boolean; | ||
|
||
/** | ||
* Returns a boolean indicating which group an object's own and inherited property values belongs to. | ||
* | ||
* @param value - object value | ||
* @returns boolean indicating whether a property value should be placed in the first or second group | ||
*/ | ||
type Unary = ( value: any ) => boolean; | ||
|
||
/** | ||
* Returns a boolean indicating which group an object's own and inherited property values belongs to. | ||
* | ||
* @param value - object value | ||
* @param key - object key | ||
* @returns boolean indicating whether a property value should be placed in the first or second group | ||
*/ | ||
type Binary = ( value: any, key: string | symbol ) => boolean; | ||
|
||
/** | ||
* Returns a boolean indicating which group an object's own and inherited property values belongs to. | ||
* | ||
* @param value - object value | ||
* @param key - object key | ||
* @returns boolean indicating whether a property value should be placed in the first or second group | ||
*/ | ||
type Predicate = Nullary | Unary | Binary; | ||
|
||
/** | ||
* Splits an object's own property values into two groups according to a predicate function. | ||
* | ||
* @param obj - input object | ||
* @param predicate - predicate function indicating which group an element in the input object belongs to | ||
* @returns group results | ||
* | ||
* @example | ||
* function predicate( v ) { | ||
* return v[ 0 ] === 'b'; | ||
* } | ||
* var obj = { | ||
* 'a': 'beep', | ||
* 'b': 'boop', | ||
* 'c': 'foo', | ||
* 'd': 'bar' | ||
* }; | ||
* var out = bifurcateOwn( obj, predicate ); | ||
* // e.g., returns [ [ 'beep', 'boop', 'bar' ], [ 'foo' ] ] | ||
* | ||
* @example | ||
* function predicate( v ) { | ||
* return v[ 0 ] === 'b'; | ||
* } | ||
* var obj = { | ||
* 'a': 'beep', | ||
* 'b': 'boop', | ||
* 'c': 'foo', | ||
* 'd': 'bar' | ||
* }; | ||
* var opts = { | ||
* 'returns': 'keys' | ||
* }; | ||
* var out = bifurcateOwn( obj, opts, predicate ); | ||
* // e.g., returns [ [ 'a', 'b', 'd' ], [ 'c' ] ] | ||
* | ||
* @example | ||
* function predicate( v ) { | ||
* return v[ 0 ] === 'b'; | ||
* } | ||
* var obj = { | ||
* 'a': 'beep', | ||
* 'b': 'boop', | ||
* 'c': 'foo', | ||
* 'd': 'bar' | ||
* }; | ||
* var opts = { | ||
* 'returns': '*' | ||
* }; | ||
* var out = bifurcateOwn( obj, opts, predicate ); | ||
* // e.g., returns [ [ [ 'a', 'beep' ], [ 'b', 'boop' ], [ 'd', 'bar' ] ], [ [ 'c', 'foo' ] ] ] | ||
*/ | ||
declare function bifurcateOwn( obj: any, predicate: Predicate ): Array<Array<any>>; // tslint-disable-line max-line-length | ||
|
||
/** | ||
* Splits an object's own property values into two groups according to a predicate function. | ||
* | ||
* @param obj - input object | ||
* @param options - function options | ||
* @param options.thisArg - execution context | ||
* @param options.returns - if `values`, values are returned; if `keys`, keys are returned; if `*`, both keys and values are returned | ||
* @param predicate - predicate function indicating which group an element in the input object belongs to | ||
* @returns group results | ||
* | ||
* @example | ||
* function predicate( v ) { | ||
* return v[ 0 ] === 'b'; | ||
* } | ||
* var obj = { | ||
* 'a': 'beep', | ||
* 'b': 'boop', | ||
* 'c': 'foo', | ||
* 'd': 'bar' | ||
* }; | ||
* var out = bifurcateOwn( obj, predicate ); | ||
* // e.g., returns [ [ 'beep', 'boop', 'bar' ], [ 'foo' ] ] | ||
* | ||
* @example | ||
* function predicate( v ) { | ||
* return v[ 0 ] === 'b'; | ||
* } | ||
* var obj = { | ||
* 'a': 'beep', | ||
* 'b': 'boop', | ||
* 'c': 'foo', | ||
* 'd': 'bar' | ||
* }; | ||
* var opts = { | ||
* 'returns': 'keys' | ||
* }; | ||
* var out = bifurcateOwn( obj, opts, predicate ); | ||
* // e.g., returns [ [ 'a', 'b', 'd' ], [ 'c' ] ] | ||
* | ||
* @example | ||
* function predicate( v ) { | ||
* return v[ 0 ] === 'b'; | ||
* } | ||
* var obj = { | ||
* 'a': 'beep', | ||
* 'b': 'boop', | ||
* 'c': 'foo', | ||
* 'd': 'bar' | ||
* }; | ||
* var opts = { | ||
* 'returns': '*' | ||
* }; | ||
* var out = bifurcateOwn( obj, opts, predicate ); | ||
* // e.g., returns [ [ [ 'a', 'beep' ], [ 'b', 'boop' ], [ 'd', 'bar' ] ], [ [ 'c', 'foo' ] ] ] | ||
*/ | ||
declare function bifurcateOwn( obj: any, options: Options, predicate: Predicate ): Array<Array<any>>; // tslint-disable-line max-line-length | ||
|
||
|
||
// EXPORTS // | ||
|
||
export = bifurcateOwn; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
/* | ||
* @license Apache-2.0 | ||
* | ||
* Copyright (c) 2019 The Stdlib Authors. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
import bifurcateOwn = require( './index' ); | ||
|
||
const predicate = ( v: Array<any> ): boolean => v[ 0 ] === 'b'; | ||
|
||
/** | ||
* A class for instantiating objects with `a` and `b` dummy properties. | ||
*/ | ||
class Foo { | ||
/** | ||
* String property. | ||
*/ | ||
a: string; | ||
|
||
/** | ||
* String property. | ||
*/ | ||
b: string; | ||
|
||
constructor() { | ||
this.a = 'beep'; | ||
this.b = 'boop'; | ||
} | ||
} | ||
|
||
|
||
// TESTS // | ||
|
||
// The function returns an an array of arrays... | ||
{ | ||
const obj = new Foo(); | ||
bifurcateOwn( obj, predicate ); // $ExpectType any[][] | ||
bifurcateOwn( {}, predicate ); // $ExpectType any[][] | ||
const opts = { | ||
'returns': 'indices' as 'indices' | ||
This comment has been minimized.
Sorry, something went wrong.
kgryte
Member
|
||
}; | ||
bifurcateOwn( obj, opts, predicate ); // $ExpectType any[][] | ||
} | ||
|
||
// The compiler throws an error if the function is provided a last argument which is not a function... | ||
{ | ||
const obj = new Foo(); | ||
bifurcateOwn( obj, false ); // $ExpectError | ||
bifurcateOwn( obj, true ); // $ExpectError | ||
bifurcateOwn( obj, 32 ); // $ExpectError | ||
bifurcateOwn( obj, 'abc' ); // $ExpectError | ||
bifurcateOwn( obj, [] ); // $ExpectError | ||
bifurcateOwn( obj, {} ); // $ExpectError | ||
|
||
bifurcateOwn( obj, {}, false ); // $ExpectError | ||
bifurcateOwn( obj, {}, true ); // $ExpectError | ||
bifurcateOwn( obj, {}, 32 ); // $ExpectError | ||
bifurcateOwn( obj, {}, 'abc' ); // $ExpectError | ||
bifurcateOwn( obj, {}, [] ); // $ExpectError | ||
bifurcateOwn( obj, {}, {} ); // $ExpectError | ||
} | ||
|
||
// The compiler throws an error if the function is provided an options argument which is not an object... | ||
{ | ||
const obj = new Foo(); | ||
bifurcateOwn( obj, null, predicate ); // $ExpectError | ||
} | ||
|
||
// The compiler throws an error if the function is provided a `returns` option which is not one of 'indices', 'values', or '*'... | ||
{ | ||
const obj = new Foo(); | ||
bifurcateOwn( obj, { 'returns': '5' }, predicate ); // $ExpectError | ||
bifurcateOwn( obj, { 'returns': 123 }, predicate ); // $ExpectError | ||
bifurcateOwn( obj, { 'returns': [] }, predicate ); // $ExpectError | ||
bifurcateOwn( obj, { 'returns': {} }, predicate ); // $ExpectError | ||
bifurcateOwn( obj, { 'returns': ( x: number ): number => x }, predicate ); // $ExpectError | ||
} | ||
|
||
// The compiler throws an error if the function is provided an invalid number of arguments... | ||
{ | ||
const obj = new Foo(); | ||
bifurcateOwn(); // $ExpectError | ||
bifurcateOwn( obj ); // $ExpectError | ||
bifurcateOwn( obj, {}, predicate, 16 ); // $ExpectError | ||
} |
Similar edits as for
bifurcate-by
.