From 8e629e59d68d03941cc416b19c4084a15519a3af Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Thu, 17 Dec 2015 16:28:30 -0500 Subject: [PATCH] feat(api): Added check.found method, closes #48 --- README.md | 10 ++++++++++ check-more-types.js | 10 ++++++++++ check-more-types.min.js | 2 +- docs/use.md | 9 +++++++++ test/unit-tests.js | 14 ++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e6756e0..6721c71 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ for advice and examples. * [check.defend in module pattern](#checkdefend-in-module-pattern) * [Safe callback execution](#safe-callback-execution) * [check.then](#checkthen) + * [check.found](#checkfound) * [check.regexp](#checkregexp) * [check.promise](#checkpromise) * [check.validDate](#checkvaliddate) @@ -670,6 +671,15 @@ exception. For these cases, there is `check.then` ---- +#### check.found + +Great for quickly checking string or array search results + +```js +check.found('foo'.indexOf('f')); // true +check.found('foo bar'.indexOf('bar')); // true +``` + #### check.regexp Returns true if the passed value is a regular expression. diff --git a/check-more-types.js b/check-more-types.js index dcee49c..df36139 100644 --- a/check-more-types.js +++ b/check-more-types.js @@ -78,6 +78,15 @@ return (Array.isArray(x) || isString(x)) && x.length === k; } + /** + Checks if the given index is valid in an array or string or -1 + + @method found + */ + function found(index) { + return index >= 0; + } + function startsWith(prefix, x) { return isString(prefix) && isString(x) && @@ -741,6 +750,7 @@ schema: schema, raises: raises, empty: empty, + found: found, emptyString: emptyString, unempty: unempty, unit: unit, diff --git a/check-more-types.min.js b/check-more-types.min.js index 4fbfdd3..aca01a0 100644 --- a/check-more-types.min.js +++ b/check-more-types.min.js @@ -2,4 +2,4 @@ homepage: https://github.com/kensho/check-more-types Copyright @ 2014 Kensho license: MIT */ -!function(){"use strict";function a(a){return function(b){if(arguments.length>2)throw new Error("Curry2 function "+a.name+" called with too many arguments "+arguments.length);return 2===arguments.length?a(arguments[0],arguments[1]):function(c){return a(b,c)}}}function b(a){return"function"==typeof a}function c(a){return"string"==typeof a}function d(a){return c(a)&&a}function e(a){return"object"==typeof a&&!Array.isArray(a)&&!j(a)&&!m(a)}function f(a){return e(a)&&0===Object.keys(a).length}function g(a){return"number"==typeof a&&!isNaN(a)&&a!==1/0&&a!==-(1/0)}function h(a){return g(a)&&a%1===0}function i(a){return g(a)&&a%1!==0}function j(a){return null===a}function k(a){return g(a)&&a>0}function l(a){return g(a)&&0>a}function m(a){return a instanceof Date}function n(a){return a instanceof RegExp}function o(a,b){return a instanceof b}function p(a,b){return(Array.isArray(a)||c(a))&&a.length===b}function q(a,b){return c(a)&&c(b)&&0===b.indexOf(a)}function r(a,b){return typeof b===a}function s(a){return c(a)&&(ca(a)||da(a))}function t(a){var b,c;for(b in a)if(a.hasOwnProperty(b)){if(c=a[b],e(c)&&t(c)===!1)return!1;if(c===!1)return!1}return!0}function u(a,c){var d,f,g={};for(d in c)c.hasOwnProperty(d)&&(f=c[d],b(f)?g[d]=f(a[d]):e(f)&&(g[d]=u(a[d],f)));return g}function v(a){return"undefined"!=typeof a}function w(a){return ea.date(a)&&ea.number(Number(a))}function x(a){return ea.unemptyString(a)&&/^\d+\.\d+\.\d+$/.test(a)}function y(a){var b=typeof a;return"number"===b||"boolean"===b||"string"===b}function z(a){return"number"==typeof a&&0===a}function A(a,b){return a===b}function B(a,b){return v(a)&&I(a,"length")&&b>=0&&b0}function L(a,b){return ea.array(b)&&b.every(a)}function M(a,b){return ea.verify.array(b,"expected array to find bad items"),b.filter(_(a))}function N(a,b){var c=ea.array(a)&&a.every(ea.string);return c&&ea.bool(b)&&b?a.every(ea.lowerCase):c}function O(a,b){return ea.array(a)&&a.every(function(a){return ea.arrayOfStrings(a,b)})}function P(a,b){return ea.verify.fn(ea.every,"missing check.every method"),ea.verify.fn(ea.map,"missing check.map method"),ea.verify.object(a,"missing object to check"),ea.verify.object(b,"missing predicates object"),Object.keys(b).forEach(function(a){if(!ea.fn(b[a]))throw new Error("not a predicate function for "+a+" but "+b[a])}),ea.every(ea.map(a,b))}function Q(a,b){return P(b,a)}function R(a,b){ea.verify.fn(a,"expected function that raises");try{a()}catch(c){return"undefined"==typeof b?!0:"function"==typeof b?b(c):!1}return!1}function S(a){return""===a}function T(a){var b="string"==typeof a||Array.isArray(a);return b?!a.length:a instanceof Object?!Object.keys(a).length:!1}function U(a){var b="string"==typeof a||Array.isArray(a);return b?a.length:a instanceof Object?Object.keys(a).length:!0}function V(a){return ea.number(a)&&a>=0&&1>=a}function W(a){return ea.string(a)&&fa.test(a)}function X(a){return ea.string(a)&&40===a.length&&ga.test(a)}function Y(a){return ea.string(a)&&7===a.length&&ha.test(a)}function Z(){var a=Array.prototype.slice.call(arguments,0);if(!a.length)throw new Error("empty list of arguments to or");return function(){var b=Array.prototype.slice.call(arguments,0);return a.some(function(a){try{return ea.fn(a)?a.apply(null,b):Boolean(a)}catch(c){return!1}})}}function $(){var a=Array.prototype.slice.call(arguments,0);if(!a.length)throw new Error("empty list of arguments to or");return function(){var b=Array.prototype.slice.call(arguments,0);return a.every(function(a){return ea.fn(a)?a.apply(null,b):Boolean(a)})}}function _(a){return function(){return!a.apply(null,arguments)}}function aa(a){return ea.object(a)&&ka(a)}function ba(a,b){return a===b}if("function"!=typeof Function.prototype.bind)throw new Error("Missing Function.prototype.bind, please load es5-shim first");var ca=q.bind(null,"http://"),da=q.bind(null,"https://"),ea={maybe:{},verify:{},not:{},every:t,map:u},fa=/^#(?:[0-9a-fA-F]{3}){1,2}$/,ga=/^[0-9a-f]{40}$/,ha=/^[0-9a-f]{7}$/;if(!ea.defend){var ia=function(a,b,c){ea.verify.fn(a,"expected a function"),ea.verify.array(b,"expected list of predicates"),ea.verify.defined(c,"missing args");var d=0,e=0,f=b.length;for(d=0;f>d;d+=1){var g=b[d];if(ea.fn(g)){if(!g.call(null,c[e])){var h="Argument "+(e+1)+": "+c[e]+" does not pass predicate";throw ea.unemptyString(b[d+1])&&(h+=": "+b[d+1]),new Error(h)}e+=1}}return a.apply(null,c)};ea.defend=function(a){var b=Array.prototype.slice.call(arguments,1);return function(){return ia(a,b,arguments)}}}ea.mixin||(ea.mixin=function(a,f){function g(a,c,f){if(!e(a))throw new Error("missing object "+a);if(!d(c))throw new Error("missing name");if(!b(f))throw new Error("missing function");a[c]||(a[c]=f)}function h(a){return function(){return!ea.defined(arguments[0])||ea.nulled(arguments[0])?!0:a.apply(null,arguments)}}function i(a,b){return function(){var c;if(a.apply(null,arguments)===!1)throw c=arguments[arguments.length-1],new Error(ea.unemptyString(c)?c:b)}}if(c(a)&&b(f)){var j=a;a=f,f=j}if(!b(a))throw new Error("expected predicate function");if(d(f)||(f=a.name),!d(f))throw new Error("predicate function missing name\n"+a.toString());g(ea,f,a),g(ea.maybe,f,h(a)),g(ea.not,f,_(a)),g(ea.verify,f,i(a,f+" failed"))}),ea.then||(ea.then=function(a,b){return function(){var c="function"==typeof a?a.apply(null,arguments):a;return c?b.apply(null,arguments):void 0}});var ja={then:b};ja["catch"]=b,ja["finally"]=b;var ka=Q.bind(null,ja),la={nulled:j,fn:b,string:c,unemptyString:d,object:e,number:g,array:Array.isArray,positiveNumber:k,negativeNumber:l,defined:v,same:A,allSame:D,bit:G,bool:H,has:I,lowerCase:J,unemptyArray:K,arrayOfStrings:N,arrayOfArraysOfStrings:O,all:P,schema:Q,raises:R,empty:T,emptyString:S,unempty:U,unit:V,hexRgb:W,sameLength:C,commitId:X,shortCommitId:Y,index:B,git:F,arrayOf:L,badItems:M,oneOf:a(E),promise:aa,validDate:w,equal:a(ba),or:Z,and:$,primitive:y,zero:z,date:m,regexp:n,instance:o,emptyObject:f,length:p,floatNumber:i,intNumber:h,startsWith:q,webUrl:s,semver:x,type:a(r)};Object.keys(la).forEach(function(a){ea.mixin(la[a],a)}),"object"==typeof module&&(module.exports=ea),"object"==typeof window&&(window.check=ea),"object"==typeof global&&(global.check=ea)}(); \ No newline at end of file +!function(){"use strict";function a(a){return function(b){if(arguments.length>2)throw new Error("Curry2 function "+a.name+" called with too many arguments "+arguments.length);return 2===arguments.length?a(arguments[0],arguments[1]):function(c){return a(b,c)}}}function b(a){return"function"==typeof a}function c(a){return"string"==typeof a}function d(a){return c(a)&&a}function e(a){return"object"==typeof a&&!Array.isArray(a)&&!j(a)&&!m(a)}function f(a){return e(a)&&0===Object.keys(a).length}function g(a){return"number"==typeof a&&!isNaN(a)&&a!==1/0&&a!==-(1/0)}function h(a){return g(a)&&a%1===0}function i(a){return g(a)&&a%1!==0}function j(a){return null===a}function k(a){return g(a)&&a>0}function l(a){return g(a)&&0>a}function m(a){return a instanceof Date}function n(a){return a instanceof RegExp}function o(a,b){return a instanceof b}function p(a,b){return(Array.isArray(a)||c(a))&&a.length===b}function q(a){return a>=0}function r(a,b){return c(a)&&c(b)&&0===b.indexOf(a)}function s(a,b){return typeof b===a}function t(a){return c(a)&&(da(a)||ea(a))}function u(a){var b,c;for(b in a)if(a.hasOwnProperty(b)){if(c=a[b],e(c)&&u(c)===!1)return!1;if(c===!1)return!1}return!0}function v(a,c){var d,f,g={};for(d in c)c.hasOwnProperty(d)&&(f=c[d],b(f)?g[d]=f(a[d]):e(f)&&(g[d]=v(a[d],f)));return g}function w(a){return"undefined"!=typeof a}function x(a){return fa.date(a)&&fa.number(Number(a))}function y(a){return fa.unemptyString(a)&&/^\d+\.\d+\.\d+$/.test(a)}function z(a){var b=typeof a;return"number"===b||"boolean"===b||"string"===b}function A(a){return"number"==typeof a&&0===a}function B(a,b){return a===b}function C(a,b){return w(a)&&J(a,"length")&&b>=0&&b0}function M(a,b){return fa.array(b)&&b.every(a)}function N(a,b){return fa.verify.array(b,"expected array to find bad items"),b.filter(aa(a))}function O(a,b){var c=fa.array(a)&&a.every(fa.string);return c&&fa.bool(b)&&b?a.every(fa.lowerCase):c}function P(a,b){return fa.array(a)&&a.every(function(a){return fa.arrayOfStrings(a,b)})}function Q(a,b){return fa.verify.fn(fa.every,"missing check.every method"),fa.verify.fn(fa.map,"missing check.map method"),fa.verify.object(a,"missing object to check"),fa.verify.object(b,"missing predicates object"),Object.keys(b).forEach(function(a){if(!fa.fn(b[a]))throw new Error("not a predicate function for "+a+" but "+b[a])}),fa.every(fa.map(a,b))}function R(a,b){return Q(b,a)}function S(a,b){fa.verify.fn(a,"expected function that raises");try{a()}catch(c){return"undefined"==typeof b?!0:"function"==typeof b?b(c):!1}return!1}function T(a){return""===a}function U(a){var b="string"==typeof a||Array.isArray(a);return b?!a.length:a instanceof Object?!Object.keys(a).length:!1}function V(a){var b="string"==typeof a||Array.isArray(a);return b?a.length:a instanceof Object?Object.keys(a).length:!0}function W(a){return fa.number(a)&&a>=0&&1>=a}function X(a){return fa.string(a)&&ga.test(a)}function Y(a){return fa.string(a)&&40===a.length&&ha.test(a)}function Z(a){return fa.string(a)&&7===a.length&&ia.test(a)}function $(){var a=Array.prototype.slice.call(arguments,0);if(!a.length)throw new Error("empty list of arguments to or");return function(){var b=Array.prototype.slice.call(arguments,0);return a.some(function(a){try{return fa.fn(a)?a.apply(null,b):Boolean(a)}catch(c){return!1}})}}function _(){var a=Array.prototype.slice.call(arguments,0);if(!a.length)throw new Error("empty list of arguments to or");return function(){var b=Array.prototype.slice.call(arguments,0);return a.every(function(a){return fa.fn(a)?a.apply(null,b):Boolean(a)})}}function aa(a){return function(){return!a.apply(null,arguments)}}function ba(a){return fa.object(a)&&la(a)}function ca(a,b){return a===b}if("function"!=typeof Function.prototype.bind)throw new Error("Missing Function.prototype.bind, please load es5-shim first");var da=r.bind(null,"http://"),ea=r.bind(null,"https://"),fa={maybe:{},verify:{},not:{},every:u,map:v},ga=/^#(?:[0-9a-fA-F]{3}){1,2}$/,ha=/^[0-9a-f]{40}$/,ia=/^[0-9a-f]{7}$/;if(!fa.defend){var ja=function(a,b,c){fa.verify.fn(a,"expected a function"),fa.verify.array(b,"expected list of predicates"),fa.verify.defined(c,"missing args");var d=0,e=0,f=b.length;for(d=0;f>d;d+=1){var g=b[d];if(fa.fn(g)){if(!g.call(null,c[e])){var h="Argument "+(e+1)+": "+c[e]+" does not pass predicate";throw fa.unemptyString(b[d+1])&&(h+=": "+b[d+1]),new Error(h)}e+=1}}return a.apply(null,c)};fa.defend=function(a){var b=Array.prototype.slice.call(arguments,1);return function(){return ja(a,b,arguments)}}}fa.mixin||(fa.mixin=function(a,f){function g(a,c,f){if(!e(a))throw new Error("missing object "+a);if(!d(c))throw new Error("missing name");if(!b(f))throw new Error("missing function");a[c]||(a[c]=f)}function h(a){return function(){return!fa.defined(arguments[0])||fa.nulled(arguments[0])?!0:a.apply(null,arguments)}}function i(a,b){return function(){var c;if(a.apply(null,arguments)===!1)throw c=arguments[arguments.length-1],new Error(fa.unemptyString(c)?c:b)}}if(c(a)&&b(f)){var j=a;a=f,f=j}if(!b(a))throw new Error("expected predicate function");if(d(f)||(f=a.name),!d(f))throw new Error("predicate function missing name\n"+a.toString());g(fa,f,a),g(fa.maybe,f,h(a)),g(fa.not,f,aa(a)),g(fa.verify,f,i(a,f+" failed"))}),fa.then||(fa.then=function(a,b){return function(){var c="function"==typeof a?a.apply(null,arguments):a;return c?b.apply(null,arguments):void 0}});var ka={then:b};ka["catch"]=b,ka["finally"]=b;var la=R.bind(null,ka),ma={nulled:j,fn:b,string:c,unemptyString:d,object:e,number:g,array:Array.isArray,positiveNumber:k,negativeNumber:l,defined:w,same:B,allSame:E,bit:H,bool:I,has:J,lowerCase:K,unemptyArray:L,arrayOfStrings:O,arrayOfArraysOfStrings:P,all:Q,schema:R,raises:S,empty:U,found:q,emptyString:T,unempty:V,unit:W,hexRgb:X,sameLength:D,commitId:Y,shortCommitId:Z,index:C,git:G,arrayOf:M,badItems:N,oneOf:a(F),promise:ba,validDate:x,equal:a(ca),or:$,and:_,primitive:z,zero:A,date:m,regexp:n,instance:o,emptyObject:f,length:p,floatNumber:i,intNumber:h,startsWith:r,webUrl:t,semver:y,type:a(s)};Object.keys(ma).forEach(function(a){fa.mixin(ma[a],a)}),"object"==typeof module&&(module.exports=fa),"object"==typeof window&&(window.check=fa),"object"==typeof global&&(global.check=fa)}(); \ No newline at end of file diff --git a/docs/use.md b/docs/use.md index 6ea01a6..2e28a3a 100644 --- a/docs/use.md +++ b/docs/use.md @@ -564,6 +564,15 @@ exception. For these cases, there is `check.then` ---- +### check.found + +Great for quickly checking string or array search results + +```js +check.found('foo'.indexOf('f')); // true +check.found('foo bar'.indexOf('bar')); // true +``` + ### check.regexp Returns true if the passed value is a regular expression. diff --git a/test/unit-tests.js b/test/unit-tests.js index ecc7592..8402845 100644 --- a/test/unit-tests.js +++ b/test/unit-tests.js @@ -202,6 +202,20 @@ describe('check-more-types', function () { }); }); + describe('check/found', function () { + it('returns true for found indices', function () { + la(check.found('foo'.indexOf('f'))); + la(check.found('foo'.indexOf('oo'))); + la(check.found('foo bar'.indexOf('bar'))); + }); + + it('fails for negative numbers', function () { + la(!check.found('foo'.indexOf('a'))); + la(!check.found(-1), '-1'); + la(!check.found(-2), '-2'); + }); + }); + describe('check/regexp', function () { it('passes regular expressions', function () { la(check.regexp(/foo/));