diff --git a/lib/node_modules/@stdlib/utils/some-own-by/README.md b/lib/node_modules/@stdlib/utils/some-own-by/README.md
new file mode 100644
index 000000000000..c63f77ec82b0
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/README.md
@@ -0,0 +1,238 @@
+
+
+# someOwnBy
+
+> Test whether an object contains at least `n` own properties which pass a test implemented by a predicate function.
+
+
+
+
+
+
+
+
+
+
+
+## Usage
+
+```javascript
+var someOwnBy = require( '@stdlib/utils/some-own-by' );
+```
+
+#### someOwnBy( obj, n, predicate\[, thisArg ] )
+
+Tests whether an `object` contains at least `n` own properties which pass a test implemented by a `predicate` function.
+
+```javascript
+function isNegative( value ) {
+ return ( value < 0 );
+}
+
+var obj = {
+ 'a': 1,
+ 'b': -2,
+ 'c': 3,
+ 'd': -1
+};
+
+var bool = someOwnBy( obj, 2, isNegative );
+// returns true
+```
+
+Once the function finds `n` successful properties, the function **immediately** returns `true`.
+
+```javascript
+function isPositive( value ) {
+ if ( value < 0 ) {
+ throw new Error( 'should never reach this line' );
+ }
+ return ( value > 0 );
+}
+
+var obj = {
+ 'a': 1,
+ 'b': 2,
+ 'c': -3,
+ 'd': 4
+};
+
+var bool = someOwnBy( obj, 2, isPositive );
+// returns true
+```
+
+The invoked `function` is provided three arguments:
+
+- `value`: object property value
+- `key`: object property key
+- `obj`: input object
+
+To set the function execution context, provide a `thisArg`.
+
+```javascript
+function sum( value ) {
+ this.sum += value;
+ this.count += 1;
+ return ( value < 0 );
+}
+
+var obj = {
+ 'a': 1,
+ 'b': 2,
+ 'c': 3,
+ 'd': -5
+};
+
+var context = {
+ 'sum': 0,
+ 'count': 0
+};
+
+var bool = someOwnBy( obj, 1, sum, context );
+// returns true
+
+var mean = context.sum / context.count;
+// returns 0.25
+```
+
+
+
+
+
+
+
+
+
+## Notes
+
+- An [`Object`][mdn-object] refers to a JavaScript object, which is a collection of properties. Each property is an association between a key (or name) and a value. The key can be a string or a symbol, and the value can be any JavaScript value, including functions and other objects
+
+- If provided an empty `object`, the function returns `false`.
+
+ ```javascript
+ function alwaysTrue() {
+ return true;
+ }
+ var bool = someOwnBy( {}, 1, alwaysTrue );
+ // returns false
+ ```
+
+- The function does **not** skip `undefined` elements.
+
+
+
+ ```javascript
+ function log( value, key ) {
+ console.log( '%s: %s', key, value );
+ return ( value < 0 );
+ }
+
+ var obj = {
+ 'a': 1,
+ 'b': void 0,
+ 'c': void 0,
+ 'd': 4,
+ 'e': -1
+ };
+
+ var bool = someOwnBy( obj, 1, log );
+ /* =>
+ a: 1
+ b: void 0
+ c: void 0
+ d: 4
+ e: -1
+ */
+ ```
+
+- The function provides limited support for dynamic objects (i.e., objects whose `length` changes during execution).
+
+
+
+
+
+
+
+
+
+## Examples
+
+
+
+```javascript
+var randu = require( '@stdlib/random/base/randu' );
+var someOwnBy = require( '@stdlib/utils/some-own-by' );
+
+function threshold( value ) {
+ return ( value > 0.95 );
+}
+
+var bool;
+var obj = {};
+var i;
+
+for ( i = 0; i < 100; i++ ) {
+ obj[ 'key'+i ] = randu();
+}
+
+bool = someOwnBy( obj, 5, threshold );
+// returns
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[mdn-object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
+
+
+
+
+
+
+
+
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/benchmark/benchmark.js b/lib/node_modules/@stdlib/utils/some-own-by/benchmark/benchmark.js
new file mode 100644
index 000000000000..87ce4fbc36d3
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/benchmark/benchmark.js
@@ -0,0 +1,109 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2024 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.
+*/
+
+'use strict';
+
+// MODULES //
+
+var bench = require( '@stdlib/bench' );
+var isBoolean = require( '@stdlib/assert/is-boolean' ).isPrimitive;
+var isnan = require( '@stdlib/math/base/assert/is-nan' );
+var pkg = require( './../package.json' ).name;
+var someOwnBy = require( './../lib' );
+
+
+// MAIN //
+
+bench( pkg, function benchmark( b ) {
+ var bool;
+ var obj;
+ var i;
+
+ function predicate( v ) {
+ return isnan( v );
+ }
+
+ b.tic();
+ for ( i = 0; i < b.iterations; i++ ) {
+ obj = {
+ 'a': i,
+ 'b': i+1,
+ 'c': i+2,
+ 'd': NaN,
+ 'e': i+4,
+ 'f': NaN
+ };
+ bool = someOwnBy( obj, 2, predicate );
+ if ( typeof bool !== 'boolean' ) {
+ b.fail( 'should return a boolean' );
+ }
+ }
+ b.toc();
+ if ( !isBoolean( bool ) ) {
+ b.fail( 'should return a boolean' );
+ }
+ b.pass( 'benchmark finished' );
+ b.end();
+});
+
+bench( pkg+'::loop', function benchmark( b ) {
+ var total;
+ var count;
+ var bool;
+ var keys;
+ var obj;
+ var key;
+ var i;
+ var j;
+
+ total = 2;
+
+ b.tic();
+ for ( i = 0; i < b.iterations; i++ ) {
+ obj = {
+ 'a': i,
+ 'b': i+1,
+ 'c': i+2,
+ 'd': NaN,
+ 'e': i+4,
+ 'f': NaN
+ };
+ bool = false;
+ count = 0;
+ keys = Object.keys( obj );
+ for ( j = 0; j < keys.length; j++ ) {
+ key = keys[ j ];
+ if ( isnan( obj[ key ] ) ) {
+ count += 1;
+ if ( count === total ) {
+ bool = true;
+ break;
+ }
+ }
+ }
+ if ( typeof bool !== 'boolean' ) {
+ b.fail( 'should return a boolean' );
+ }
+ }
+ b.toc();
+ if ( !isBoolean( bool ) ) {
+ b.fail( 'should be a boolean' );
+ }
+ b.pass( 'benchmark finished' );
+ b.end();
+});
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/docs/repl.txt b/lib/node_modules/@stdlib/utils/some-own-by/docs/repl.txt
new file mode 100644
index 000000000000..e7b6e94de568
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/docs/repl.txt
@@ -0,0 +1,45 @@
+
+{{alias}}( obj, n, predicate[, thisArg ] )
+ Tests whether some `own` properties of a provided object
+ satisfy a predicate function for at least `n` properties.
+
+ The predicate function is provided three arguments:
+
+ - `value`: object value
+ - `key`: object key
+ - `obj`: the input object
+
+ The function immediately returns upon finding `n` successful properties.
+
+ If provided an empty object, the function returns `false`.
+
+ Parameters
+ ----------
+ obj: Object
+ Input object over which to iterate.
+
+ n: number
+ Minimum number of successful properties.
+
+ predicate: Function
+ Test function.
+
+ thisArg: any (optional)
+ Execution context.
+
+ Returns
+ -------
+ bool: boolean
+ The function returns `true` if an object's own properties satisfy a
+ predicate for at least `n` properties; otherwise, the function
+ returns `false`.
+
+ Examples
+ --------
+ > function negative( v ) { return ( v < 0 ); };
+ > var obj = { a: 1, b: 2, c: -3, d: 4, e: -1 };
+ > var bool = {{alias}}( obj, 2, negative )
+ true
+
+ See Also
+ --------
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/docs/types/index.d.ts b/lib/node_modules/@stdlib/utils/some-own-by/docs/types/index.d.ts
new file mode 100644
index 000000000000..81a19241b30c
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/docs/types/index.d.ts
@@ -0,0 +1,102 @@
+/*
+* @license Apache-2.0
+*
+* Copyright (c) 2024 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: 4.1
+
+///
+
+/**
+* Checks whether an own property in an object passes a test.
+*
+* @returns boolean indicating whether an own property in an object passes a test
+*/
+type Nullary = () => boolean;
+
+/**
+* Checks whether an own property in an object passes a test.
+*
+* @param value - object value
+* @returns boolean indicating whether an own property in an object passes a test
+*/
+type Unary = ( value: T ) => boolean;
+
+/**
+* Checks whether an own property in an object passes a test.
+*
+* @param value - object value
+* @param key - object key
+* @returns boolean indicating whether an own property in an object passes a test
+*/
+type Binary = ( value: T, key: keyof any ) => boolean;
+
+/**
+* Checks whether an own property in an object passes a test.
+*
+* @param value - object value
+* @param key - object key
+* @param obj - input object
+* @returns boolean indicating whether an own property in an object passes a test
+*/
+type Ternary = ( value: T, key: keyof any, obj: Record ) => boolean;
+
+/**
+* Checks whether an own property in an object passes a test.
+*
+* @param value - object value
+* @param key - object key
+* @param obj - input object
+* @returns boolean indicating whether an own property in an object passes a test
+*/
+type Predicate = Nullary | Unary | Binary | Ternary;
+
+/**
+* Tests whether an object contains at least `n` own properties which pass a test implemented by a predicate function.
+*
+* ## Notes
+*
+* - The predicate function is provided three arguments:
+*
+* - `value`: object value
+* - `key`: object key
+* - `obj`: the input object
+*
+* - The function immediately returns upon finding `n` successful properties.
+*
+* - If provided an empty object, the function returns `false`.
+*
+* @param obj - input object
+* @param n - number of properties
+* @param predicate - test function
+* @returns boolean indicating whether an object contains at least `n` own properties which pass a test
+*
+* @example
+* function isNegative( v ) {
+* return ( v < 0 );
+* }
+*
+* var obj = { a: 1, b: 2, c: -3, d: 4, e: -1 };
+*
+* var bool = someOwnBy( obj, 2, isNegative );
+* // returns true
+*/
+declare function someOwnBy( obj: Record, n: number, predicate: Predicate ): boolean;
+
+
+// EXPORTS //
+
+export = someOwnBy;
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/docs/types/test.ts b/lib/node_modules/@stdlib/utils/some-own-by/docs/types/test.ts
new file mode 100644
index 000000000000..77fe05b56ee9
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/docs/types/test.ts
@@ -0,0 +1,66 @@
+/*
+* @license Apache-2.0
+*
+* Copyright (c) 2024 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 someOwnBy = require( './index' );
+
+const isPositive = ( v: number ): boolean => {
+ return ( v > 0 );
+};
+
+// TESTS //
+
+// The function returns a boolean...
+{
+ someOwnBy( { 'a': 0, 'b': 1, 'c': 1 }, 2, isPositive ); // $ExpectType boolean
+ someOwnBy( { 'a': -1, 'b': 1, 'c': 2 }, 3, isPositive, {} ); // $ExpectType boolean
+}
+
+// The compiler throws an error if the function is provided a first argument which is not an object...
+{
+ someOwnBy( 2, 2, isPositive ); // $ExpectError
+ someOwnBy( false, 2, isPositive ); // $ExpectError
+ someOwnBy( true, 2, isPositive ); // $ExpectError
+}
+
+// The compiler throws an error if the function is provided a second argument which is not a number...
+{
+ someOwnBy( { 'a': -1, 'b': 1, 'c': 2 }, ( x: number ): number => x, isPositive ); // $ExpectError
+ someOwnBy( { 'a': -1, 'b': 1, 'c': 2 }, false, isPositive ); // $ExpectError
+ someOwnBy( { 'a': -1, 'b': 1, 'c': 2 }, true, isPositive ); // $ExpectError
+ someOwnBy( { 'a': -1, 'b': 1, 'c': 2 }, 'abc', isPositive ); // $ExpectError
+ someOwnBy( { 'a': -1, 'b': 1, 'c': 2 }, {}, isPositive ); // $ExpectError
+ someOwnBy( { 'a': -1, 'b': 1, 'c': 2 }, [], isPositive ); // $ExpectError
+}
+
+// The compiler throws an error if the function is provided a third argument which is not a function...
+{
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 }, 1, 2 ); // $ExpectError
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 }, 1, false ); // $ExpectError
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 }, 1, true ); // $ExpectError
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 }, 1, 'abc' ); // $ExpectError
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 }, 1, {} ); // $ExpectError
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 }, 1, [] ); // $ExpectError
+}
+
+// The compiler throws an error if the function is provided an invalid number of arguments...
+{
+ someOwnBy(); // $ExpectError
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 } ); // $ExpectError
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 }, 1 ); // $ExpectError
+ someOwnBy( { 'a': 1, 'b': 2, 'c': 3 }, 1, isPositive, {}, 3 ); // $ExpectError
+}
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/examples/index.js b/lib/node_modules/@stdlib/utils/some-own-by/examples/index.js
new file mode 100644
index 000000000000..dd2d2cf3ec3e
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/examples/index.js
@@ -0,0 +1,38 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2024 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.
+*/
+
+'use strict';
+
+var randu = require( '@stdlib/random/base/randu' );
+var someOwnBy = require( './../lib' );
+
+function threshold( value ) {
+ return ( value > 0.95 );
+}
+
+var bool;
+var obj;
+var i;
+
+obj = {};
+for ( i = 0; i < 100; i++ ) {
+ obj[ 'key' + i ] = randu();
+}
+
+bool = someOwnBy( obj, 5, threshold );
+console.log( bool );
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/lib/index.js b/lib/node_modules/@stdlib/utils/some-own-by/lib/index.js
new file mode 100644
index 000000000000..10cb14d3d4f8
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/lib/index.js
@@ -0,0 +1,46 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2024 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.
+*/
+
+'use strict';
+
+/**
+* Test whether some own properties of a provided object satisfy a predicate function.
+*
+* @module @stdlib/utils/some-own-by
+*
+* @example
+* var someOwnBy = require( '@stdlib/utils/some-own-by' );
+*
+* function isNegative( v ) {
+* return ( v < 0 );
+* }
+*
+* var obj = { a: 1, b: 2, c: -3, d: 4, e: -1 };
+*
+* var bool = someOwnBy( obj, 2, isNegative );
+* // returns true
+*/
+
+// MODULES //
+
+var main = require( './main.js' );
+
+
+// EXPORTS //
+
+module.exports = main;
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/lib/main.js b/lib/node_modules/@stdlib/utils/some-own-by/lib/main.js
new file mode 100644
index 000000000000..3231f0f66b3c
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/lib/main.js
@@ -0,0 +1,85 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2024 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.
+*/
+
+'use strict';
+
+// MODULES //
+
+var isObject = require( '@stdlib/assert/is-object' );
+var isPositiveInteger = require( '@stdlib/assert/is-positive-integer' ).isPrimitive;
+var hasOwnProp = require( '@stdlib/assert/has-own-property' );
+var isFunction = require( '@stdlib/assert/is-function' );
+var format = require( '@stdlib/string/format' );
+
+
+// MAIN //
+
+/**
+* Tests whether some own properties of a provided object satisfy a predicate function.
+*
+* @param {Object} obj - input object
+* @param {PositiveInteger} n - number of properties
+* @param {Function} predicate - test function
+* @param {*} [thisArg] - execution context
+* @throws {TypeError} first argument must be an object
+* @throws {TypeError} second argument must be a positive integer
+* @throws {TypeError} third argument must be a function
+* @returns {boolean} boolean indicating whether an object contains at least `n` properties which pass a test
+*
+* @example
+* function isNegative( v ) {
+* return ( v < 0 );
+* }
+*
+* var obj = { a: 1, b: 2, c: -3, d: 4, e: -1 };
+*
+* var bool = someOwnBy( obj, 2, isNegative );
+* // returns true
+*/
+function someOwnBy( obj, n, predicate, thisArg ) {
+ var count;
+ var out;
+ var key;
+ if ( !isObject( obj ) ) {
+ throw new TypeError( format( 'invalid argument. First argument must be an object. Value: `%s`.', obj ) );
+ }
+ if ( !isPositiveInteger( n ) ) {
+ throw new TypeError( format( 'invalid argument. Second argument must be a positive integer. Value: `%s`.', n ) );
+ }
+ if ( !isFunction( predicate ) ) {
+ throw new TypeError( format( 'invalid argument. Third argument must be a function. Value: `%s`.', predicate ) );
+ }
+ count = 0;
+ for ( key in obj ) {
+ if ( hasOwnProp( obj, key ) ) {
+ out = predicate.call( thisArg, obj[ key ], key, obj );
+ if ( out ) {
+ count += 1;
+ if ( count === n ) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+
+// EXPORTS //
+
+module.exports = someOwnBy;
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/package.json b/lib/node_modules/@stdlib/utils/some-own-by/package.json
new file mode 100644
index 000000000000..1d86212f1308
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/package.json
@@ -0,0 +1,72 @@
+{
+ "name": "@stdlib/utils/some-own-by",
+ "version": "0.0.0",
+ "description": "Test whether some `own` properties of a provided object satisfy a predicate function for at least `n` properties.",
+ "license": "Apache-2.0",
+ "author": {
+ "name": "The Stdlib Authors",
+ "url": "https://github.com/stdlib-js/stdlib/graphs/contributors"
+ },
+ "contributors": [
+ {
+ "name": "The Stdlib Authors",
+ "url": "https://github.com/stdlib-js/stdlib/graphs/contributors"
+ }
+ ],
+ "main": "./lib",
+ "directories": {
+ "benchmark": "./benchmark",
+ "doc": "./docs",
+ "example": "./examples",
+ "lib": "./lib",
+ "test": "./test"
+ },
+ "types": "./docs/types",
+ "scripts": {},
+ "homepage": "https://github.com/stdlib-js/stdlib",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/stdlib-js/stdlib.git"
+ },
+ "bugs": {
+ "url": "https://github.com/stdlib-js/stdlib/issues"
+ },
+ "dependencies": {},
+ "devDependencies": {},
+ "engines": {
+ "node": ">=0.10.0",
+ "npm": ">2.7.0"
+ },
+ "os": [
+ "aix",
+ "darwin",
+ "freebsd",
+ "linux",
+ "macos",
+ "openbsd",
+ "sunos",
+ "win32",
+ "windows"
+ ],
+ "keywords": [
+ "stdlib",
+ "stdutils",
+ "stdutil",
+ "utilities",
+ "utility",
+ "utils",
+ "util",
+ "test",
+ "any",
+ "every",
+ "all",
+ "object",
+ "object.keys",
+ "iterate",
+ "predicate",
+ "own",
+ "some",
+ "values",
+ "validate"
+ ]
+}
\ No newline at end of file
diff --git a/lib/node_modules/@stdlib/utils/some-own-by/test/test.js b/lib/node_modules/@stdlib/utils/some-own-by/test/test.js
new file mode 100644
index 000000000000..9babfff29633
--- /dev/null
+++ b/lib/node_modules/@stdlib/utils/some-own-by/test/test.js
@@ -0,0 +1,256 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2024 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.
+*/
+
+'use strict';
+
+// MODULES //
+
+var tape = require( 'tape' );
+var noop = require( '@stdlib/utils/noop' );
+var someOwnBy = require( './../lib' );
+
+
+// TESTS //
+
+tape( 'main export is a function', function test( t ) {
+ t.ok( true, __filename );
+ t.strictEqual( typeof someOwnBy, 'function', 'main export is a function' );
+ t.end();
+});
+
+tape( 'the function throws an error if not provided an object', function test( t ) {
+ var values;
+ var i;
+
+ values = [
+ '5',
+ 5,
+ NaN,
+ true,
+ false,
+ null,
+ void 0,
+ [],
+ function noop() {}
+ ];
+
+ for ( i = 0; i < values.length; i++ ) {
+ t.throws( badValue( values[i] ), TypeError, 'throws a type error when provided '+ values[ i ] );
+ }
+ t.end();
+
+ function badValue( value ) {
+ return function badValue() {
+ someOwnBy( value, 2, noop );
+ };
+ }
+});
+
+tape( 'the function throws an error if not provided a second argument which is a positive integer', function test( t ) {
+ var values;
+ var i;
+
+ values = [
+ '5',
+ -5,
+ 0,
+ 3.14,
+ NaN,
+ true,
+ false,
+ null,
+ void 0,
+ {},
+ [],
+ function noop() {}
+ ];
+
+ for ( i = 0; i < values.length; i++ ) {
+ t.throws( badValue( values[ i ] ), TypeError, 'throws a type error when provided ' + values[ i ] );
+ }
+ t.end();
+
+ function badValue( value ) {
+ return function badValue() {
+ someOwnBy( {
+ 'a': 1,
+ 'b': 2,
+ 'c': 3
+ }, value, noop );
+ };
+ }
+});
+
+tape( 'the function throws an error if not provided a predicate function', function test( t ) {
+ var values;
+ var i;
+
+ values = [
+ '5',
+ 5,
+ NaN,
+ true,
+ false,
+ null,
+ void 0,
+ {},
+ [],
+ /.*/,
+ new Date()
+ ];
+
+ for ( i = 0; i < values.length; i++ ) {
+ t.throws( badValue( values[ i ] ), TypeError, 'throws a type error when provided ' + values[ i ] );
+ }
+ t.end();
+
+ function badValue( value ) {
+ return function badValue() {
+ someOwnBy( {
+ 'a': 1,
+ 'b': 2,
+ 'c': 3
+ }, 2, value );
+ };
+ }
+});
+
+tape( 'if provided an empty object, the function returns `false`', function test( t ) {
+ var bool;
+ var obj;
+
+ function foo() {
+ t.fail( 'should not be invoked' );
+ }
+ obj = {};
+ bool = someOwnBy( obj, 1, foo );
+
+ t.strictEqual( bool, false, 'returns false' );
+ t.end();
+});
+
+tape( 'the function returns `true` if an object contains at least `n` own properties which pass a test', function test( t ) {
+ var bool;
+ var obj;
+
+ obj = {
+ 'a': 1,
+ 'b': -2,
+ 'c': 3,
+ 'd': -1
+ };
+
+ function isNegative( value ) {
+ return ( value < 0 );
+ }
+
+ bool = someOwnBy( obj, 2, isNegative );
+
+ t.strictEqual( bool, true, 'returns true' );
+ t.end();
+});
+
+tape( 'the function returns `false` if an object does not contain at least `n` own properties which pass a test', function test( t ) {
+ var bool;
+ var obj;
+
+ obj = {
+ 'a': -1,
+ 'b': -2,
+ 'c': -3
+ };
+
+ function isPositive( value ) {
+ return ( value > 0 );
+ }
+
+ bool = someOwnBy( obj, 1, isPositive );
+
+ t.strictEqual( bool, false, 'returns false' );
+ t.end();
+});
+
+tape( 'the function returns `false` if an object does not contain at least `n` own properties which pass a test', function test( t ) {
+ var bool;
+ var obj;
+
+ obj = {
+ 'a': -1.0,
+ 'b': -2.0,
+ 'c': -3.0
+ };
+
+ function isPositive( value ) {
+ return ( value > 0 );
+ }
+
+ bool = someOwnBy( obj, 4, isPositive );
+
+ t.strictEqual( bool, false, 'returns false' );
+ t.end();
+});
+
+tape( 'the function supports providing an execution context', function test( t ) {
+ var bool;
+ var ctx;
+ var obj;
+
+ function sum( value ) {
+ /* eslint-disable no-invalid-this */
+ this.sum += value;
+ this.count += 1;
+ return ( value < 0 );
+ }
+
+ ctx = {
+ 'sum': 0,
+ 'count': 0
+ };
+ obj = {
+ 'a': 1.0,
+ 'b': -2.0,
+ 'c': 3.0,
+ 'd': -1.0
+ };
+
+ bool = someOwnBy( obj, 2, sum, ctx );
+
+ t.strictEqual( bool, true, 'returns true' );
+ t.strictEqual( ctx.sum/ctx.count, 0.25, 'expected result' );
+
+ t.end();
+});
+
+tape( 'the function returns `false` if provided a regular expression or a date object (no own properties to test)', function test( t ) {
+ var values;
+ var i;
+
+ values = [
+ /.*/,
+ new Date()
+ ];
+
+ for ( i = 0; i < values.length; i++ ) {
+ t.equal( someOwnBy( values[ i ], 1, threshold ), false, 'returns false when provided ' + values[ i ] );
+ }
+ t.end();
+
+ function threshold( value ) {
+ return ( typeof value === 'number' );
+ }
+});