├── .codeclimate.yml ├── .editorconfig ├── .eslintrc ├── .gitignore ├── .travis.yml ├── Func ├── apply.js ├── compose.js ├── curry.js ├── deny.js ├── fix.js ├── flip.js ├── index.js └── memoize.js ├── General ├── areSimilar.js ├── deny.js ├── equals.js ├── id.js ├── index.js ├── ofType.js ├── replicate.js └── typeOf.js ├── LICENSE ├── List ├── all.js ├── and.js ├── any.js ├── at.js ├── breakList.js ├── compact.js ├── concat.js ├── concatMap.js ├── countBy.js ├── difference.js ├── drop.js ├── dropWhile.js ├── each.js ├── elemIndex.js ├── elemIndices.js ├── empty.js ├── filter.js ├── find.js ├── findIndex.js ├── findIndices.js ├── first.js ├── flatten.js ├── fold.js ├── fold1.js ├── foldl.js ├── foldl1.js ├── foldr.js ├── foldr1.js ├── groupBy.js ├── head.js ├── index.js ├── initial.js ├── intersection.js ├── last.js ├── map.js ├── maximum.js ├── maximumBy.js ├── mean.js ├── minimum.js ├── minimumBy.js ├── or.js ├── partition.js ├── product.js ├── range.js ├── reduce.js ├── reject.js ├── reverse.js ├── scan.js ├── scan1.js ├── scanl.js ├── scanl1.js ├── scanr.js ├── scanr1.js ├── slice.js ├── sort.js ├── sortBy.js ├── sortWith.js ├── span.js ├── splitAt.js ├── sum.js ├── tail.js ├── take.js ├── takeWhile.js ├── unfoldr.js ├── union.js ├── unique.js ├── uniqueBy.js ├── zip.js ├── zipAll.js ├── zipAllWith.js └── zipWith.js ├── Num ├── add.js └── index.js ├── Obj ├── clone.js ├── get.js ├── index.js ├── keys.js ├── map.js ├── merge.js ├── objToPairs.js ├── pairsToObj.js ├── reduce.js └── values.js ├── README.md ├── Str ├── breakStr.js ├── camelize.js ├── capitalize.js ├── chars.js ├── contains.js ├── dasherize.js ├── drop.js ├── dropWhile.js ├── empty.js ├── index.js ├── join.js ├── lines.js ├── padLeft.js ├── repeat.js ├── reverse.js ├── slice.js ├── span.js ├── split.js ├── splitAt.js ├── startsWith.js ├── take.js ├── takeWhile.js ├── unchars.js ├── unlines.js ├── unwords.js └── words.js ├── docs ├── FUNC.md ├── LIST.md └── README.md ├── index.js ├── logo.png ├── package.json ├── pnpm-lock.yaml ├── scripts ├── build-docs ├── build-index.js ├── build-module ├── build-readme.js ├── dist ├── new-func └── release ├── src ├── Func │ ├── apply.js │ ├── compose.js │ ├── curry.js │ ├── deny.js │ ├── fix.js │ ├── flip.js │ ├── index.js │ └── memoize.js ├── General │ ├── areSimilar.js │ ├── deny.js │ ├── equals.js │ ├── id.js │ ├── index.js │ ├── ofType.js │ ├── replicate.js │ └── typeOf.js ├── List │ ├── all.js │ ├── and.js │ ├── any.js │ ├── at.js │ ├── breakList.js │ ├── compact.js │ ├── concat.js │ ├── concatMap.js │ ├── countBy.js │ ├── difference.js │ ├── drop.js │ ├── dropWhile.js │ ├── each.js │ ├── elemIndex.js │ ├── elemIndices.js │ ├── empty.js │ ├── filter.js │ ├── find.js │ ├── findIndex.js │ ├── findIndices.js │ ├── first.js │ ├── flatten.js │ ├── fold.js │ ├── fold1.js │ ├── foldl.js │ ├── foldl1.js │ ├── foldr.js │ ├── foldr1.js │ ├── groupBy.js │ ├── head.js │ ├── index.js │ ├── initial.js │ ├── intersection.js │ ├── last.js │ ├── map.js │ ├── maximum.js │ ├── maximumBy.js │ ├── mean.js │ ├── minimum.js │ ├── minimumBy.js │ ├── or.js │ ├── partition.js │ ├── product.js │ ├── range.js │ ├── reduce.js │ ├── reject.js │ ├── reverse.js │ ├── scan.js │ ├── scan1.js │ ├── scanl.js │ ├── scanl1.js │ ├── scanr.js │ ├── scanr1.js │ ├── slice.js │ ├── sort.js │ ├── sortBy.js │ ├── sortWith.js │ ├── span.js │ ├── splitAt.js │ ├── sum.js │ ├── tail.js │ ├── take.js │ ├── takeWhile.js │ ├── unfoldr.js │ ├── union.js │ ├── unique.js │ ├── uniqueBy.js │ ├── zip.js │ ├── zipAll.js │ ├── zipAllWith.js │ └── zipWith.js ├── Num │ ├── add.js │ └── index.js ├── Obj │ ├── clone.js │ ├── get.js │ ├── index.js │ ├── keys.js │ ├── map.js │ ├── merge.js │ ├── objToPairs.js │ ├── pairsToObj.js │ ├── reduce.js │ └── values.js ├── Str │ ├── breakStr.js │ ├── camelize.js │ ├── capitalize.js │ ├── chars.js │ ├── contains.js │ ├── dasherize.js │ ├── drop.js │ ├── dropWhile.js │ ├── empty.js │ ├── index.js │ ├── join.js │ ├── lines.js │ ├── padLeft.js │ ├── repeat.js │ ├── reverse.js │ ├── slice.js │ ├── span.js │ ├── split.js │ ├── splitAt.js │ ├── startsWith.js │ ├── take.js │ ├── takeWhile.js │ ├── unchars.js │ ├── unlines.js │ ├── unwords.js │ └── words.js └── index.js └── test ├── Func.js ├── General.js ├── List.js ├── Num.js ├── Obj.js ├── Str.js └── cases.js /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | engines: 2 | eslint: 3 | enabled: true 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "env": { 4 | "browser": true, 5 | "node": true, 6 | "mocha": true 7 | }, 8 | "rules": { 9 | "camelcase": 2, 10 | "curly": 2, 11 | "eqeqeq": [2, "smart"], 12 | "no-undef": 2, 13 | "no-native-reassign": 2, 14 | "no-script-url": 2, 15 | "no-underscore-dangle": 1, 16 | "dot-notation": 2, 17 | "quotes": [2, "single"], 18 | "no-trailing-spaces": 2, 19 | "no-unused-vars": 0, 20 | "no-extend-native": 2, 21 | "brace-style": [2, "1tbs", { "allowSingleLine": true }], 22 | "strict": 2, 23 | "no-alert": 1, 24 | "no-console": 1, 25 | "no-debugger": 1, 26 | "object-curly-spacing": [2, "always"], 27 | "space-after-keywords": [2, "always"], 28 | "space-before-blocks": [2, "always"] 29 | }, 30 | "globals": { 31 | "console": true, 32 | "fetch": true 33 | }, 34 | "ecmaFeatures": { 35 | "modules": true, 36 | "arrowFunctions": true, 37 | "forOf": true, 38 | "jsx": true 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store/ 3 | coverage/ 4 | npm-debug.log 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "4" 4 | script: npm run cover 5 | -------------------------------------------------------------------------------- /Func/apply.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _curry = require('./curry'); 10 | 11 | var _curry2 = _interopRequireDefault(_curry); 12 | 13 | exports['default'] = (0, _curry2['default'])(function (fn, args) { 14 | return fn.apply(null, args); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Func/compose.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _ListInitial = require('../List/initial'); 10 | 11 | var _ListInitial2 = _interopRequireDefault(_ListInitial); 12 | 13 | var _ListLast = require('../List/last'); 14 | 15 | var _ListLast2 = _interopRequireDefault(_ListLast); 16 | 17 | exports['default'] = function () { 18 | for (var _len = arguments.length, fs = Array(_len), _key = 0; _key < _len; _key++) { 19 | fs[_key] = arguments[_key]; 20 | } 21 | 22 | return function () { 23 | for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 24 | args[_key2] = arguments[_key2]; 25 | } 26 | 27 | return (0, _ListInitial2['default'])(fs).reduceRight(function (acc, f) { 28 | return f.call(undefined, acc); 29 | }, (0, _ListLast2['default'])(fs).apply(undefined, args)); 30 | }; 31 | }; 32 | 33 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Func/curry.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } 8 | 9 | exports["default"] = function (fn) { 10 | var _this = this; 11 | 12 | var c = function c(fnArgs) { 13 | if (fnArgs.length >= fn.length) { 14 | return fn.apply(_this, fnArgs); 15 | } 16 | return function () { 17 | for (var _len2 = arguments.length, cArgs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 18 | cArgs[_key2] = arguments[_key2]; 19 | } 20 | 21 | return c([].concat(_toConsumableArray(fnArgs), cArgs)); 22 | }; 23 | }; 24 | 25 | for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 26 | args[_key - 1] = arguments[_key]; 27 | } 28 | 29 | return c(args); 30 | }; 31 | 32 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /Func/deny.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (fn) { 8 | return function () { 9 | return !fn.apply(undefined, arguments); 10 | }; 11 | }; 12 | 13 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /Func/fix.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (f) { 8 | return (function (g) { 9 | return function () { 10 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 11 | args[_key] = arguments[_key]; 12 | } 13 | 14 | return f(g(g)).apply(null, args); 15 | }; 16 | })(function (g) { 17 | return function () { 18 | for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 19 | args[_key2] = arguments[_key2]; 20 | } 21 | 22 | return f(g(g)).apply(null, args); 23 | }; 24 | }); 25 | }; 26 | 27 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /Func/flip.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _curry = require('./curry'); 10 | 11 | var _curry2 = _interopRequireDefault(_curry); 12 | 13 | exports['default'] = (0, _curry2['default'])(function (fn, x, y) { 14 | return fn(y, x); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Func/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _apply = require('./apply'); 10 | 11 | var _apply2 = _interopRequireDefault(_apply); 12 | 13 | var _compose = require('./compose'); 14 | 15 | var _compose2 = _interopRequireDefault(_compose); 16 | 17 | var _curry = require('./curry'); 18 | 19 | var _curry2 = _interopRequireDefault(_curry); 20 | 21 | var _deny = require('./deny'); 22 | 23 | var _deny2 = _interopRequireDefault(_deny); 24 | 25 | var _fix = require('./fix'); 26 | 27 | var _fix2 = _interopRequireDefault(_fix); 28 | 29 | var _flip = require('./flip'); 30 | 31 | var _flip2 = _interopRequireDefault(_flip); 32 | 33 | var _memoize = require('./memoize'); 34 | 35 | var _memoize2 = _interopRequireDefault(_memoize); 36 | 37 | exports['default'] = { 38 | apply: _apply2['default'], 39 | compose: _compose2['default'], 40 | curry: _curry2['default'], 41 | deny: _deny2['default'], 42 | fix: _fix2['default'], 43 | flip: _flip2['default'], 44 | memoize: _memoize2['default'] }; 45 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Func/memoize.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | exports['default'] = function (fn) { 8 | var memo = {}; 9 | return function () { 10 | for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { 11 | args[_key] = arguments[_key]; 12 | } 13 | 14 | var key = args.map(function (arg) { 15 | return arg + typeof arg; 16 | }).join(''); 17 | return key in memo ? memo[key] : memo[key] = fn.apply(undefined, args); 18 | }; 19 | }; 20 | 21 | module.exports = exports['default']; -------------------------------------------------------------------------------- /General/areSimilar.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } 10 | 11 | var _FuncCurry = require('../Func/curry'); 12 | 13 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 14 | 15 | var _FuncFix = require('../Func/fix'); 16 | 17 | var _FuncFix2 = _interopRequireDefault(_FuncFix); 18 | 19 | var _ObjKeys = require('../Obj/keys'); 20 | 21 | var _ObjKeys2 = _interopRequireDefault(_ObjKeys); 22 | 23 | var _ObjGet = require('../Obj/get'); 24 | 25 | var _ObjGet2 = _interopRequireDefault(_ObjGet); 26 | 27 | var _typeOf = require('./typeOf'); 28 | 29 | var _typeOf2 = _interopRequireDefault(_typeOf); 30 | 31 | var _equals = require('./equals'); 32 | 33 | var _equals2 = _interopRequireDefault(_equals); 34 | 35 | exports['default'] = (0, _FuncFix2['default'])(function (areSimilar) { 36 | return (0, _FuncCurry2['default'])(function (a, b) { 37 | if (!_equals2['default'].apply(undefined, _toConsumableArray([a, b].map(_typeOf2['default'])))) { 38 | return false; 39 | } 40 | 41 | switch ((0, _typeOf2['default'])(a)) { 42 | case 'Array': 43 | return _equals2['default'].apply(undefined, _toConsumableArray([a, b].map((0, _ObjGet2['default'])('length')))) && (0, _ObjKeys2['default'])(a).reduce(function (acc, k) { 44 | return acc && areSimilar(a[k], b[k]); 45 | }, true); 46 | case 'Object': 47 | return _equals2['default'].apply(undefined, _toConsumableArray([a, b].map(_ObjKeys2['default']).map((0, _ObjGet2['default'])('length')))) && (0, _ObjKeys2['default'])(a).reduce(function (acc, k) { 48 | return acc && areSimilar(a[k], b[k]); 49 | }, true); 50 | case 'Function': 51 | return (0, _equals2['default'])(a.toString(), b.toString()); 52 | default: 53 | return (0, _equals2['default'])(a, b); 54 | } 55 | }); 56 | }); 57 | module.exports = exports['default']; -------------------------------------------------------------------------------- /General/deny.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (x) { 8 | return !x; 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /General/equals.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (a, b) { 14 | return a === b; 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /General/id.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | var id = function id(x) { 7 | return x; 8 | }; 9 | 10 | exports.id = id; 11 | exports["default"] = id; -------------------------------------------------------------------------------- /General/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _areSimilar = require('./areSimilar'); 10 | 11 | var _areSimilar2 = _interopRequireDefault(_areSimilar); 12 | 13 | var _deny = require('./deny'); 14 | 15 | var _deny2 = _interopRequireDefault(_deny); 16 | 17 | var _equals = require('./equals'); 18 | 19 | var _equals2 = _interopRequireDefault(_equals); 20 | 21 | var _id = require('./id'); 22 | 23 | var _id2 = _interopRequireDefault(_id); 24 | 25 | var _ofType = require('./ofType'); 26 | 27 | var _ofType2 = _interopRequireDefault(_ofType); 28 | 29 | var _replicate = require('./replicate'); 30 | 31 | var _replicate2 = _interopRequireDefault(_replicate); 32 | 33 | var _typeOf = require('./typeOf'); 34 | 35 | var _typeOf2 = _interopRequireDefault(_typeOf); 36 | 37 | exports['default'] = { 38 | areSimilar: _areSimilar2['default'], 39 | deny: _deny2['default'], 40 | equals: _equals2['default'], 41 | id: _id2['default'], 42 | ofType: _ofType2['default'], 43 | replicate: _replicate2['default'], 44 | typeOf: _typeOf2['default'] }; 45 | module.exports = exports['default']; -------------------------------------------------------------------------------- /General/ofType.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _typeOf = require('./typeOf'); 14 | 15 | var _typeOf2 = _interopRequireDefault(_typeOf); 16 | 17 | var _equals = require('./equals'); 18 | 19 | var _equals2 = _interopRequireDefault(_equals); 20 | 21 | exports['default'] = (0, _FuncCurry2['default'])(function (type, x) { 22 | return (0, _equals2['default'])(type, (0, _typeOf2['default'])(x)); 23 | }); 24 | module.exports = exports['default']; -------------------------------------------------------------------------------- /General/replicate.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _ListRange = require('../List/range'); 14 | 15 | var _ListRange2 = _interopRequireDefault(_ListRange); 16 | 17 | var replicate = (0, _FuncCurry2['default'])(function (n, x) { 18 | return (0, _ListRange2['default'])(n).map(function () { 19 | return x; 20 | }); 21 | }); 22 | 23 | exports.replicate = replicate; 24 | exports['default'] = replicate; -------------------------------------------------------------------------------- /General/typeOf.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (x) { 8 | return ({}).toString.call(x).match(/\[object (\w+)\]/)[1]; 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Alan R. Soares 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /List/all.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncDeny = require('../Func/deny'); 10 | 11 | var _FuncDeny2 = _interopRequireDefault(_FuncDeny); 12 | 13 | var _any = require('./any'); 14 | 15 | var _any2 = _interopRequireDefault(_any); 16 | 17 | exports['default'] = (0, _FuncDeny2['default'])(_any2['default']); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/and.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _reduce = require('./reduce'); 10 | 11 | var _reduce2 = _interopRequireDefault(_reduce); 12 | 13 | exports['default'] = (0, _reduce2['default'])(function (acc, x) { 14 | return acc && !!x; 15 | }, true); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/any.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.some(fn); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/at.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/breakList.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/compact.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _filter = require('./filter'); 10 | 11 | var _filter2 = _interopRequireDefault(_filter); 12 | 13 | var _GeneralId = require('../General/id'); 14 | 15 | var _GeneralId2 = _interopRequireDefault(_GeneralId); 16 | 17 | exports['default'] = (0, _filter2['default'])(_GeneralId2['default']); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/concat.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xss) { 8 | return [].concat.apply([], xss); 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/concatMap.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _concat = require('./concat'); 14 | 15 | var _concat2 = _interopRequireDefault(_concat); 16 | 17 | var _map = require('./map'); 18 | 19 | var _map2 = _interopRequireDefault(_map); 20 | 21 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 22 | return (0, _concat2['default'])((0, _map2['default'])(fn, xs)); 23 | }); 24 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/countBy.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.reduce(function (acc, x) { 15 | var key = fn(x); 16 | acc[key] = acc[key] ? acc[key] + 1 : 1; 17 | return acc; 18 | }, {}); 19 | }); 20 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/difference.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _find = require('./find'); 10 | 11 | var _find2 = _interopRequireDefault(_find); 12 | 13 | exports['default'] = function (xs) { 14 | for (var _len = arguments.length, yss = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 15 | yss[_key - 1] = arguments[_key]; 16 | } 17 | 18 | return xs.filter(function (x) { 19 | return !yss.some((0, _find2['default'])(function (y) { 20 | return y === x; 21 | })); 22 | }); 23 | }; 24 | 25 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/drop.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (n, xs) { 14 | return xs && xs.filter(function (x, i) { 15 | return i >= n; 16 | }); 17 | }); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/dropWhile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (f, xs) { 14 | for (var x in xs) { 15 | if (f(xs[x])) continue;else return xs.slice(x); 16 | } 17 | return []; 18 | }); 19 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/each.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.forEach(fn); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/elemIndex.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/elemIndices.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/empty.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xs) { 8 | return !xs.length; 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/filter.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.filter(fn); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/find.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } 10 | 11 | var _FuncCurry = require('../Func/curry'); 12 | 13 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 14 | 15 | var _FuncFix = require('../Func/fix'); 16 | 17 | var _FuncFix2 = _interopRequireDefault(_FuncFix); 18 | 19 | exports['default'] = (0, _FuncFix2['default'])(function (find) { 20 | return (0, _FuncCurry2['default'])(function (fn, _ref) { 21 | var _ref2 = _toArray(_ref); 22 | 23 | var x = _ref2[0]; 24 | 25 | var xs = _ref2.slice(1); 26 | 27 | return x ? fn(x) ? x : find(fn, xs) : undefined; 28 | }); 29 | }); 30 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/findIndex.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/findIndices.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/first.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _head = require('./head'); 10 | 11 | var _head2 = _interopRequireDefault(_head); 12 | 13 | exports['default'] = _head2['default']; 14 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/flatten.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _GeneralOfType = require('../General/ofType'); 10 | 11 | var _GeneralOfType2 = _interopRequireDefault(_GeneralOfType); 12 | 13 | var _concatMap = require('./concatMap'); 14 | 15 | var _concatMap2 = _interopRequireDefault(_concatMap); 16 | 17 | var flatten = function flatten(ys) { 18 | return (0, _concatMap2['default'])(function (xs) { 19 | return (0, _GeneralOfType2['default'])('Array', xs) ? flatten(xs) : xs; 20 | }, ys); 21 | }; 22 | 23 | exports['default'] = flatten; 24 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/fold.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _foldl = require('./foldl'); 10 | 11 | var _foldl2 = _interopRequireDefault(_foldl); 12 | 13 | exports['default'] = _foldl2['default']; 14 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/fold1.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _foldl1 = require('./foldl1'); 10 | 11 | var _foldl12 = _interopRequireDefault(_foldl1); 12 | 13 | exports['default'] = _foldl12['default']; 14 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/foldl.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, acc, xs) { 14 | return xs.reduce(fn, acc); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/foldl1.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _fold = require('./fold'); 14 | 15 | var _fold2 = _interopRequireDefault(_fold); 16 | 17 | var _head = require('./head'); 18 | 19 | var _head2 = _interopRequireDefault(_head); 20 | 21 | var _tail = require('./tail'); 22 | 23 | var _tail2 = _interopRequireDefault(_tail); 24 | 25 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 26 | return (0, _fold2['default'])(fn, (0, _head2['default'])(xs), (0, _tail2['default'])(xs)); 27 | }); 28 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/foldr.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, acc, xs) { 14 | for (var i = xs.length - 1; i >= 0; i--) { 15 | acc = fn(xs[i], acc); 16 | } 17 | return acc; 18 | }); 19 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/foldr1.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _foldr = require('./foldr'); 14 | 15 | var _foldr2 = _interopRequireDefault(_foldr); 16 | 17 | var _last = require('./last'); 18 | 19 | var _last2 = _interopRequireDefault(_last); 20 | 21 | var _initial = require('./initial'); 22 | 23 | var _initial2 = _interopRequireDefault(_initial); 24 | 25 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 26 | return (0, _foldr2['default'])(fn, (0, _last2['default'])(xs), (0, _initial2['default'])(xs)); 27 | }); 28 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/groupBy.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.reduce(function (acc, x) { 15 | var key = fn(x); 16 | acc[key] = acc[key] ? acc[key].concat([x]) : [x]; 17 | return acc; 18 | }, {}); 19 | }); 20 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/head.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xs) { 8 | return xs[0]; 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _all = require('./all'); 10 | 11 | var _all2 = _interopRequireDefault(_all); 12 | 13 | var _and = require('./and'); 14 | 15 | var _and2 = _interopRequireDefault(_and); 16 | 17 | var _any = require('./any'); 18 | 19 | var _any2 = _interopRequireDefault(_any); 20 | 21 | var _at = require('./at'); 22 | 23 | var _at2 = _interopRequireDefault(_at); 24 | 25 | var _breakList = require('./breakList'); 26 | 27 | var _breakList2 = _interopRequireDefault(_breakList); 28 | 29 | var _compact = require('./compact'); 30 | 31 | var _compact2 = _interopRequireDefault(_compact); 32 | 33 | var _concat = require('./concat'); 34 | 35 | var _concat2 = _interopRequireDefault(_concat); 36 | 37 | var _concatMap = require('./concatMap'); 38 | 39 | var _concatMap2 = _interopRequireDefault(_concatMap); 40 | 41 | var _countBy = require('./countBy'); 42 | 43 | var _countBy2 = _interopRequireDefault(_countBy); 44 | 45 | var _difference = require('./difference'); 46 | 47 | var _difference2 = _interopRequireDefault(_difference); 48 | 49 | var _drop = require('./drop'); 50 | 51 | var _drop2 = _interopRequireDefault(_drop); 52 | 53 | var _dropWhile = require('./dropWhile'); 54 | 55 | var _dropWhile2 = _interopRequireDefault(_dropWhile); 56 | 57 | var _each = require('./each'); 58 | 59 | var _each2 = _interopRequireDefault(_each); 60 | 61 | var _elemIndex = require('./elemIndex'); 62 | 63 | var _elemIndex2 = _interopRequireDefault(_elemIndex); 64 | 65 | var _elemIndices = require('./elemIndices'); 66 | 67 | var _elemIndices2 = _interopRequireDefault(_elemIndices); 68 | 69 | var _empty = require('./empty'); 70 | 71 | var _empty2 = _interopRequireDefault(_empty); 72 | 73 | var _filter = require('./filter'); 74 | 75 | var _filter2 = _interopRequireDefault(_filter); 76 | 77 | var _find = require('./find'); 78 | 79 | var _find2 = _interopRequireDefault(_find); 80 | 81 | var _findIndex = require('./findIndex'); 82 | 83 | var _findIndex2 = _interopRequireDefault(_findIndex); 84 | 85 | var _findIndices = require('./findIndices'); 86 | 87 | var _findIndices2 = _interopRequireDefault(_findIndices); 88 | 89 | var _first = require('./first'); 90 | 91 | var _first2 = _interopRequireDefault(_first); 92 | 93 | var _flatten = require('./flatten'); 94 | 95 | var _flatten2 = _interopRequireDefault(_flatten); 96 | 97 | var _fold = require('./fold'); 98 | 99 | var _fold2 = _interopRequireDefault(_fold); 100 | 101 | var _fold1 = require('./fold1'); 102 | 103 | var _fold12 = _interopRequireDefault(_fold1); 104 | 105 | var _foldl = require('./foldl'); 106 | 107 | var _foldl2 = _interopRequireDefault(_foldl); 108 | 109 | var _foldl1 = require('./foldl1'); 110 | 111 | var _foldl12 = _interopRequireDefault(_foldl1); 112 | 113 | var _foldr = require('./foldr'); 114 | 115 | var _foldr2 = _interopRequireDefault(_foldr); 116 | 117 | var _foldr1 = require('./foldr1'); 118 | 119 | var _foldr12 = _interopRequireDefault(_foldr1); 120 | 121 | var _groupBy = require('./groupBy'); 122 | 123 | var _groupBy2 = _interopRequireDefault(_groupBy); 124 | 125 | var _head = require('./head'); 126 | 127 | var _head2 = _interopRequireDefault(_head); 128 | 129 | var _initial = require('./initial'); 130 | 131 | var _initial2 = _interopRequireDefault(_initial); 132 | 133 | var _intersection = require('./intersection'); 134 | 135 | var _intersection2 = _interopRequireDefault(_intersection); 136 | 137 | var _last = require('./last'); 138 | 139 | var _last2 = _interopRequireDefault(_last); 140 | 141 | var _map = require('./map'); 142 | 143 | var _map2 = _interopRequireDefault(_map); 144 | 145 | var _maximum = require('./maximum'); 146 | 147 | var _maximum2 = _interopRequireDefault(_maximum); 148 | 149 | var _maximumBy = require('./maximumBy'); 150 | 151 | var _maximumBy2 = _interopRequireDefault(_maximumBy); 152 | 153 | var _mean = require('./mean'); 154 | 155 | var _mean2 = _interopRequireDefault(_mean); 156 | 157 | var _minimum = require('./minimum'); 158 | 159 | var _minimum2 = _interopRequireDefault(_minimum); 160 | 161 | var _minimumBy = require('./minimumBy'); 162 | 163 | var _minimumBy2 = _interopRequireDefault(_minimumBy); 164 | 165 | var _or = require('./or'); 166 | 167 | var _or2 = _interopRequireDefault(_or); 168 | 169 | var _partition = require('./partition'); 170 | 171 | var _partition2 = _interopRequireDefault(_partition); 172 | 173 | var _product = require('./product'); 174 | 175 | var _product2 = _interopRequireDefault(_product); 176 | 177 | var _range = require('./range'); 178 | 179 | var _range2 = _interopRequireDefault(_range); 180 | 181 | var _reduce = require('./reduce'); 182 | 183 | var _reduce2 = _interopRequireDefault(_reduce); 184 | 185 | var _reject = require('./reject'); 186 | 187 | var _reject2 = _interopRequireDefault(_reject); 188 | 189 | var _reverse = require('./reverse'); 190 | 191 | var _reverse2 = _interopRequireDefault(_reverse); 192 | 193 | var _scan = require('./scan'); 194 | 195 | var _scan2 = _interopRequireDefault(_scan); 196 | 197 | var _scan1 = require('./scan1'); 198 | 199 | var _scan12 = _interopRequireDefault(_scan1); 200 | 201 | var _scanl = require('./scanl'); 202 | 203 | var _scanl2 = _interopRequireDefault(_scanl); 204 | 205 | var _scanl1 = require('./scanl1'); 206 | 207 | var _scanl12 = _interopRequireDefault(_scanl1); 208 | 209 | var _scanr = require('./scanr'); 210 | 211 | var _scanr2 = _interopRequireDefault(_scanr); 212 | 213 | var _scanr1 = require('./scanr1'); 214 | 215 | var _scanr12 = _interopRequireDefault(_scanr1); 216 | 217 | var _slice = require('./slice'); 218 | 219 | var _slice2 = _interopRequireDefault(_slice); 220 | 221 | var _sort = require('./sort'); 222 | 223 | var _sort2 = _interopRequireDefault(_sort); 224 | 225 | var _sortBy = require('./sortBy'); 226 | 227 | var _sortBy2 = _interopRequireDefault(_sortBy); 228 | 229 | var _sortWith = require('./sortWith'); 230 | 231 | var _sortWith2 = _interopRequireDefault(_sortWith); 232 | 233 | var _span = require('./span'); 234 | 235 | var _span2 = _interopRequireDefault(_span); 236 | 237 | var _splitAt = require('./splitAt'); 238 | 239 | var _splitAt2 = _interopRequireDefault(_splitAt); 240 | 241 | var _sum = require('./sum'); 242 | 243 | var _sum2 = _interopRequireDefault(_sum); 244 | 245 | var _tail = require('./tail'); 246 | 247 | var _tail2 = _interopRequireDefault(_tail); 248 | 249 | var _take = require('./take'); 250 | 251 | var _take2 = _interopRequireDefault(_take); 252 | 253 | var _takeWhile = require('./takeWhile'); 254 | 255 | var _takeWhile2 = _interopRequireDefault(_takeWhile); 256 | 257 | var _unfoldr = require('./unfoldr'); 258 | 259 | var _unfoldr2 = _interopRequireDefault(_unfoldr); 260 | 261 | var _union = require('./union'); 262 | 263 | var _union2 = _interopRequireDefault(_union); 264 | 265 | var _unique = require('./unique'); 266 | 267 | var _unique2 = _interopRequireDefault(_unique); 268 | 269 | var _uniqueBy = require('./uniqueBy'); 270 | 271 | var _uniqueBy2 = _interopRequireDefault(_uniqueBy); 272 | 273 | var _zip = require('./zip'); 274 | 275 | var _zip2 = _interopRequireDefault(_zip); 276 | 277 | var _zipAll = require('./zipAll'); 278 | 279 | var _zipAll2 = _interopRequireDefault(_zipAll); 280 | 281 | var _zipAllWith = require('./zipAllWith'); 282 | 283 | var _zipAllWith2 = _interopRequireDefault(_zipAllWith); 284 | 285 | var _zipWith = require('./zipWith'); 286 | 287 | var _zipWith2 = _interopRequireDefault(_zipWith); 288 | 289 | exports['default'] = { 290 | all: _all2['default'], 291 | and: _and2['default'], 292 | any: _any2['default'], 293 | at: _at2['default'], 294 | breakList: _breakList2['default'], 295 | compact: _compact2['default'], 296 | concat: _concat2['default'], 297 | concatMap: _concatMap2['default'], 298 | countBy: _countBy2['default'], 299 | difference: _difference2['default'], 300 | drop: _drop2['default'], 301 | dropWhile: _dropWhile2['default'], 302 | each: _each2['default'], 303 | elemIndex: _elemIndex2['default'], 304 | elemIndices: _elemIndices2['default'], 305 | empty: _empty2['default'], 306 | filter: _filter2['default'], 307 | find: _find2['default'], 308 | findIndex: _findIndex2['default'], 309 | findIndices: _findIndices2['default'], 310 | first: _first2['default'], 311 | flatten: _flatten2['default'], 312 | fold: _fold2['default'], 313 | fold1: _fold12['default'], 314 | foldl: _foldl2['default'], 315 | foldl1: _foldl12['default'], 316 | foldr: _foldr2['default'], 317 | foldr1: _foldr12['default'], 318 | groupBy: _groupBy2['default'], 319 | head: _head2['default'], 320 | initial: _initial2['default'], 321 | intersection: _intersection2['default'], 322 | last: _last2['default'], 323 | map: _map2['default'], 324 | maximum: _maximum2['default'], 325 | maximumBy: _maximumBy2['default'], 326 | mean: _mean2['default'], 327 | minimum: _minimum2['default'], 328 | minimumBy: _minimumBy2['default'], 329 | or: _or2['default'], 330 | partition: _partition2['default'], 331 | product: _product2['default'], 332 | range: _range2['default'], 333 | reduce: _reduce2['default'], 334 | reject: _reject2['default'], 335 | reverse: _reverse2['default'], 336 | scan: _scan2['default'], 337 | scan1: _scan12['default'], 338 | scanl: _scanl2['default'], 339 | scanl1: _scanl12['default'], 340 | scanr: _scanr2['default'], 341 | scanr1: _scanr12['default'], 342 | slice: _slice2['default'], 343 | sort: _sort2['default'], 344 | sortBy: _sortBy2['default'], 345 | sortWith: _sortWith2['default'], 346 | span: _span2['default'], 347 | splitAt: _splitAt2['default'], 348 | sum: _sum2['default'], 349 | tail: _tail2['default'], 350 | take: _take2['default'], 351 | takeWhile: _takeWhile2['default'], 352 | unfoldr: _unfoldr2['default'], 353 | union: _union2['default'], 354 | unique: _unique2['default'], 355 | uniqueBy: _uniqueBy2['default'], 356 | zip: _zip2['default'], 357 | zipAll: _zipAll2['default'], 358 | zipAllWith: _zipAllWith2['default'], 359 | zipWith: _zipWith2['default'] }; 360 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/initial.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xs) { 8 | return !xs.length ? undefined : xs.slice(0, -1); 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/intersection.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _find = require('./find'); 10 | 11 | var _find2 = _interopRequireDefault(_find); 12 | 13 | exports['default'] = function (xs) { 14 | for (var _len = arguments.length, yss = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 15 | yss[_key - 1] = arguments[_key]; 16 | } 17 | 18 | return xs.filter(function (x) { 19 | return yss.some((0, _find2['default'])(function (y) { 20 | return y === x; 21 | })); 22 | }); 23 | }; 24 | 25 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/last.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xs) { 8 | return xs.slice(-1)[0]; 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/map.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.map(fn); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/maximum.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _maximumBy = require('./maximumBy'); 10 | 11 | var _maximumBy2 = _interopRequireDefault(_maximumBy); 12 | 13 | var _GeneralId = require('../General/id'); 14 | 15 | var _GeneralId2 = _interopRequireDefault(_GeneralId); 16 | 17 | exports['default'] = (0, _maximumBy2['default'])(_GeneralId2['default']); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/maximumBy.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.reduceRight(function (max, x) { 15 | return fn(x) > fn(max) ? x : max; 16 | }); 17 | }); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/mean.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _sum = require('./sum'); 10 | 11 | var _sum2 = _interopRequireDefault(_sum); 12 | 13 | exports['default'] = function (xs) { 14 | return (0, _sum2['default'])(xs) / xs.length; 15 | }; 16 | 17 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/minimum.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _minimumBy = require('./minimumBy'); 10 | 11 | var _minimumBy2 = _interopRequireDefault(_minimumBy); 12 | 13 | var _GeneralId = require('../General/id'); 14 | 15 | var _GeneralId2 = _interopRequireDefault(_GeneralId); 16 | 17 | exports['default'] = (0, _minimumBy2['default'])(_GeneralId2['default']); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/minimumBy.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.reduceRight(function (min, x) { 15 | return fn(x) < fn(min) ? x : min; 16 | }); 17 | }); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/or.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _reduce = require('./reduce'); 10 | 11 | var _reduce2 = _interopRequireDefault(_reduce); 12 | 13 | exports['default'] = (0, _reduce2['default'])(function (acc, x) { 14 | return acc || !!x; 15 | }, false); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/partition.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | var passed = []; 15 | var failed = []; 16 | xs.forEach(function (x) { 17 | return (fn(x) ? passed : failed).push(x); 18 | }); 19 | return [passed, failed]; 20 | }); 21 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/product.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xs) { 8 | return xs.reduceRight(function (x, y) { 9 | return x * y; 10 | }); 11 | }; 12 | 13 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/range.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (to) { 8 | var from = arguments.length <= 1 || arguments[1] === undefined ? 1 : arguments[1]; 9 | var step = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2]; 10 | 11 | var result = []; 12 | for (var i = from; i <= to; i += step) { 13 | result.push(i); 14 | } 15 | return result; 16 | }; 17 | 18 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/reduce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, initial, xs) { 14 | return xs.reduce(fn, initial); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/reject.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _FuncDeny = require('../Func/deny'); 14 | 15 | var _FuncDeny2 = _interopRequireDefault(_FuncDeny); 16 | 17 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 18 | return xs.filter((0, _FuncDeny2['default'])(fn)); 19 | }); 20 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/reverse.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xs) { 8 | return xs.concat().reverse(); 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/scan.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _ListLast = require('../List/last'); 14 | 15 | var _ListLast2 = _interopRequireDefault(_ListLast); 16 | 17 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, init, xs) { 18 | return xs.reduce(function (acc, x) { 19 | return acc.concat(fn((0, _ListLast2['default'])(acc), x)); 20 | }, [init]); 21 | }); 22 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/scan1.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _scan = require('./scan'); 14 | 15 | var _scan2 = _interopRequireDefault(_scan); 16 | 17 | var _head = require('./head'); 18 | 19 | var _head2 = _interopRequireDefault(_head); 20 | 21 | var _tail = require('./tail'); 22 | 23 | var _tail2 = _interopRequireDefault(_tail); 24 | 25 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 26 | return !xs.length ? undefined : (0, _scan2['default'])(fn, (0, _head2['default'])(xs), (0, _tail2['default'])(xs)); 27 | }); 28 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/scanl.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _scan = require('./scan'); 10 | 11 | var _scan2 = _interopRequireDefault(_scan); 12 | 13 | exports['default'] = _scan2['default']; 14 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/scanl1.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _scan1 = require('./scan1'); 10 | 11 | var _scan12 = _interopRequireDefault(_scan1); 12 | 13 | exports['default'] = _scan12['default']; 14 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/scanr.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _ListScan = require('../List/scan'); 14 | 15 | var _ListScan2 = _interopRequireDefault(_ListScan); 16 | 17 | var _ListReverse = require('../List/reverse'); 18 | 19 | var _ListReverse2 = _interopRequireDefault(_ListReverse); 20 | 21 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, init, xs) { 22 | return (0, _ListReverse2['default'])((0, _ListScan2['default'])(fn, init, (0, _ListReverse2['default'])(xs))); 23 | }); 24 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/scanr1.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _scanr = require('./scanr'); 14 | 15 | var _scanr2 = _interopRequireDefault(_scanr); 16 | 17 | var _last = require('./last'); 18 | 19 | var _last2 = _interopRequireDefault(_last); 20 | 21 | var _initial = require('./initial'); 22 | 23 | var _initial2 = _interopRequireDefault(_initial); 24 | 25 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 26 | return !xs.length ? undefined : (0, _scanr2['default'])(fn, (0, _last2['default'])(xs), (0, _initial2['default'])(xs)); 27 | }); 28 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/slice.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (x, y, xs) { 14 | return xs.slice(x, y); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/sort.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xs) { 8 | return xs.concat().sort(); 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/sortBy.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.concat().sort(function (x, y) { 15 | return fn(x) > fn(y) ? 1 : fn(x) < fn(y) ? -1 : 0; 16 | }); 17 | }); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/sortWith.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 14 | return xs.concat().sort(fn); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/span.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _takeWhile = require('./takeWhile'); 14 | 15 | var _takeWhile2 = _interopRequireDefault(_takeWhile); 16 | 17 | var _dropWhile = require('./dropWhile'); 18 | 19 | var _dropWhile2 = _interopRequireDefault(_dropWhile); 20 | 21 | exports['default'] = (0, _FuncCurry2['default'])(function (f, xs) { 22 | return [(0, _takeWhile2['default'])(f, xs), (0, _dropWhile2['default'])(f, xs)]; 23 | }); 24 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/splitAt.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/sum.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _NumAdd = require('../Num/add'); 10 | 11 | var _NumAdd2 = _interopRequireDefault(_NumAdd); 12 | 13 | exports['default'] = function (xs) { 14 | return xs.reduceRight(_NumAdd2['default']); 15 | }; 16 | 17 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/tail.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } 8 | 9 | exports["default"] = function (_ref) { 10 | var _ref2 = _toArray(_ref); 11 | 12 | var x = _ref2[0]; 13 | 14 | var xs = _ref2.slice(1); 15 | 16 | return xs; 17 | }; 18 | 19 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /List/take.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (n, xs) { 14 | return xs && xs.filter(function (x, i) { 15 | return i < n; 16 | }); 17 | }); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/takeWhile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (f, xs) { 14 | for (var x in xs) { 15 | if (f(xs[x])) continue;else return xs.slice(0, x); 16 | } 17 | return xs; 18 | }); 19 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/unfoldr.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, b) { 14 | var result = []; 15 | var x = b; 16 | var that = undefined; 17 | while (that = fn(b)) { 18 | result.push(that[0]); 19 | x = that[1]; 20 | } 21 | return result; 22 | }); 23 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/union.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _unique = require('./unique'); 10 | 11 | var _unique2 = _interopRequireDefault(_unique); 12 | 13 | var _flatten = require('./flatten'); 14 | 15 | var _flatten2 = _interopRequireDefault(_flatten); 16 | 17 | exports['default'] = function (xs) { 18 | for (var _len = arguments.length, yss = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 19 | yss[_key - 1] = arguments[_key]; 20 | } 21 | 22 | return (0, _unique2['default'])(xs.concat((0, _flatten2['default'])(yss))); 23 | }; 24 | 25 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/unique.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _uniqueBy = require('./uniqueBy'); 10 | 11 | var _uniqueBy2 = _interopRequireDefault(_uniqueBy); 12 | 13 | var _GeneralId = require('../General/id'); 14 | 15 | var _GeneralId2 = _interopRequireDefault(_GeneralId); 16 | 17 | exports['default'] = function (xs) { 18 | return (0, _uniqueBy2['default'])(_GeneralId2['default'], xs); 19 | }; 20 | 21 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/uniqueBy.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 10 | 11 | var _FuncCurry = require('../Func/curry'); 12 | 13 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 14 | 15 | var _ObjMerge = require('../Obj/merge'); 16 | 17 | var _ObjMerge2 = _interopRequireDefault(_ObjMerge); 18 | 19 | var _ObjValues = require('../Obj/values'); 20 | 21 | var _ObjValues2 = _interopRequireDefault(_ObjValues); 22 | 23 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, xs) { 24 | var reducer = function reducer(acc, x) { 25 | return (0, _ObjMerge2['default'])(acc, _defineProperty({}, 'K_' + x, x)); 26 | }; 27 | return (0, _ObjValues2['default'])(xs.map(fn).reduce(reducer, {})); 28 | }); 29 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/zip.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (xs, ys) { 14 | return xs.reduce(function (acc, x, i) { 15 | return i === ys.length ? acc : acc.concat([[x, ys[i]]]); 16 | }, []); 17 | }); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /List/zipAll.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/zipAllWith.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /List/zipWith.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (f, xs, ys) { 14 | return xs.reduce(function (acc, x, i) { 15 | return i === ys.length ? acc : acc.concat([f(x, ys[i])]); 16 | }, []); 17 | }); 18 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Num/add.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (a, b) { 14 | return a + b; 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Num/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _add = require('./add'); 10 | 11 | var _add2 = _interopRequireDefault(_add); 12 | 13 | exports['default'] = { 14 | add: _add2['default'] }; 15 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Obj/clone.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCompose = require('../Func/compose'); 10 | 11 | var _FuncCompose2 = _interopRequireDefault(_FuncCompose); 12 | 13 | exports['default'] = function (x) { 14 | return JSON.parse(JSON.stringify(x)); 15 | }; 16 | 17 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Obj/get.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (member, x) { 14 | return x[member]; 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Obj/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _clone = require('./clone'); 10 | 11 | var _clone2 = _interopRequireDefault(_clone); 12 | 13 | var _get = require('./get'); 14 | 15 | var _get2 = _interopRequireDefault(_get); 16 | 17 | var _keys = require('./keys'); 18 | 19 | var _keys2 = _interopRequireDefault(_keys); 20 | 21 | var _map = require('./map'); 22 | 23 | var _map2 = _interopRequireDefault(_map); 24 | 25 | var _merge = require('./merge'); 26 | 27 | var _merge2 = _interopRequireDefault(_merge); 28 | 29 | var _objToPairs = require('./objToPairs'); 30 | 31 | var _objToPairs2 = _interopRequireDefault(_objToPairs); 32 | 33 | var _pairsToObj = require('./pairsToObj'); 34 | 35 | var _pairsToObj2 = _interopRequireDefault(_pairsToObj); 36 | 37 | var _reduce = require('./reduce'); 38 | 39 | var _reduce2 = _interopRequireDefault(_reduce); 40 | 41 | var _values = require('./values'); 42 | 43 | var _values2 = _interopRequireDefault(_values); 44 | 45 | exports['default'] = { 46 | clone: _clone2['default'], 47 | get: _get2['default'], 48 | keys: _keys2['default'], 49 | map: _map2['default'], 50 | merge: _merge2['default'], 51 | objToPairs: _objToPairs2['default'], 52 | pairsToObj: _pairsToObj2['default'], 53 | reduce: _reduce2['default'], 54 | values: _values2['default'] }; 55 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Obj/keys.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports["default"] = Object.keys; 7 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /Obj/map.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _keys = require('./keys'); 14 | 15 | var _keys2 = _interopRequireDefault(_keys); 16 | 17 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, x) { 18 | return (0, _keys2['default'])(x).map(function (k, i) { 19 | return fn(k, x[k], i); 20 | }); 21 | }); 22 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Obj/merge.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _reduce = require('./reduce'); 10 | 11 | var _reduce2 = _interopRequireDefault(_reduce); 12 | 13 | var reducer = (0, _reduce2['default'])(function (acc, key, value) { 14 | acc[key] = value; 15 | return acc; 16 | }); 17 | 18 | exports['default'] = Object.assign || function (y) { 19 | for (var _len = arguments.length, xs = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 20 | xs[_key - 1] = arguments[_key]; 21 | } 22 | 23 | return xs.reduce(reducer, y); 24 | }; 25 | 26 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Obj/objToPairs.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _map = require('./map'); 10 | 11 | var _map2 = _interopRequireDefault(_map); 12 | 13 | exports['default'] = (0, _map2['default'])(function (k, v) { 14 | return [k, v]; 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Obj/pairsToObj.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (xs) { 8 | return xs.reduce(function (acc, x) { 9 | acc[x[0]] = x[1]; 10 | return acc; 11 | }, {}); 12 | }; 13 | 14 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /Obj/reduce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _keys = require('./keys'); 14 | 15 | var _keys2 = _interopRequireDefault(_keys); 16 | 17 | exports['default'] = (0, _FuncCurry2['default'])(function (fn, initial, x) { 18 | return (0, _keys2['default'])(x).reduce(function (acc, k, i) { 19 | return fn(acc, k, x[k], i, x); 20 | }, initial); 21 | }); 22 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Obj/values.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _keys = require('./keys'); 10 | 11 | var _keys2 = _interopRequireDefault(_keys); 12 | 13 | exports['default'] = Object.values || function (x) { 14 | return (0, _keys2['default'])(x).map(function (k) { 15 | return x[k]; 16 | }); 17 | }; 18 | 19 | module.exports = exports['default']; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #Preλude-js 2 | 3 | A truly modular implementation of Haskell's Prelude library in ES6 4 | 5 | [![npm version](https://badge.fury.io/js/preludejs.svg)](http://badge.fury.io/js/preludejs) 6 | [![Bower](https://img.shields.io/bower/v/preludejs.svg)]() 7 | [![Build Status](https://travis-ci.org/alanrsoares/prelude-js.svg?branch=master)](https://travis-ci.org/alanrsoares/prelude-js) 8 | [![codecov.io](http://codecov.io/github/alanrsoares/prelude-js/coverage.svg?branch=master)](http://codecov.io/github/alanrsoares/prelude-js?branch=master) 9 | 10 | > **check out the [docs](/docs/README.md) for modules details** `(WORK IN PROGRESS)` 11 | 12 | ## install 13 | 14 | ```bash 15 | npm install preludejs 16 | ``` 17 | 18 | ![alt tag](/logo.png) 19 | 20 | ## Contribute 21 | 22 | ### clone it 23 | ```bash 24 | $ git clone git@github.com:alanrsoares/prelude-js.git 25 | ``` 26 | 27 | ### run tests 28 | ```bash 29 | $ npm test 30 | ``` 31 | -------------------------------------------------------------------------------- /Str/breakStr.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/camelize.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (x) { 8 | return x.replace(/-(\w)/g, function (m) { 9 | return m[1].toUpperCase(); 10 | }); 11 | }; 12 | 13 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /Str/capitalize.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (x) { 8 | return x.charAt(0).toUpperCase() + x.slice(1); 9 | }; 10 | 11 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /Str/chars.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/contains.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (search, target) { 14 | return target && target.indexOf(search) > -1; 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Str/dasherize.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | exports["default"] = function (x) { 8 | return x.replace(/[A-Z]/g, function (m) { 9 | return "-" + m.toLowerCase(); 10 | }); 11 | }; 12 | 13 | module.exports = exports["default"]; -------------------------------------------------------------------------------- /Str/drop.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/dropWhile.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/empty.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _breakStr = require('./breakStr'); 10 | 11 | var _breakStr2 = _interopRequireDefault(_breakStr); 12 | 13 | var _camelize = require('./camelize'); 14 | 15 | var _camelize2 = _interopRequireDefault(_camelize); 16 | 17 | var _capitalize = require('./capitalize'); 18 | 19 | var _capitalize2 = _interopRequireDefault(_capitalize); 20 | 21 | var _chars = require('./chars'); 22 | 23 | var _chars2 = _interopRequireDefault(_chars); 24 | 25 | var _contains = require('./contains'); 26 | 27 | var _contains2 = _interopRequireDefault(_contains); 28 | 29 | var _dasherize = require('./dasherize'); 30 | 31 | var _dasherize2 = _interopRequireDefault(_dasherize); 32 | 33 | var _drop = require('./drop'); 34 | 35 | var _drop2 = _interopRequireDefault(_drop); 36 | 37 | var _dropWhile = require('./dropWhile'); 38 | 39 | var _dropWhile2 = _interopRequireDefault(_dropWhile); 40 | 41 | var _empty = require('./empty'); 42 | 43 | var _empty2 = _interopRequireDefault(_empty); 44 | 45 | var _join = require('./join'); 46 | 47 | var _join2 = _interopRequireDefault(_join); 48 | 49 | var _lines = require('./lines'); 50 | 51 | var _lines2 = _interopRequireDefault(_lines); 52 | 53 | var _padLeft = require('./padLeft'); 54 | 55 | var _padLeft2 = _interopRequireDefault(_padLeft); 56 | 57 | var _repeat = require('./repeat'); 58 | 59 | var _repeat2 = _interopRequireDefault(_repeat); 60 | 61 | var _reverse = require('./reverse'); 62 | 63 | var _reverse2 = _interopRequireDefault(_reverse); 64 | 65 | var _slice = require('./slice'); 66 | 67 | var _slice2 = _interopRequireDefault(_slice); 68 | 69 | var _span = require('./span'); 70 | 71 | var _span2 = _interopRequireDefault(_span); 72 | 73 | var _split = require('./split'); 74 | 75 | var _split2 = _interopRequireDefault(_split); 76 | 77 | var _splitAt = require('./splitAt'); 78 | 79 | var _splitAt2 = _interopRequireDefault(_splitAt); 80 | 81 | var _startsWith = require('./startsWith'); 82 | 83 | var _startsWith2 = _interopRequireDefault(_startsWith); 84 | 85 | var _take = require('./take'); 86 | 87 | var _take2 = _interopRequireDefault(_take); 88 | 89 | var _takeWhile = require('./takeWhile'); 90 | 91 | var _takeWhile2 = _interopRequireDefault(_takeWhile); 92 | 93 | var _unchars = require('./unchars'); 94 | 95 | var _unchars2 = _interopRequireDefault(_unchars); 96 | 97 | var _unlines = require('./unlines'); 98 | 99 | var _unlines2 = _interopRequireDefault(_unlines); 100 | 101 | var _unwords = require('./unwords'); 102 | 103 | var _unwords2 = _interopRequireDefault(_unwords); 104 | 105 | var _words = require('./words'); 106 | 107 | var _words2 = _interopRequireDefault(_words); 108 | 109 | exports['default'] = { 110 | breakStr: _breakStr2['default'], 111 | camelize: _camelize2['default'], 112 | capitalize: _capitalize2['default'], 113 | chars: _chars2['default'], 114 | contains: _contains2['default'], 115 | dasherize: _dasherize2['default'], 116 | drop: _drop2['default'], 117 | dropWhile: _dropWhile2['default'], 118 | empty: _empty2['default'], 119 | join: _join2['default'], 120 | lines: _lines2['default'], 121 | padLeft: _padLeft2['default'], 122 | repeat: _repeat2['default'], 123 | reverse: _reverse2['default'], 124 | slice: _slice2['default'], 125 | span: _span2['default'], 126 | split: _split2['default'], 127 | splitAt: _splitAt2['default'], 128 | startsWith: _startsWith2['default'], 129 | take: _take2['default'], 130 | takeWhile: _takeWhile2['default'], 131 | unchars: _unchars2['default'], 132 | unlines: _unlines2['default'], 133 | unwords: _unwords2['default'], 134 | words: _words2['default'] }; 135 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Str/join.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/lines.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/padLeft.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (p, s) { 14 | if (p === undefined) p = ''; 15 | return p.substring(0, p.length - (s || '').toString().length) + (s || ''); 16 | }); 17 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Str/repeat.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/reverse.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/slice.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/span.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/split.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (sep, str) { 14 | return str.split(sep); 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Str/splitAt.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/startsWith.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | exports['default'] = (0, _FuncCurry2['default'])(function (search, target) { 14 | return target && target.indexOf(search) === 0; 15 | }); 16 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Str/take.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _ListTake = require('../List/take'); 14 | 15 | var _ListTake2 = _interopRequireDefault(_ListTake); 16 | 17 | exports['default'] = (0, _FuncCurry2['default'])(function (n, x) { 18 | return x && (0, _ListTake2['default'])(n, x.split('')).join(''); 19 | }); 20 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Str/takeWhile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _FuncCurry = require('../Func/curry'); 10 | 11 | var _FuncCurry2 = _interopRequireDefault(_FuncCurry); 12 | 13 | var _ListTakeWhile = require('../List/takeWhile'); 14 | 15 | var _ListTakeWhile2 = _interopRequireDefault(_ListTakeWhile); 16 | 17 | exports['default'] = (0, _FuncCurry2['default'])(function (f, x) { 18 | return x && (0, _ListTakeWhile2['default'])(f, x.split('')).join(''); 19 | }); 20 | module.exports = exports['default']; -------------------------------------------------------------------------------- /Str/unchars.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/unlines.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/unwords.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /Str/words.js: -------------------------------------------------------------------------------- 1 | "use strict"; -------------------------------------------------------------------------------- /docs/FUNC.md: -------------------------------------------------------------------------------- 1 | # λ :: Func 2 | 3 | ## Func.curry 4 | 5 | ```haskell 6 | curry :: (a → b → c → ... → d) → a → b → c → ... → d 7 | ``` 8 | 9 | > Returns a curried version of the supplied function. 10 | 11 | ```javascript 12 | const add = curry((a, b) => a + b); 13 | const inc = add(1); 14 | 15 | inc(2); //=> 3 16 | ``` 17 | 18 | ## Func.apply 19 | 20 | ```haskell 21 | apply :: (a → b → c → ... → d) → [a, b, c, ...] → d 22 | ``` 23 | 24 | > Returns the application of the supplied list as arguments to the supplied function. 25 | 26 | ```javascript 27 | const sum = (a, b) => a + b; 28 | apply(sum, [2, 3]); //=> 5 29 | ``` 30 | 31 | ## Func.flip 32 | 33 | ```haskell 34 | flip :: (a → b → c) → (b → a → c) 35 | ``` 36 | 37 | > Returns a function with the arguments flipped. 38 | 39 | ```javascript 40 | const invertedPower = flip(Math.pow); 41 | invertedPower(2, 3); //=> 9 42 | ``` 43 | 44 | ## Func.fix 45 | 46 | ```haskell 47 | fix :: (Function → Function) → Function 48 | ``` 49 | 50 | > Fix-point function for anonymous recursion, implemented with the [Y combinator](https://en.wikipedia.org/wiki/Fixed-point_combinator#Y_combinator). 51 | 52 | ```javascript 53 | fix((fib) => (n) => n <= 1 54 | ? 1 55 | : fib(n - 1) + fib(n - 2))(9); //=> 55 56 | ``` 57 | 58 | ## Func.memoize 59 | 60 | ```haskell 61 | memoize :: Function → Function 62 | ``` 63 | 64 | > Caches computed results, speeding up later calls with the same arguments. 65 | 66 | ```javascript 67 | const memoF = memoize(expensiveFunction); 68 | memoF(2) // slow, but result is then cached 69 | memoF(2) // fast 70 | ``` 71 | 72 | ## Func.deny 73 | 74 | ```haskell 75 | deny :: Function → Function 76 | ``` 77 | 78 | > Denies the result of a predicate function 79 | 80 | ```javascript 81 | const gt2 = (x) => x > 2; 82 | const twoOrLess = deny(gt2); 83 | gt2(2); //=> false 84 | twoOrLess(2); //=> true 85 | ``` 86 | 87 | ## Func.compose 88 | 89 | ```haskell 90 | compose :: ((y → z), (x → y), …, (o → p), ((a, b, …, n) → o)) → (a → b → … → n → z) 91 | ``` 92 | 93 | > Performs right-to-left function composition. The rightmost function may have any arity; the remaining functions must be unary. 94 | 95 | ```javascript 96 | const plus1 = (x) => x + 1; 97 | const negate = (x) => -x; 98 | const complex = compose(plus1, negate, Math.pow); 99 | 100 | complex(3, 2) === plus1(negate(Math.pow(3, 2))); 101 | ``` 102 | -------------------------------------------------------------------------------- /docs/LIST.md: -------------------------------------------------------------------------------- 1 | # λ :: List 2 | 3 | ## List.each 4 | 5 | ```haskell 6 | each :: (a → Undefined) → [a] → [a] 7 | ``` 8 | 9 | > Applies a function to each item in the list and returns the original list. Used for side effects. 10 | 11 | ```javascript 12 | each((x) => x.push('boom'), [['a'], ['b'], ['c']]); 13 | //=> [['a', 'boom'], ['b', 'boom'], ['c', 'boom']] 14 | ``` 15 | 16 | ## List.map 17 | 18 | ```haskell 19 | map :: (a → b) → [a] → [b] 20 | ``` 21 | 22 | > Applies a function to each item in the list, and produces a new list with the results. The length of the result is the same length as the input. 23 | 24 | ```javascript 25 | map((x) => x + 1, [1, 2, 3]); 26 | //=> [2, 3, 4] 27 | ``` 28 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Preλude-js :: Docs 2 | 3 | ## Modules 4 | 5 | 6 | * [Func](FUNC.md) 7 | * [apply](FUNC.md#funcapply) 8 | * [compose](FUNC.md#funccompose) 9 | * [curry](FUNC.md#funccurry) 10 | * [deny](FUNC.md#funcdeny) 11 | * [fix](FUNC.md#funcfix) 12 | * [flip](FUNC.md#funcflip) 13 | * [memoize](FUNC.md#funcmemoize) 14 | * [General](GENERAL.md) 15 | * [aresimilar](GENERAL.md#generalaresimilar) 16 | * [deny](GENERAL.md#generaldeny) 17 | * [equals](GENERAL.md#generalequals) 18 | * [id](GENERAL.md#generalid) 19 | * [oftype](GENERAL.md#generaloftype) 20 | * [replicate](GENERAL.md#generalreplicate) 21 | * [typeof](GENERAL.md#generaltypeof) 22 | * [List](LIST.md) 23 | * [all](LIST.md#listall) 24 | * [and](LIST.md#listand) 25 | * [any](LIST.md#listany) 26 | * [at](LIST.md#listat) 27 | * [breaklist](LIST.md#listbreaklist) 28 | * [compact](LIST.md#listcompact) 29 | * [concat](LIST.md#listconcat) 30 | * [concatmap](LIST.md#listconcatmap) 31 | * [countby](LIST.md#listcountby) 32 | * [difference](LIST.md#listdifference) 33 | * [drop](LIST.md#listdrop) 34 | * [dropwhile](LIST.md#listdropwhile) 35 | * [each](LIST.md#listeach) 36 | * [elemindex](LIST.md#listelemindex) 37 | * [elemindices](LIST.md#listelemindices) 38 | * [empty](LIST.md#listempty) 39 | * [filter](LIST.md#listfilter) 40 | * [find](LIST.md#listfind) 41 | * [findindex](LIST.md#listfindindex) 42 | * [findindices](LIST.md#listfindindices) 43 | * [first](LIST.md#listfirst) 44 | * [flatten](LIST.md#listflatten) 45 | * [fold](LIST.md#listfold) 46 | * [fold1](LIST.md#listfold1) 47 | * [foldl](LIST.md#listfoldl) 48 | * [foldl1](LIST.md#listfoldl1) 49 | * [foldr](LIST.md#listfoldr) 50 | * [foldr1](LIST.md#listfoldr1) 51 | * [groupby](LIST.md#listgroupby) 52 | * [head](LIST.md#listhead) 53 | * [initial](LIST.md#listinitial) 54 | * [intersection](LIST.md#listintersection) 55 | * [last](LIST.md#listlast) 56 | * [map](LIST.md#listmap) 57 | * [maximum](LIST.md#listmaximum) 58 | * [maximumby](LIST.md#listmaximumby) 59 | * [mean](LIST.md#listmean) 60 | * [minimum](LIST.md#listminimum) 61 | * [minimumby](LIST.md#listminimumby) 62 | * [or](LIST.md#listor) 63 | * [partition](LIST.md#listpartition) 64 | * [product](LIST.md#listproduct) 65 | * [range](LIST.md#listrange) 66 | * [reduce](LIST.md#listreduce) 67 | * [reject](LIST.md#listreject) 68 | * [reverse](LIST.md#listreverse) 69 | * [scan](LIST.md#listscan) 70 | * [scan1](LIST.md#listscan1) 71 | * [scanl](LIST.md#listscanl) 72 | * [scanl1](LIST.md#listscanl1) 73 | * [scanr](LIST.md#listscanr) 74 | * [scanr1](LIST.md#listscanr1) 75 | * [slice](LIST.md#listslice) 76 | * [sort](LIST.md#listsort) 77 | * [sortby](LIST.md#listsortby) 78 | * [sortwith](LIST.md#listsortwith) 79 | * [span](LIST.md#listspan) 80 | * [splitat](LIST.md#listsplitat) 81 | * [sum](LIST.md#listsum) 82 | * [tail](LIST.md#listtail) 83 | * [take](LIST.md#listtake) 84 | * [takewhile](LIST.md#listtakewhile) 85 | * [unfoldr](LIST.md#listunfoldr) 86 | * [union](LIST.md#listunion) 87 | * [unique](LIST.md#listunique) 88 | * [uniqueby](LIST.md#listuniqueby) 89 | * [zip](LIST.md#listzip) 90 | * [zipall](LIST.md#listzipall) 91 | * [zipallwith](LIST.md#listzipallwith) 92 | * [zipwith](LIST.md#listzipwith) 93 | * [Num](NUM.md) 94 | * [add](NUM.md#numadd) 95 | * [Obj](OBJ.md) 96 | * [clone](OBJ.md#objclone) 97 | * [get](OBJ.md#objget) 98 | * [keys](OBJ.md#objkeys) 99 | * [map](OBJ.md#objmap) 100 | * [merge](OBJ.md#objmerge) 101 | * [objtopairs](OBJ.md#objobjtopairs) 102 | * [pairstoobj](OBJ.md#objpairstoobj) 103 | * [reduce](OBJ.md#objreduce) 104 | * [values](OBJ.md#objvalues) 105 | * [Str](STR.md) 106 | * [breakstr](STR.md#strbreakstr) 107 | * [camelize](STR.md#strcamelize) 108 | * [capitalize](STR.md#strcapitalize) 109 | * [chars](STR.md#strchars) 110 | * [contains](STR.md#strcontains) 111 | * [dasherize](STR.md#strdasherize) 112 | * [drop](STR.md#strdrop) 113 | * [dropwhile](STR.md#strdropwhile) 114 | * [empty](STR.md#strempty) 115 | * [join](STR.md#strjoin) 116 | * [lines](STR.md#strlines) 117 | * [padleft](STR.md#strpadleft) 118 | * [repeat](STR.md#strrepeat) 119 | * [reverse](STR.md#strreverse) 120 | * [slice](STR.md#strslice) 121 | * [span](STR.md#strspan) 122 | * [split](STR.md#strsplit) 123 | * [splitat](STR.md#strsplitat) 124 | * [startswith](STR.md#strstartswith) 125 | * [take](STR.md#strtake) 126 | * [takewhile](STR.md#strtakewhile) 127 | * [unchars](STR.md#strunchars) 128 | * [unlines](STR.md#strunlines) 129 | * [unwords](STR.md#strunwords) 130 | * [words](STR.md#strwords) 131 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, '__esModule', { 4 | value: true 5 | }); 6 | 7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 8 | 9 | var _Func = require('./Func'); 10 | 11 | var _Func2 = _interopRequireDefault(_Func); 12 | 13 | var _General = require('./General'); 14 | 15 | var _General2 = _interopRequireDefault(_General); 16 | 17 | var _List = require('./List'); 18 | 19 | var _List2 = _interopRequireDefault(_List); 20 | 21 | var _Num = require('./Num'); 22 | 23 | var _Num2 = _interopRequireDefault(_Num); 24 | 25 | var _Obj = require('./Obj'); 26 | 27 | var _Obj2 = _interopRequireDefault(_Obj); 28 | 29 | var _Str = require('./Str'); 30 | 31 | var _Str2 = _interopRequireDefault(_Str); 32 | 33 | exports['default'] = { 34 | Func: _Func2['default'], 35 | General: _General2['default'], 36 | List: _List2['default'], 37 | Num: _Num2['default'], 38 | Obj: _Obj2['default'], 39 | Str: _Str2['default'] 40 | }; 41 | module.exports = exports['default']; 42 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alanrsoares/prelude-js/c2be6b7f9359f3bb0bd46481b5377872589e329e/logo.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "preludejs", 3 | "version": "0.4.2", 4 | "description": "A modular implementation of Haskell's Prelude library in ES6", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "start": "mocha test --compilers js:babel/register --watch", 9 | "test": "mocha test --compilers js:babel/register", 10 | "cover": "istanbul cover _mocha -- --compilers js:babel/register -R spec && cat ./coverage/coverage.json | codecov", 11 | "dist": "scripts/dist", 12 | "release": "scripts/release", 13 | "docs": "scripts/build-docs", 14 | "lint": "standard src/* test/* --global describe --global it" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/alanrsoares/prelude-js.git" 19 | }, 20 | "keywords": [ 21 | "prelude", 22 | "functional", 23 | "js", 24 | "es6", 25 | "haskell", 26 | "lodash", 27 | "underscore" 28 | ], 29 | "author": "github.com/alanrsoares", 30 | "license": "MIT", 31 | "bugs": { 32 | "url": "https://github.com/alanrsoares/prelude-js/issues" 33 | }, 34 | "homepage": "https://github.com/alanrsoares/prelude-js#readme", 35 | "devDependencies": { 36 | "babel": "^5.8.38", 37 | "babel-core": "^5.8.38", 38 | "babel-eslint": "^5.0.4", 39 | "chai": "^4.3.6", 40 | "codecov.io": "^0.1.6", 41 | "deep-freeze": "0.0.1", 42 | "istanbul": "^0.4.5", 43 | "minimist": "^1.2.7", 44 | "mocha": "^2.5.3", 45 | "releasy": "^1.13.1", 46 | "standard": "^17.0.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /scripts/build-docs: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm -f docs/README.md 4 | babel-node scripts/build-readme.js > docs/README.md 5 | -------------------------------------------------------------------------------- /scripts/build-index.js: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import minimist from "minimist"; 3 | 4 | const ARGS = minimist(process.argv.slice(2)); 5 | const MODULE_PATH = `./src/${ARGS.module}`; 6 | const fns = fs 7 | .readdirSync(MODULE_PATH) 8 | .map((i) => i.replace(/(.+)\.js$/, "$1")) 9 | .filter((fn) => fn !== "index"); 10 | 11 | const imports = fns.map((fn) => `import ${fn} from './${fn}'`).join(";\n"); 12 | 13 | const file = `${imports};\n 14 | export default { 15 | ${fns.join(",\n ")} 16 | };\n`; 17 | 18 | console.log(file); 19 | -------------------------------------------------------------------------------- /scripts/build-module: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | module=$1 3 | index=src/$module/index.js 4 | babel-node scripts/build-index --module=$module > $index 5 | -------------------------------------------------------------------------------- /scripts/build-readme.js: -------------------------------------------------------------------------------- 1 | import { readdirSync } from "fs"; 2 | 3 | const moduleNames = readdirSync("./src").filter((fn) => fn !== "index.js"); 4 | 5 | const low = (x) => x.toLowerCase(); 6 | const up = (x) => x.toUpperCase(); 7 | 8 | function functions(m) { 9 | return readdirSync(`./src/${m}`) 10 | .filter((f) => !/index/.test(f)) 11 | .map((f) => f.replace(/(.+)\.js$/, "$1")) 12 | .map((f) => `\n\t* [${low(f)}](${up(m)}.md#${low(m + f)})`) 13 | .join(""); 14 | } 15 | 16 | const modules = moduleNames.map( 17 | (m) => `\n* [${m}](${up(m)}.md)${functions(m)}` 18 | ); 19 | 20 | const file = `# Preλude-js :: Docs\n 21 | ## Modules\n 22 | ${modules.join("")}`; 23 | 24 | console.log(file); 25 | -------------------------------------------------------------------------------- /scripts/dist: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # clear index 4 | rm -f ./index.js 5 | babel ./src/index.js -o ./index.js 6 | 7 | modules=`ls ./src | grep -v js` 8 | length=`echo $modules | wc -w | tr -d '[[:space:]]'` 9 | processed=1 10 | 11 | for module in $modules 12 | do 13 | rm -rf $module && mkdir $module 14 | 15 | echo "[$processed/$length] building module '$module'" 16 | babel "./src/$module/" --no-comments -qd "./$module/" 17 | 18 | processed=$[processed + 1] 19 | done 20 | -------------------------------------------------------------------------------- /scripts/new-func: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | module=$1 3 | func=$2 4 | 5 | touch src/$module/$func.js 6 | -------------------------------------------------------------------------------- /scripts/release: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | releasy=./node_modules/.bin/releasy 3 | type=$1 #[ major | minor | patch (default) ] 4 | npm run dist 5 | git add . && git commit -am "build dist" 6 | $releasy $type -qsf bower.json --stable --no-tag --no-push 7 | $releasy $type -s --stable 8 | npm publish 9 | -------------------------------------------------------------------------------- /src/Func/apply.js: -------------------------------------------------------------------------------- 1 | import curry from './curry' 2 | 3 | // + apply :: ([a] -> b?, [a]) -> b? 4 | export default curry((fn, args) => fn.apply(null, args)) 5 | -------------------------------------------------------------------------------- /src/Func/compose.js: -------------------------------------------------------------------------------- 1 | import initial from '../List/initial' 2 | import last from '../List/last' 3 | 4 | // + compose :: (b -> c) -> (a -> b) -> a -> c 5 | export default (...fs) => (...args) => 6 | initial(fs).reduceRight( 7 | (acc, f) => f.call(this, acc), 8 | last(fs).apply(this, args) 9 | ) 10 | -------------------------------------------------------------------------------- /src/Func/curry.js: -------------------------------------------------------------------------------- 1 | // :: ((a, b) -> c) -> a -> b -> c 2 | export default function (fn, ...args) { 3 | const c = (fnArgs) => { 4 | if (fnArgs.length >= fn.length) { 5 | return fn.apply(this, fnArgs) 6 | } 7 | return (...cArgs) => c([...fnArgs, ...cArgs]) 8 | } 9 | return c(args) 10 | } 11 | -------------------------------------------------------------------------------- /src/Func/deny.js: -------------------------------------------------------------------------------- 1 | // + deny :: (a -> b) -> !(a -> b) 2 | export default (fn) => (...args) => !fn(...args) 3 | -------------------------------------------------------------------------------- /src/Func/fix.js: -------------------------------------------------------------------------------- 1 | // + fix :: Function -> Function 2 | export default (f) => ((g) => (...args) => f(g(g)).apply(null, args))( 3 | (g) => (...args) => f(g(g)).apply(null, args) 4 | ) 5 | -------------------------------------------------------------------------------- /src/Func/flip.js: -------------------------------------------------------------------------------- 1 | import curry from './curry' 2 | 3 | // + flip :: (a -> b -> c) -> b -> a -> c 4 | export default curry((fn, x, y) => fn(y, x)) 5 | -------------------------------------------------------------------------------- /src/Func/index.js: -------------------------------------------------------------------------------- 1 | import apply from './apply' 2 | import compose from './compose' 3 | import curry from './curry' 4 | import deny from './deny' 5 | import fix from './fix' 6 | import flip from './flip' 7 | import memoize from './memoize' 8 | 9 | export default { 10 | apply, 11 | compose, 12 | curry, 13 | deny, 14 | fix, 15 | flip, 16 | memoize 17 | } 18 | -------------------------------------------------------------------------------- /src/Func/memoize.js: -------------------------------------------------------------------------------- 1 | // + memoize :: (a -> b) -> a -> b 2 | export default (fn) => { 3 | const memo = {} 4 | return (...args) => { 5 | const key = args.map((arg) => arg + typeof arg).join('') 6 | return (key in memo) ? memo[key] : (memo[key] = fn(...args)) 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/General/areSimilar.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import fix from '../Func/fix' 3 | import keys from '../Obj/keys' 4 | import get from '../Obj/get' 5 | import typeOf from './typeOf' 6 | import equals from './equals' 7 | 8 | // + areSimilar :: a -> a -> Boolean 9 | export default fix((areSimilar) => curry((a, b) => { 10 | if (!equals(...[a, b].map(typeOf))) { 11 | return false 12 | } 13 | 14 | switch (typeOf(a)) { 15 | case 'Array': 16 | return equals(...[a, b].map(get('length'))) && 17 | keys(a).reduce((acc, k) => acc && areSimilar((a[k]), (b[k])), true) 18 | case 'Object': 19 | return equals(...[a, b].map(keys).map(get('length'))) && 20 | keys(a).reduce((acc, k) => acc && areSimilar(a[k], b[k]), true) 21 | case 'Function': 22 | return equals(a.toString(), b.toString()) 23 | default: 24 | return equals(a, b) 25 | } 26 | })) 27 | -------------------------------------------------------------------------------- /src/General/deny.js: -------------------------------------------------------------------------------- 1 | // + deny :: a -> a 2 | export default (x) => !x 3 | -------------------------------------------------------------------------------- /src/General/equals.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + equals :: a -> a -> Boolean 4 | export default curry((a, b) => a === b) 5 | -------------------------------------------------------------------------------- /src/General/id.js: -------------------------------------------------------------------------------- 1 | // :: a -> a 2 | export const id = (x) => x 3 | 4 | export default id 5 | -------------------------------------------------------------------------------- /src/General/index.js: -------------------------------------------------------------------------------- 1 | import areSimilar from './areSimilar' 2 | import deny from './deny' 3 | import equals from './equals' 4 | import id from './id' 5 | import ofType from './ofType' 6 | import replicate from './replicate' 7 | import typeOf from './typeOf' 8 | 9 | export default { 10 | areSimilar, 11 | deny, 12 | equals, 13 | id, 14 | ofType, 15 | replicate, 16 | typeOf 17 | } 18 | -------------------------------------------------------------------------------- /src/General/ofType.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import typeOf from './typeOf' 3 | import equals from './equals' 4 | 5 | // + ofType :: (String, a) -> Boolean 6 | export default curry((type, x) => equals(type, typeOf(x))) 7 | -------------------------------------------------------------------------------- /src/General/replicate.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import range from '../List/range' 3 | 4 | // + replicate :: (Number, b) -> [b] 5 | export const replicate = curry((n, x) => range(n).map(() => x)) 6 | 7 | export default replicate 8 | -------------------------------------------------------------------------------- /src/General/typeOf.js: -------------------------------------------------------------------------------- 1 | // + typeOf :: Any -> String 2 | export default (x) => ({}).toString 3 | .call(x) 4 | .match(/\[object (\w+)\]/)[1] 5 | -------------------------------------------------------------------------------- /src/List/all.js: -------------------------------------------------------------------------------- 1 | import deny from '../Func/deny' 2 | import any from './any' 3 | 4 | // + all :: (a -> Boolean) -> [a] -> Boolean 5 | export default deny(any) 6 | -------------------------------------------------------------------------------- /src/List/and.js: -------------------------------------------------------------------------------- 1 | import reduce from './reduce' 2 | 3 | // + and :: [a] -> Boolean 4 | export default reduce((acc, x) => acc && !!x, true) 5 | -------------------------------------------------------------------------------- /src/List/any.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + any :: (a -> Boolean) -> [a] -> Boolean 4 | export default curry((fn, xs) => xs.some(fn)) 5 | -------------------------------------------------------------------------------- /src/List/at.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/breakList.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/compact.js: -------------------------------------------------------------------------------- 1 | import filter from './filter' 2 | import id from '../General/id' 3 | 4 | // + filter :: [a] -> [a] 5 | export default filter(id) 6 | -------------------------------------------------------------------------------- /src/List/concat.js: -------------------------------------------------------------------------------- 1 | // + concat :: [[a]] -> [a] 2 | export default (xss) => [].concat.apply([], xss) 3 | -------------------------------------------------------------------------------- /src/List/concatMap.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import concat from './concat' 3 | import map from './map' 4 | 5 | // + concatMap :: (a -> [b]) -> [a] -> [b] 6 | export default curry((fn, xs) => concat(map(fn, xs))) 7 | -------------------------------------------------------------------------------- /src/List/countBy.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + countBy :: (a -> b) -> [a] -> { b: Number } 4 | export default curry((fn, xs) => xs.reduce((acc, x) => { 5 | const key = fn(x) 6 | acc[key] = acc[key] ? acc[key] + 1 : 1 7 | return acc 8 | }, {})) 9 | -------------------------------------------------------------------------------- /src/List/difference.js: -------------------------------------------------------------------------------- 1 | import find from './find' 2 | 3 | // + difference :: ([a], [a], ...) -> [a] 4 | export default (xs, ...yss) => xs.filter((x) => !yss.some(find((y) => y === x))) 5 | -------------------------------------------------------------------------------- /src/List/drop.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + drop :: Number -> [a] -> [a] 4 | export default curry((n, xs) => xs && xs.filter((x, i) => i >= n)) 5 | -------------------------------------------------------------------------------- /src/List/dropWhile.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + dropWhile :: (a -> Bool) -> [x] -> [x] 4 | export default curry((f, xs) => { 5 | for (const x in xs) { 6 | if (f(xs[x])) continue 7 | else return xs.slice(x) 8 | } 9 | return [] 10 | }) 11 | -------------------------------------------------------------------------------- /src/List/each.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + each :: (a -> b) -> [a] -> void 4 | export default curry((fn, xs) => xs.forEach(fn)) 5 | -------------------------------------------------------------------------------- /src/List/elemIndex.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/elemIndices.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/empty.js: -------------------------------------------------------------------------------- 1 | // :: [a] -> Boolean 2 | export default (xs) => !xs.length 3 | -------------------------------------------------------------------------------- /src/List/filter.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + filter :: (a -> Boolean) -> [a] -> [a] 4 | export default curry((fn, xs) => xs.filter(fn)) 5 | -------------------------------------------------------------------------------- /src/List/find.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import fix from '../Func/fix' 3 | 4 | // + find :: (a -> Boolean) -> [a] -> a 5 | export default fix((find) => curry((fn, [x, ...xs]) => x 6 | ? fn(x) ? x : find(fn, xs) 7 | : undefined 8 | )) 9 | -------------------------------------------------------------------------------- /src/List/findIndex.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/findIndices.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/first.js: -------------------------------------------------------------------------------- 1 | import head from './head' 2 | 3 | export default head 4 | -------------------------------------------------------------------------------- /src/List/flatten.js: -------------------------------------------------------------------------------- 1 | import ofType from '../General/ofType' 2 | import concatMap from './concatMap' 3 | 4 | // + flatten :: List -> List 5 | const flatten = (ys) => concatMap((xs) => ofType('Array', xs) ? flatten(xs) : xs, ys) 6 | 7 | export default flatten 8 | -------------------------------------------------------------------------------- /src/List/fold.js: -------------------------------------------------------------------------------- 1 | import foldl from './foldl' 2 | 3 | export default foldl 4 | -------------------------------------------------------------------------------- /src/List/fold1.js: -------------------------------------------------------------------------------- 1 | import foldl1 from './foldl1' 2 | 3 | export default foldl1 4 | -------------------------------------------------------------------------------- /src/List/foldl.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + foldl :: (b -> a -> b) -> b -> [a] -> b 4 | export default curry((fn, acc, xs) => xs.reduce(fn, acc)) 5 | -------------------------------------------------------------------------------- /src/List/foldl1.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import fold from './fold' 3 | import head from './head' 4 | import tail from './tail' 5 | 6 | // + foldl1 :: (a -> a -> a) -> [a] -> a 7 | export default curry((fn, xs) => fold(fn, head(xs), tail(xs))) 8 | -------------------------------------------------------------------------------- /src/List/foldr.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + foldr :: (b -> a -> b) -> b -> [a] -> b 4 | export default curry((fn, acc, xs) => { 5 | for (let i = xs.length - 1; i >= 0; i--) { 6 | acc = fn(xs[i], acc) 7 | } 8 | return acc 9 | }) 10 | -------------------------------------------------------------------------------- /src/List/foldr1.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import foldr from './foldr' 3 | import last from './last' 4 | import initial from './initial' 5 | 6 | // + foldr1 :: (a -> a -> a) -> [a] -> a 7 | export default curry((fn, xs) => foldr(fn, last(xs), initial(xs))) 8 | -------------------------------------------------------------------------------- /src/List/groupBy.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + groupBy :: (a -> b) -> [a] -> { b: [b] } 4 | export default curry((fn, xs) => xs.reduce((acc, x) => { 5 | const key = fn(x) 6 | acc[key] = acc[key] ? acc[key].concat([x]) : [x] 7 | return acc 8 | }, {})) 9 | -------------------------------------------------------------------------------- /src/List/head.js: -------------------------------------------------------------------------------- 1 | // + head :: [a] -> a 2 | export default (xs) => xs[0] 3 | -------------------------------------------------------------------------------- /src/List/index.js: -------------------------------------------------------------------------------- 1 | import all from './all' 2 | import and from './and' 3 | import any from './any' 4 | import at from './at' 5 | import breakList from './breakList' 6 | import compact from './compact' 7 | import concat from './concat' 8 | import concatMap from './concatMap' 9 | import countBy from './countBy' 10 | import difference from './difference' 11 | import drop from './drop' 12 | import dropWhile from './dropWhile' 13 | import each from './each' 14 | import elemIndex from './elemIndex' 15 | import elemIndices from './elemIndices' 16 | import empty from './empty' 17 | import filter from './filter' 18 | import find from './find' 19 | import findIndex from './findIndex' 20 | import findIndices from './findIndices' 21 | import first from './first' 22 | import flatten from './flatten' 23 | import fold from './fold' 24 | import fold1 from './fold1' 25 | import foldl from './foldl' 26 | import foldl1 from './foldl1' 27 | import foldr from './foldr' 28 | import foldr1 from './foldr1' 29 | import groupBy from './groupBy' 30 | import head from './head' 31 | import initial from './initial' 32 | import intersection from './intersection' 33 | import last from './last' 34 | import map from './map' 35 | import maximum from './maximum' 36 | import maximumBy from './maximumBy' 37 | import mean from './mean' 38 | import minimum from './minimum' 39 | import minimumBy from './minimumBy' 40 | import or from './or' 41 | import partition from './partition' 42 | import product from './product' 43 | import range from './range' 44 | import reduce from './reduce' 45 | import reject from './reject' 46 | import reverse from './reverse' 47 | import scan from './scan' 48 | import scan1 from './scan1' 49 | import scanl from './scanl' 50 | import scanl1 from './scanl1' 51 | import scanr from './scanr' 52 | import scanr1 from './scanr1' 53 | import slice from './slice' 54 | import sort from './sort' 55 | import sortBy from './sortBy' 56 | import sortWith from './sortWith' 57 | import span from './span' 58 | import splitAt from './splitAt' 59 | import sum from './sum' 60 | import tail from './tail' 61 | import take from './take' 62 | import takeWhile from './takeWhile' 63 | import unfoldr from './unfoldr' 64 | import union from './union' 65 | import unique from './unique' 66 | import uniqueBy from './uniqueBy' 67 | import zip from './zip' 68 | import zipAll from './zipAll' 69 | import zipAllWith from './zipAllWith' 70 | import zipWith from './zipWith' 71 | 72 | export default { 73 | all, 74 | and, 75 | any, 76 | at, 77 | breakList, 78 | compact, 79 | concat, 80 | concatMap, 81 | countBy, 82 | difference, 83 | drop, 84 | dropWhile, 85 | each, 86 | elemIndex, 87 | elemIndices, 88 | empty, 89 | filter, 90 | find, 91 | findIndex, 92 | findIndices, 93 | first, 94 | flatten, 95 | fold, 96 | fold1, 97 | foldl, 98 | foldl1, 99 | foldr, 100 | foldr1, 101 | groupBy, 102 | head, 103 | initial, 104 | intersection, 105 | last, 106 | map, 107 | maximum, 108 | maximumBy, 109 | mean, 110 | minimum, 111 | minimumBy, 112 | or, 113 | partition, 114 | product, 115 | range, 116 | reduce, 117 | reject, 118 | reverse, 119 | scan, 120 | scan1, 121 | scanl, 122 | scanl1, 123 | scanr, 124 | scanr1, 125 | slice, 126 | sort, 127 | sortBy, 128 | sortWith, 129 | span, 130 | splitAt, 131 | sum, 132 | tail, 133 | take, 134 | takeWhile, 135 | unfoldr, 136 | union, 137 | unique, 138 | uniqueBy, 139 | zip, 140 | zipAll, 141 | zipAllWith, 142 | zipWith 143 | } 144 | -------------------------------------------------------------------------------- /src/List/initial.js: -------------------------------------------------------------------------------- 1 | // + initial :: [a] -> [a] 2 | export default (xs) => !xs.length ? undefined : xs.slice(0, -1) 3 | -------------------------------------------------------------------------------- /src/List/intersection.js: -------------------------------------------------------------------------------- 1 | import find from './find' 2 | 3 | // + intersection :: ([a], [a], ...) -> [a] 4 | export default (xs, ...yss) => xs.filter((x) => yss.some(find((y) => y === x))) 5 | -------------------------------------------------------------------------------- /src/List/last.js: -------------------------------------------------------------------------------- 1 | // + last :: [a] -> a 2 | export default (xs) => xs.slice(-1)[0] 3 | -------------------------------------------------------------------------------- /src/List/map.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + map :: (a -> b) -> [a] -> [b] 4 | export default curry((fn, xs) => xs.map(fn)) 5 | -------------------------------------------------------------------------------- /src/List/maximum.js: -------------------------------------------------------------------------------- 1 | import maximumBy from './maximumBy' 2 | import id from '../General/id' 3 | 4 | // + maximum :: [Number] -> Number 5 | export default maximumBy(id) 6 | -------------------------------------------------------------------------------- /src/List/maximumBy.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + maximunBy :: (a -> b) -> [a] -> b 4 | export default curry((fn, xs) => xs.reduceRight((max, x) => fn(x) > fn(max) ? x : max)) 5 | -------------------------------------------------------------------------------- /src/List/mean.js: -------------------------------------------------------------------------------- 1 | import sum from './sum' 2 | 3 | // + mean :: [Number] -> Number 4 | export default (xs) => sum(xs) / xs.length 5 | -------------------------------------------------------------------------------- /src/List/minimum.js: -------------------------------------------------------------------------------- 1 | import minimumBy from './minimumBy' 2 | import id from '../General/id' 3 | 4 | // + minimum :: [Number] -> Number 5 | export default minimumBy(id) 6 | -------------------------------------------------------------------------------- /src/List/minimumBy.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + minimumBy :: (a -> b) -> [a] -> b 4 | export default curry((fn, xs) => xs.reduceRight((min, x) => fn(x) < fn(min) ? x : min)) 5 | -------------------------------------------------------------------------------- /src/List/or.js: -------------------------------------------------------------------------------- 1 | import reduce from './reduce' 2 | 3 | // + or :: [a] -> Boolean 4 | export default reduce((acc, x) => acc || !!x, false) 5 | -------------------------------------------------------------------------------- /src/List/partition.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + partition :: (a -> Boolean) -> [a] -> [[a] [a]] 4 | export default curry((fn, xs) => { 5 | const passed = [] 6 | const failed = [] 7 | xs.forEach((x) => (fn(x) ? passed : failed).push(x)) 8 | return [passed, failed] 9 | }) 10 | -------------------------------------------------------------------------------- /src/List/product.js: -------------------------------------------------------------------------------- 1 | // + product :: [Number] -> Number 2 | export default (xs) => xs.reduceRight((x, y) => x * y) 3 | -------------------------------------------------------------------------------- /src/List/range.js: -------------------------------------------------------------------------------- 1 | // + range :: (Number, Number?, Number?) -> [Number] 2 | export default (to, from = 1, step = 1) => { 3 | const result = [] 4 | for (let i = from; i <= to; i += step) { 5 | result.push(i) 6 | } 7 | return result 8 | } 9 | -------------------------------------------------------------------------------- /src/List/reduce.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + reduce :: ((a, b) -> a) -> [b] -> a 4 | export default curry((fn, initial, xs) => xs.reduce(fn, initial)) 5 | -------------------------------------------------------------------------------- /src/List/reject.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import deny from '../Func/deny' 3 | 4 | // + reject :: (a -> Boolean) -> [a] -> [a] 5 | export default curry((fn, xs) => xs.filter(deny(fn))) 6 | -------------------------------------------------------------------------------- /src/List/reverse.js: -------------------------------------------------------------------------------- 1 | // + reverse :: [a] -> [a] 2 | export default (xs) => xs.concat().reverse() 3 | -------------------------------------------------------------------------------- /src/List/scan.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import last from '../List/last' 3 | 4 | // + scan :: (a -> b) -> [a] -> [b] 5 | export default curry((fn, init, xs) => xs.reduce((acc, x) => acc.concat(fn(last(acc), x)), [init])) 6 | -------------------------------------------------------------------------------- /src/List/scan1.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import scan from './scan' 3 | import head from './head' 4 | import tail from './tail' 5 | 6 | export default curry((fn, xs) => !xs.length ? undefined : scan(fn, head(xs), tail(xs))) 7 | -------------------------------------------------------------------------------- /src/List/scanl.js: -------------------------------------------------------------------------------- 1 | import scan from './scan' 2 | 3 | export default scan 4 | -------------------------------------------------------------------------------- /src/List/scanl1.js: -------------------------------------------------------------------------------- 1 | import scan1 from './scan1' 2 | 3 | export default scan1 4 | -------------------------------------------------------------------------------- /src/List/scanr.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import scan from '../List/scan' 3 | import reverse from '../List/reverse' 4 | 5 | // + scanr :: (a → b → b) → b → [a] → [b] 6 | export default curry((fn, init, xs) => reverse(scan(fn, init, reverse(xs)))) 7 | -------------------------------------------------------------------------------- /src/List/scanr1.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import scanr from './scanr' 3 | import last from './last' 4 | import initial from './initial' 5 | 6 | export default curry((fn, xs) => !xs.length ? undefined : scanr(fn, last(xs), initial(xs))) 7 | -------------------------------------------------------------------------------- /src/List/slice.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + slice :: Number -> Number -> [a] -> [a] 4 | export default curry((x, y, xs) => xs.slice(x, y)) 5 | -------------------------------------------------------------------------------- /src/List/sort.js: -------------------------------------------------------------------------------- 1 | // + sort :: List -> List 2 | export default (xs) => xs.concat().sort() 3 | -------------------------------------------------------------------------------- /src/List/sortBy.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // sortBy :: (a -> b) -> [a] -> [a] 4 | export default curry((fn, xs) => xs.concat() 5 | .sort((x, y) => fn(x) > fn(y) 6 | ? 1 7 | : fn(x) < fn(y) 8 | ? -1 9 | : 0 10 | )) 11 | -------------------------------------------------------------------------------- /src/List/sortWith.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + sortWith :: (a -> Number) -> [a] -> [a] 4 | export default curry((fn, xs) => xs.concat().sort(fn)) 5 | -------------------------------------------------------------------------------- /src/List/span.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import takeWhile from './takeWhile' 3 | import dropWhile from './dropWhile' 4 | 5 | // + span :: (a -> Bool) -> [a] -> [[a], [a]] 6 | export default curry((f, xs) => [takeWhile(f, xs), dropWhile(f, xs)]) 7 | -------------------------------------------------------------------------------- /src/List/splitAt.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/sum.js: -------------------------------------------------------------------------------- 1 | import add from '../Num/add' 2 | 3 | // + sum :: [Number] -> Number 4 | export default (xs) => xs.reduceRight(add) 5 | -------------------------------------------------------------------------------- /src/List/tail.js: -------------------------------------------------------------------------------- 1 | // + tail :: [a] -> [a] 2 | export default ([x, ...xs]) => xs 3 | -------------------------------------------------------------------------------- /src/List/take.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + take :: Number -> [a] -> [a] 4 | export default curry((n, xs) => xs && xs.filter((x, i) => i < n)) 5 | -------------------------------------------------------------------------------- /src/List/takeWhile.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + takeWhile :: (a -> Bool) -> [a] -> [a] 4 | export default curry((f, xs) => { 5 | for (const x in xs) { 6 | if (f(xs[x])) continue 7 | else return xs.slice(0, x) 8 | } 9 | return xs 10 | }) 11 | -------------------------------------------------------------------------------- /src/List/unfoldr.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // :: (a -> [b]) -> [a] -> [b] 4 | export default curry((fn, b) => { 5 | const result = [] 6 | 7 | let that 8 | while ((that = fn(b))) { 9 | result.push(that[0]) 10 | } 11 | return result 12 | }) 13 | -------------------------------------------------------------------------------- /src/List/union.js: -------------------------------------------------------------------------------- 1 | import unique from './unique' 2 | import flatten from './flatten' 3 | 4 | // + union :: ([a], [a], ...) -> [a] 5 | export default (xs, ...yss) => unique(xs.concat(flatten(yss))) 6 | -------------------------------------------------------------------------------- /src/List/unique.js: -------------------------------------------------------------------------------- 1 | import uniqueBy from './uniqueBy' 2 | import id from '../General/id' 3 | 4 | // + unique :: [a] -> [a] 5 | export default (xs) => uniqueBy(id, xs) 6 | -------------------------------------------------------------------------------- /src/List/uniqueBy.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import merge from '../Obj/merge' 3 | import values from '../Obj/values' 4 | 5 | // + uniqueBy :: (a -> b) -> [a] -> [a] 6 | export default curry((fn, xs) => { 7 | const reducer = (acc, x) => merge(acc, { [`K_${x}`]: x }) 8 | return values(xs.map(fn).reduce(reducer, {})) 9 | }) 10 | -------------------------------------------------------------------------------- /src/List/zip.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | export default curry((xs, ys) => xs.reduce((acc, x, i) => i === ys.length ? acc : acc.concat([[x, ys[i]]]), []) 4 | ) 5 | -------------------------------------------------------------------------------- /src/List/zipAll.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/zipAllWith.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/List/zipWith.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + zipWith :: 4 | export default curry((f, xs, ys) => xs.reduce((acc, x, i) => i === ys.length ? acc : acc.concat([f(x, ys[i])]), []) 5 | ) 6 | -------------------------------------------------------------------------------- /src/Num/add.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + add :: Number -> Number -> Number 4 | export default curry((a, b) => a + b) 5 | -------------------------------------------------------------------------------- /src/Num/index.js: -------------------------------------------------------------------------------- 1 | import add from './add' 2 | 3 | export default { add } 4 | -------------------------------------------------------------------------------- /src/Obj/clone.js: -------------------------------------------------------------------------------- 1 | // + clone :: a -> a' 2 | export default (x) => JSON.parse(JSON.stringify(x)) 3 | -------------------------------------------------------------------------------- /src/Obj/get.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | export default curry((member, x) => x[member]) 4 | -------------------------------------------------------------------------------- /src/Obj/index.js: -------------------------------------------------------------------------------- 1 | import clone from './clone' 2 | import get from './get' 3 | import keys from './keys' 4 | import map from './map' 5 | import merge from './merge' 6 | import objToPairs from './objToPairs' 7 | import pairsToObj from './pairsToObj' 8 | import reduce from './reduce' 9 | import values from './values' 10 | 11 | export default { 12 | clone, 13 | get, 14 | keys, 15 | map, 16 | merge, 17 | objToPairs, 18 | pairsToObj, 19 | reduce, 20 | values 21 | } 22 | -------------------------------------------------------------------------------- /src/Obj/keys.js: -------------------------------------------------------------------------------- 1 | // + keys :: {a: b} -> [a] 2 | export default Object.keys 3 | -------------------------------------------------------------------------------- /src/Obj/map.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import keys from './keys' 3 | 4 | // + map :: ((a, b) -> c) -> {a: b} -> [c] 5 | export default curry((fn, x) => keys(x).map((k, i) => fn(k, x[k], i))) 6 | -------------------------------------------------------------------------------- /src/Obj/merge.js: -------------------------------------------------------------------------------- 1 | import reduce from './reduce' 2 | 3 | const reducer = reduce((acc, key, value) => { 4 | acc[key] = value 5 | return acc 6 | }) 7 | 8 | // + merge :: {a: b} -> {a: b} -> {a: b} 9 | export default Object.assign || ((y, ...xs) => xs.reduce(reducer, y)) 10 | -------------------------------------------------------------------------------- /src/Obj/objToPairs.js: -------------------------------------------------------------------------------- 1 | import map from './map' 2 | 3 | // + objToPairs :: {a: b} -> [[a, b]] 4 | export default map((k, v) => [k, v]) 5 | -------------------------------------------------------------------------------- /src/Obj/pairsToObj.js: -------------------------------------------------------------------------------- 1 | // + pairsToObj :: [[a, b]] -> {a: b} 2 | export default (xs) => xs.reduce((acc, x) => { 3 | acc[x[0]] = x[1] 4 | return acc 5 | }, {}) 6 | -------------------------------------------------------------------------------- /src/Obj/reduce.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import keys from './keys' 3 | 4 | // + reduce :: (a -> b) -> a -> b -> a 5 | export default curry((fn, initial, x) => keys(x).reduce((acc, k, i) => fn(acc, k, x[k], i, x), initial)) 6 | -------------------------------------------------------------------------------- /src/Obj/values.js: -------------------------------------------------------------------------------- 1 | import keys from './keys' 2 | 3 | // :: {a: b} -> [b] 4 | export default Object.values || ((x) => keys(x).map((k) => x[k])) 5 | -------------------------------------------------------------------------------- /src/Str/breakStr.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/camelize.js: -------------------------------------------------------------------------------- 1 | // + camelize :: String → String 2 | export default (x) => x.replace(/-(\w)/g, (m) => m[1].toUpperCase()) 3 | -------------------------------------------------------------------------------- /src/Str/capitalize.js: -------------------------------------------------------------------------------- 1 | // + capitalize :: String -> string 2 | export default (x) => x.charAt(0).toUpperCase() + x.slice(1) 3 | -------------------------------------------------------------------------------- /src/Str/chars.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/contains.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + contains :: String -> String -> Bool 4 | export default curry((search, target) => target && target.indexOf(search) > -1) 5 | -------------------------------------------------------------------------------- /src/Str/dasherize.js: -------------------------------------------------------------------------------- 1 | // + dasherize :: String → String 2 | export default (x) => x.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`) 3 | -------------------------------------------------------------------------------- /src/Str/drop.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/dropWhile.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/empty.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/index.js: -------------------------------------------------------------------------------- 1 | import breakStr from './breakStr' 2 | import camelize from './camelize' 3 | import capitalize from './capitalize' 4 | import chars from './chars' 5 | import contains from './contains' 6 | import dasherize from './dasherize' 7 | import drop from './drop' 8 | import dropWhile from './dropWhile' 9 | import empty from './empty' 10 | import join from './join' 11 | import lines from './lines' 12 | import padLeft from './padLeft' 13 | import repeat from './repeat' 14 | import reverse from './reverse' 15 | import slice from './slice' 16 | import span from './span' 17 | import split from './split' 18 | import splitAt from './splitAt' 19 | import startsWith from './startsWith' 20 | import take from './take' 21 | import takeWhile from './takeWhile' 22 | import unchars from './unchars' 23 | import unlines from './unlines' 24 | import unwords from './unwords' 25 | import words from './words' 26 | 27 | export default { 28 | breakStr, 29 | camelize, 30 | capitalize, 31 | chars, 32 | contains, 33 | dasherize, 34 | drop, 35 | dropWhile, 36 | empty, 37 | join, 38 | lines, 39 | padLeft, 40 | repeat, 41 | reverse, 42 | slice, 43 | span, 44 | split, 45 | splitAt, 46 | startsWith, 47 | take, 48 | takeWhile, 49 | unchars, 50 | unlines, 51 | unwords, 52 | words 53 | } 54 | -------------------------------------------------------------------------------- /src/Str/join.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/lines.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/padLeft.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + padLeft :: String -> a -> String 4 | export default curry((p = '', s) => p.substring(0, p.length - (s || '').toString().length) + (s || '')) 5 | -------------------------------------------------------------------------------- /src/Str/repeat.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/reverse.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/slice.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/span.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/split.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + split :: String -> String -> String[] 4 | export default curry((sep, str) => str.split(sep)) 5 | -------------------------------------------------------------------------------- /src/Str/splitAt.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/startsWith.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | 3 | // + startsWith :: String -> String -> Bool 4 | export default curry((search, target) => target && target.indexOf(search) === 0) 5 | -------------------------------------------------------------------------------- /src/Str/take.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import take from '../List/take' 3 | 4 | // + take :: Number -> String -> String 5 | export default curry((n, x) => x && take(n, x.split('')).join('')) 6 | -------------------------------------------------------------------------------- /src/Str/takeWhile.js: -------------------------------------------------------------------------------- 1 | import curry from '../Func/curry' 2 | import takeWhile from '../List/takeWhile' 3 | 4 | // + take :: Number -> String -> String 5 | export default curry((f, x) => x && takeWhile(f, x.split('')).join('')) 6 | -------------------------------------------------------------------------------- /src/Str/unchars.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/unlines.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/unwords.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/Str/words.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import Func from './Func' 2 | import General from './General' 3 | import List from './List' 4 | import Num from './Num' 5 | import Obj from './Obj' 6 | import Str from './Str' 7 | 8 | export default { 9 | Func, 10 | General, 11 | List, 12 | Num, 13 | Obj, 14 | Str 15 | } 16 | -------------------------------------------------------------------------------- /test/Func.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import * as Func from '../src/Func' 3 | 4 | describe('Func.js', () => { 5 | describe('Func.curry', () => { 6 | it('Should allow partial application of a function', () => { 7 | const sum = Func.curry((a, b) => a + b) 8 | const increment = sum(1) 9 | expect(sum(1, 2)).to.equal(3) 10 | expect(sum(3)(2)).to.equal(5) 11 | expect(increment(1)).to.equal(2) 12 | }) 13 | }) 14 | 15 | describe('Func.apply', () => { 16 | it('Should return the application of the supplied list as arguments to the supplied function', () => { 17 | const sum = Func.curry((a, b) => a + b) 18 | const sumAll = (...xs) => xs.reduce(sum) 19 | expect(Func.apply(sum, [2, 3])).to.equal(5) 20 | expect(Func.apply(sumAll, [1, 2, 3, 4, 5])).to.equal(15) 21 | }) 22 | }) 23 | 24 | describe('Func.fix', () => { 25 | it('Should run a recursive-ready inline function', () => { 26 | const fiftyFive = Func.fix( 27 | (fib) => (n) => n <= 1 ? 1 : fib(n - 1) + fib(n - 2) 28 | )(9) 29 | expect(fiftyFive).to.equal(55) 30 | }) 31 | }) 32 | 33 | describe('Func.flip', () => { 34 | it('Should return a function with the arguments flipped', () => { 35 | const subtract = (a, b) => a - b 36 | const invertedSubtract = Func.flip(subtract) 37 | const invertedPower = Func.flip(Math.pow) 38 | expect(subtract(2, 5)).to.equal(-3) 39 | expect(invertedSubtract(2, 5)).to.equal(3) 40 | expect(invertedPower(2, 5)).to.equal(25) 41 | }) 42 | }) 43 | 44 | describe('Func.memoize', () => { 45 | it('Should call a memoized function only once', () => { 46 | let called = 0 47 | const length = (x) => ++called && x.length 48 | const memoLength = Func.memoize(length) 49 | const cases = ['foo', 'bar', 'baz', 'buzz'] 50 | 51 | cases.forEach((word, k) => { 52 | for (let i = 0; i <= k; i++) { 53 | memoLength(word) 54 | } 55 | }) 56 | 57 | expect(called).to.equal(cases.length) 58 | }) 59 | }) 60 | 61 | describe('Func.compose', () => { 62 | it('Should compose multiple functions into one', () => { 63 | const plus1 = (x) => x + 1 64 | const negate = (x) => -x 65 | const complex = Func.compose(plus1, negate, Math.pow) 66 | 67 | expect(complex(3, 2)).to.equal(plus1(negate(Math.pow(3, 2)))) 68 | }) 69 | }) 70 | 71 | describe('Func.deny', () => { 72 | it('Should deny the result of a function', () => { 73 | const gt2 = (x) => x > 2 74 | const twoOrLess = Func.deny(gt2) 75 | expect(gt2(2)).to.equal(false) 76 | expect(twoOrLess(2)).to.equal(true) 77 | }) 78 | }) 79 | }) 80 | -------------------------------------------------------------------------------- /test/General.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import General from '../src/General' 3 | 4 | describe('General.js', () => { 5 | describe('General.deny', () => { 6 | it('Should return the negation of its own argument value', () => { 7 | expect(General.deny(0)).to.equal(true) 8 | expect(General.deny(null)).to.equal(true) 9 | expect(General.deny(undefined)).to.equal(true) 10 | expect(General.deny(1)).to.equal(false) 11 | expect(General.deny(true)).to.equal(false) 12 | }) 13 | }) 14 | 15 | describe('General.id', () => { 16 | it('Should return its own argument value', () => { 17 | expect(General.id({})).to.deep.equal({}) 18 | expect(General.id('foo')).to.equal('foo') 19 | expect(General.id(0)).to.equal(0) 20 | expect(General.id(null)).to.equal(null) 21 | expect(General.id(undefined)).to.equal(undefined) 22 | }) 23 | }) 24 | 25 | describe('General.replicate', () => { 26 | it('Should return a new list with a sequence of the second argument with the first argument length', () => { 27 | expect(General.replicate(3, 'a')).to.deep.equal(['a', 'a', 'a']) 28 | expect(General.replicate(0, 'foo')).to.deep.equal([]) 29 | expect(General.replicate(2, 0)).to.deep.equal([0, 0]) 30 | expect(General.replicate(3, null)).to.deep.equal([null, null, null]) 31 | expect(General.replicate(1, undefined)).to.deep.equal([undefined]) 32 | }) 33 | }) 34 | 35 | describe('General.ofType', () => { 36 | it('Should assert wether a value is of a given type', () => { 37 | expect(General.ofType('String', 'a')).to.deep.equal(true) 38 | expect(General.ofType('Array', [])).to.deep.equal(true) 39 | expect(General.ofType('Function', () => { 40 | })).to.deep.equal(true) 41 | expect(General.ofType('Number', 0)).to.deep.equal(true) 42 | expect(General.ofType('Number', NaN)).to.deep.equal(true) 43 | }) 44 | }) 45 | 46 | describe('General.areSimilar', () => { 47 | it('Should tell wether two items are similar, regardless of order of properties', () => { 48 | expect(General.areSimilar([1, 2, 3], [1, 2, 3])).to.equal(true) 49 | expect(General.areSimilar({ foo: 'bar' }, { foo: 'bar' })).to.equal(true) 50 | expect(General.areSimilar({ foo: 'bar' }, { foo: 'baz' })).to.equal(false) 51 | expect(General.areSimilar({}, {})).to.equal(true) 52 | expect(General.areSimilar({ a: General.areSimilar }, { a: General.areSimilar })).to.equal(true) 53 | expect(General.areSimilar({ a: { b: [] } }, { a: { b: {} } })).to.equal(false) 54 | expect(General.areSimilar({ a: { b: [2] } }, { a: { b: [2] } })).to.equal(true) 55 | expect(General.areSimilar({ a: { b: [1, '{}'] } }, { a: { b: [1, '{}'] } })).to.equal(true) 56 | expect(General.areSimilar({ a: { b: [1, '{}'] } }, { a: { b: [1, '{}'] } })).to.equal(true) 57 | expect(General.areSimilar({ a: { b: [1, '{}', [3, '4', ['98']]] } })({ a: { b: [[['98'], 3, '4'], '{}', 1] } })).to.equal(false) 58 | expect(General.areSimilar(null, 1)).to.equal(false) 59 | expect(General.areSimilar([1], null)).to.equal(false) 60 | expect(General.areSimilar({}, null)).to.equal(false) 61 | expect(General.areSimilar(undefined, null)).to.equal(false) 62 | expect(General.areSimilar(null, null)).to.equal(true) 63 | expect(General.areSimilar(undefined, undefined)).to.equal(true) 64 | }) 65 | }) 66 | }) 67 | -------------------------------------------------------------------------------- /test/List.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import * as List from '../src/List' 3 | import { get } from '../src/Obj' 4 | import { id } from '../src/General' 5 | import { Case, run } from './cases' 6 | 7 | describe('List.js', () => { 8 | describe('List.range', () => { 9 | it('Should return a list of numbers according to the given boundaries', () => { 10 | expect(List.range(0)).to.deep.equal([]) 11 | expect(List.range(1)).to.deep.equal([1]) 12 | expect(List.range(3)).to.deep.equal([1, 2, 3]) 13 | expect(List.range(10, 8)).to.deep.equal([8, 9, 10]) 14 | expect(List.range(100, 50).length).to.equal(51) 15 | }) 16 | }) 17 | 18 | describe('List.each', () => { 19 | it('Should apply a function to each item in a list, not returning any value', () => { 20 | const input = [1, 2, 3, 4, 5] 21 | const output = [] 22 | const expected = [2, 3, 4, 5, 6] 23 | 24 | List.each((x) => output.push(++x), input) 25 | expect(output).to.deep.equal(expected) 26 | }) 27 | }) 28 | 29 | describe('List.map', () => { 30 | it('Should apply a function to each item in a list, returning a new list with the result', () => { 31 | run(List.map, 32 | Case([(x) => ++x, [1, 2, 3, 4, 5]], [2, 3, 4, 5, 6]), 33 | Case([(x) => --x, [2, 3, 4, 5, 6]], [1, 2, 3, 4, 5]), 34 | Case([(x) => x * 2, [1, 2, 3, 4, 5]], [2, 4, 6, 8, 10]) 35 | ) 36 | }) 37 | }) 38 | 39 | describe('List.compact', () => { 40 | it('Should return a list of truthy values in a list', () => { 41 | const input = [0, true, 1, 2, false, 4, 5] 42 | const expected = [true, 1, 2, 4, 5] 43 | 44 | expect(List.compact(input)).to.deep.equal(expected) 45 | }) 46 | }) 47 | 48 | describe('List.filter', () => { 49 | it('Should return the values in a list that satisfy a given predicate', () => { 50 | const input = [0, 1, 2, 3, 4, 5] 51 | const expected = [4, 5] 52 | 53 | expect(List.filter((x) => x > 3, input)).to.deep.equal(expected) 54 | }) 55 | }) 56 | 57 | describe('List.reject', () => { 58 | it("Should return the values in a list that doesn't satisfy the given predicate", () => { 59 | const input = [0, true, 1, 2, false, 4, 5] 60 | const expected = [0, false] 61 | 62 | expect(List.reject((x) => x, input)).to.deep.equal(expected) 63 | }) 64 | }) 65 | 66 | describe('List.partition', () => { 67 | it('Should return a list with two lists containing the passed and failed values given a predicate', () => { 68 | const input = [0, true, 1, 2, false, 4, 5] 69 | 70 | expect(List.partition((x) => x, input)).to.deep.equal([[true, 1, 2, 4, 5], [0, false]]) 71 | }) 72 | }) 73 | 74 | describe('List.find', () => { 75 | const input = [1, 2, 3, 4, 5] 76 | 77 | it('Should return the exact value in a list that satisfies a given predicate', () => { 78 | expect(List.find((x) => x === 4, input)).to.equal(4) 79 | }) 80 | it('Should return the first value in a list that satisfies an ambiguous predicate', () => { 81 | expect(List.find((x) => x > 2, input)).to.equal(3) 82 | }) 83 | it('Should return undefined when no value in a list satisfies a given predicate', () => { 84 | expect(List.find((x) => x === 12, input)).to.equal(undefined) 85 | }) 86 | }) 87 | 88 | describe('List.head', () => { 89 | const input = [1, 2, 3, 4, 5] 90 | 91 | it('Should return the first value in a list', () => { 92 | expect(List.head(input)).to.equal(1) 93 | }) 94 | }) 95 | 96 | describe('List.first (alias => List.head)', () => { 97 | const input = [1, 2, 3, 4, 5] 98 | 99 | it('Should return the first value in a list', () => { 100 | expect(List.first(input)).to.equal(1) 101 | }) 102 | }) 103 | 104 | describe('List.tail', () => { 105 | const input = [1, 2, 3, 4, 5] 106 | 107 | it('Should return all but the first value in a list', () => { 108 | expect(List.tail(input)).to.deep.equal([2, 3, 4, 5]) 109 | }) 110 | }) 111 | 112 | describe('List.last', () => { 113 | const input = [1, 2, 3, 4, 5] 114 | 115 | it('Should return the last value in a list', () => { 116 | expect(List.last(input)).to.equal(5) 117 | }) 118 | }) 119 | 120 | describe('List.initial', () => { 121 | const input = [1, 2, 3, 4, 5] 122 | 123 | it('Should return all but the last value in a list', () => { 124 | expect(List.initial(input)).to.deep.equal([1, 2, 3, 4]) 125 | }) 126 | }) 127 | 128 | describe('List.empty', () => { 129 | it('Should return true for an empty list', () => { 130 | expect(List.empty([])).to.equal(true) 131 | }) 132 | it('Should return false for an non-empty list', () => { 133 | expect(List.empty([1, 2, 3])).to.equal(false) 134 | }) 135 | }) 136 | 137 | describe('List.reverse', () => { 138 | const input = [1, 2, 0, 5, 4, 3] 139 | 140 | it('Should return the items in a list in a reversed order', () => { 141 | expect(List.reverse(input)).to.deep.equal([3, 4, 5, 0, 2, 1]) 142 | }) 143 | }) 144 | 145 | describe('List.uniqueBy', () => { 146 | it('Should find the unique items in a list given a predicate', () => { 147 | const input = [ 148 | { color: 'orange' }, 149 | { color: 'green' }, 150 | { color: 'orange' }, 151 | { color: 'blue' }, 152 | { color: 'green' }, 153 | { color: 'orange' } 154 | ] 155 | 156 | expect(List.uniqueBy((x) => x.color, input)).to.deep.equal(['orange', 'green', 'blue']) 157 | }) 158 | }) 159 | 160 | describe('List.unique', () => { 161 | it('Should find the unique items in a list', () => { 162 | const input = [1, 2, 3, 2, 2, 1, 3, 2, 0, 9] 163 | 164 | expect(List.unique(input)).to.deep.equal([1, 2, 3, 0, 9]) 165 | }) 166 | }) 167 | 168 | describe('List.foldl', () => { 169 | it('Should calculate the sum of items in a list', () => { 170 | const input = [1, 2, 3, 4, 5, 6, 7, 8, 9] 171 | 172 | expect(List.foldl((x, y) => x + y, 0, input)).to.equal(45) 173 | expect(List.fold((x, y) => x + y, 0, input)).to.equal(45) 174 | }) 175 | }) 176 | 177 | describe('List.foldl1', () => { 178 | it('Should calculate the number of items in a list', () => { 179 | const input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 180 | 181 | expect(List.foldl1((x) => x + 1, input)).to.equal(10) 182 | expect(List.fold1((x) => x + 1, input)).to.equal(10) 183 | }) 184 | }) 185 | 186 | describe('List.foldr', () => { 187 | it('Should concatenate the letters with the initial value', () => { 188 | const input = ['h', 'e', 'l', 'l'] 189 | 190 | expect(List.foldr((x, y) => x + y, 'o')(input)).to.equal('hello') 191 | }) 192 | }) 193 | 194 | describe('List.foldr1', () => { 195 | it('Should calculate the number of items in a list', () => { 196 | const input = [1, 2, 3, 4, 9] 197 | 198 | expect(List.foldr1((x, y) => x - y, input)).to.equal(7) 199 | }) 200 | }) 201 | 202 | describe('List.concat', () => { 203 | it('Should concatenate a list of lists into one list', () => { 204 | const input = [[1, 2], [3], [4, 5]] 205 | 206 | expect(List.concat(input)).to.deep.equal([1, 2, 3, 4, 5]) 207 | }) 208 | }) 209 | 210 | describe('List.concatMap', () => { 211 | it('Should concatenate a list of lists generated by a function, into one list', () => { 212 | const input = [1, 2, 3] 213 | 214 | expect(List.concatMap((x) => [`${x}`, x], input)).to.deep.equal(['1', 1, '2', 2, '3', 3]) 215 | expect(List.concatMap((x) => [x, x], input)).to.deep.equal([1, 1, 2, 2, 3, 3]) 216 | }) 217 | }) 218 | 219 | describe('List.flatten', () => { 220 | it('Should flatten a list', () => { 221 | const input = [1, [[2], 3], [4, [[5]]]] 222 | 223 | expect(List.flatten(input)).to.deep.equal([1, 2, 3, 4, 5]) 224 | }) 225 | }) 226 | 227 | describe('List.difference', () => { 228 | it('Should calculate the difference between lists', () => { 229 | expect(List.difference([1, 2, 3, 4], [1], [4])).to.deep.equal([2, 3]) 230 | expect(List.difference([1, 2, 3], [2, 1, 3], [3, 1, 2])).to.deep.equal([]) 231 | expect(List.difference([1, 2, 3], [101, 2, 1, 10], [2, 1], [-1, 0, 1, 2])).to.deep.equal([3]) 232 | expect(List.difference([1, 2, 3, 4, 5], [5, 2, 10], [9])).to.deep.equal([1, 3, 4]) 233 | }) 234 | }) 235 | 236 | describe('List.intersection', () => { 237 | it('Should calculate the intersection between lists', () => { 238 | expect(List.intersection([1, 2, 3], [2, 1, 3], [3, 1, 2])).to.deep.equal([1, 2, 3]) 239 | expect(List.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1], [-1, 0, 1, 2])).to.deep.equal([1, 2]) 240 | expect(List.intersection([2, 3], [9, 8], [12, 1], [99])).to.deep.equal([]) 241 | }) 242 | }) 243 | 244 | describe('List.union', () => { 245 | const cases = [ 246 | { input: [[1, 2, 3, 4], [2, 4, 5], [9], []], expected: [1, 2, 3, 4, 5, 9] }, 247 | { input: [[1, 5, 7], [3, 5], []], expected: [1, 5, 7, 3] } 248 | ] 249 | 250 | it('Should calculate the union between lists', () => { 251 | cases.forEach(({ input, expected }) => { 252 | expect(List.union(...input)).to.deep.equal(expected) 253 | }) 254 | }) 255 | }) 256 | 257 | describe('List.countBy', () => { 258 | const cases = [ 259 | { input: [4.2, 4.4, 9.8], predicate: Math.floor, expected: { 4: 2, 9: 1 } }, 260 | { input: ['foo', 'bar', 'burp'], predicate: get('length'), expected: { 3: 2, 4: 1 } }, 261 | { input: [-3, 1, 2, 3, 4, 5], predicate: (x) => x > 2, expected: { true: 3, false: 3 } } 262 | ] 263 | 264 | it('Should count the occurences by a given predicate', () => { 265 | cases.forEach(({ input, predicate, expected }) => { 266 | expect(List.countBy(predicate, input)).to.deep.equal(expected) 267 | }) 268 | }) 269 | }) 270 | 271 | describe('List.groupBy', () => { 272 | it('Should group the matching results by a given predicate', () => { 273 | expect(List.groupBy(Math.floor, [4.2, 4.4, 9.8])).to.deep.equal({ 4: [4.2, 4.4], 9: [9.8] }) 274 | expect(List.groupBy(get('length'), ['one', 'two', 'three'])).to.deep.equal({ 3: ['one', 'two'], 5: ['three'] }) 275 | expect(List.groupBy((x) => x > 2, [-3, 1, 2, 3, 4, 5])).to.deep.equal({ true: [3, 4, 5], false: [-3, 1, 2] }) 276 | }) 277 | }) 278 | 279 | describe('List.and', () => { 280 | it('Should return false if any item in the list is false, otherwise returns true', () => { 281 | const neither = (xs, y) => List.and(xs.map(x => x !== y)) 282 | expect(neither([1, 2], 2)).to.equal(false) 283 | expect(neither([1, 2], 3)).to.equal(true) 284 | expect(List.and([1, 2, 3])).to.equal(true) 285 | expect(List.and([3, 2, false])).to.equal(false) 286 | }) 287 | }) 288 | 289 | describe('List.or', () => { 290 | it('Should return true if any item in the list is true, otherwise returns false', () => { 291 | const either = (xs, y) => List.or(xs.map(x => x === y)) 292 | expect(either([1, 2], 2)).to.equal(true) 293 | expect(either([1, 2], 3)).to.equal(false) 294 | expect(List.or([1, 2, 3])).to.deep.equal(true) 295 | expect(List.or([0, '', null, false])).to.equal(false) 296 | }) 297 | }) 298 | 299 | describe('List.any', () => { 300 | it('Should return true true on the first item that satisfies the predicate', () => { 301 | expect(List.any((x) => x > 2, [1, 2, 3])).to.equal(true) 302 | expect(List.any((x) => x.length > 3, ['foo', 'bar', 'buzz'])).to.deep.equal(true) 303 | expect(List.any((x) => x.length < 3, ['foo', 'bar', 'buzz'])).to.deep.equal(false) 304 | }) 305 | }) 306 | 307 | describe('List.all', () => { 308 | it('Should return true true on the first item that does not satisfy the predicate', () => { 309 | expect(List.all((x) => x, [1, 2, 3])).to.equal(false) 310 | expect(List.all((x) => x.length > 3, ['foo', 'bar', 'buzz'])).to.equal(false) 311 | }) 312 | }) 313 | 314 | describe('List.sort', () => { 315 | it('Sorts a list without modifying the input.', () => { 316 | expect(List.sort([1, 3, 2])).to.deep.equal([1, 2, 3]) 317 | expect(List.sort([1, 3, 2, 0])).to.deep.equal([0, 1, 2, 3]) 318 | }) 319 | }) 320 | 321 | describe('List.sortWith', () => { 322 | it('Should sort a list with a custom binary predicate.', () => { 323 | const sorter = (x, y) => x.length > y.length ? 1 : x.length < y.length ? -1 : 0 324 | expect(List.sortWith(sorter, ['three', 'one', 'two'])).to.deep.equal(['one', 'two', 'three']) 325 | }) 326 | }) 327 | 328 | describe('List.sortBy', () => { 329 | it('Should sort a list with a custom property-accessor predicate.', () => { 330 | expect(List.sortBy(get('length'), ['three', 'one', 'two'])).to.deep.equal(['one', 'two', 'three']) 331 | }) 332 | }) 333 | 334 | describe('List.sum', () => { 335 | it('Should return the sum of a list of numbers.', () => { 336 | expect(List.sum([1, 2, 3, 4, 5])).to.equal(15) 337 | }) 338 | }) 339 | 340 | describe('List.product', () => { 341 | it('Should return the product of all items in a list of numbers.', () => { 342 | expect(List.product([1, 2, 3])).to.equal(6) 343 | }) 344 | }) 345 | 346 | describe('List.mean', () => { 347 | it('Should return the mean/average of all items in a list of numbers.', () => { 348 | expect(List.mean([1, 2, 3, 4, 5])).to.equal(3) 349 | }) 350 | }) 351 | 352 | describe('List.maximum', () => { 353 | it('Should return the maximum value of all items in a list of comparables.', () => { 354 | expect(List.maximum([1, 2, 3, 4, 5])).to.equal(5) 355 | expect(List.maximum([-1, -2, -3, -4, -5])).to.equal(-1) 356 | expect(List.maximum(['1', '3', '2'])).to.equal('3') 357 | expect(List.maximum(['a', 'c', 'b'])).to.equal('c') 358 | expect(List.maximum(['w', 'c', 'b'])).to.equal('w') 359 | }) 360 | }) 361 | 362 | describe('List.minimum', () => { 363 | it('Should return the minimum value of all items in a list of comparables.', () => { 364 | expect(List.minimum([1, 2, 3, 4, 5])).to.equal(1) 365 | expect(List.minimum([-1, -2, -3, -4, -5])).to.equal(-5) 366 | expect(List.minimum(['1', '3', '2'])).to.equal('1') 367 | expect(List.minimum(['a', 'c', 'b'])).to.equal('a') 368 | expect(List.minimum(['w', 'c', 'b'])).to.equal('b') 369 | }) 370 | }) 371 | 372 | describe('List.maximumBy', () => { 373 | it('Should return the item with the maximum value resulting from applying a predicate.', () => { 374 | expect(List.maximumBy(x => x, [1, 2, 3, 4, 5])).to.equal(5) 375 | expect(List.maximumBy(x => x, [-1, -2, -3, -4, -5])).to.equal(-1) 376 | expect(List.maximumBy(x => x, ['1', '3', '2'])).to.equal('3') 377 | expect(List.maximumBy(x => x, ['a', 'c', 'b'])).to.equal('c') 378 | expect(List.maximumBy(x => x, ['w', 'c', 'b'])).to.equal('w') 379 | }) 380 | }) 381 | 382 | describe('List.minimumBy', () => { 383 | it('Should return the item with the minimum value resulting from applying a predicate.', () => { 384 | expect(List.minimumBy(x => x, [1, 2, 3, 4, 5])).to.equal(1) 385 | expect(List.minimumBy(x => x, [-1, -2, -3, -4, -5])).to.equal(-5) 386 | expect(List.minimumBy(x => x, ['1', '3', '2'])).to.equal('1') 387 | expect(List.minimumBy(x => x, ['a', 'c', 'b'])).to.equal('a') 388 | expect(List.minimumBy(x => x, ['w', 'c', 'b'])).to.equal('b') 389 | expect(List.minimumBy(get('length'), ['was', 'a', 'test'])).to.equal('a') 390 | }) 391 | }) 392 | 393 | describe('List.scan', () => { 394 | it('Should return a list composed of the initial value, the intermediate values, and then the final value.', () => { 395 | const sum = (a, b) => a + b 396 | const mult = (a, b) => a * b 397 | 398 | expect(List.scan(sum, 0, [1, 2, 3])).to.deep.equal([0, 1, 3, 6]) 399 | expect(List.scan(mult, 1, [2, 3, 4])).to.deep.equal([1, 2, 6, 24]) 400 | expect(List.scanl(sum, 0, [1, 2, 3])).to.deep.equal([0, 1, 3, 6]) 401 | expect(List.scanl(mult, 1, [2, 3, 4])).to.deep.equal([1, 2, 6, 24]) 402 | }) 403 | }) 404 | 405 | describe('List.scan1', () => { 406 | it('Should return a list composed of the initial value, the intermediate values, and then the final value.', () => { 407 | const sum = (a, b) => a + b 408 | const mult = (a, b) => a * b 409 | 410 | expect(List.scan1(sum, [1, 2, 3])).to.deep.equal([1, 3, 6]) 411 | expect(List.scan1(mult, [1, 2, 3])).to.deep.equal([1, 2, 6]) 412 | expect(List.scan1(mult, [])).to.deep.equal(undefined) 413 | expect(List.scanl1(sum, [1, 2, 3])).to.deep.equal([1, 3, 6]) 414 | expect(List.scanl1(mult, [1, 2, 3])).to.deep.equal([1, 2, 6]) 415 | expect(List.scanl1(mult, [])).to.deep.equal(undefined) 416 | }) 417 | }) 418 | 419 | describe('List.take', () => { 420 | it('Should take the first n elements of a list', () => { 421 | const input = [2, 3, 5, 8, 1, 0, 9] 422 | 423 | expect(List.take(2, input)).to.deep.equal([2, 3]) 424 | expect(List.take(3, input)).to.deep.equal([2, 3, 5]) 425 | expect(List.take(1, input)).to.deep.equal([2]) 426 | expect(List.take(0, input)).to.deep.equal([]) 427 | expect(List.take(null, input)).to.deep.equal([]) 428 | expect(List.take(4, input)).to.deep.equal([2, 3, 5, 8]) 429 | }) 430 | }) 431 | 432 | describe('List.takeWhile', () => { 433 | it('Should take the first n elements that satisfy the given predicate', () => { 434 | const input = [2, 3, 5, 8, 1, 0, 9] 435 | 436 | expect(List.takeWhile((n) => n <= 3, input)).to.deep.equal([2, 3]) 437 | }) 438 | }) 439 | 440 | describe('List.drop', () => { 441 | it('Should drop the first n elements of a list', () => { 442 | const input = [2, 3, 5, 8, 1, 0, 9] 443 | 444 | expect(List.drop(2, input)).to.deep.equal([5, 8, 1, 0, 9]) 445 | expect(List.drop(3, input)).to.deep.equal([8, 1, 0, 9]) 446 | expect(List.drop(1, input)).to.deep.equal([3, 5, 8, 1, 0, 9]) 447 | expect(List.drop(0, input)).to.deep.equal(input) 448 | expect(List.drop(null, input)).to.deep.equal(input) 449 | expect(List.drop(4, input)).to.deep.equal([1, 0, 9]) 450 | }) 451 | }) 452 | 453 | describe('List.dropWhile', () => { 454 | it('Should drop the first n elements that satisfy the given predicate', () => { 455 | const input = [2, 3, 5, 8, 1, 0, 9] 456 | 457 | expect(List.dropWhile((n) => n <= 3, input)).to.deep.equal([5, 8, 1, 0, 9]) 458 | }) 459 | }) 460 | 461 | describe('List.zip', () => { 462 | it('Should zip together its two arguments into a list of lists. ', () => { 463 | run(List.zip, 464 | Case([[], []], []), 465 | Case([[1, 2], [4, 5]], [[1, 4], [2, 5]]), 466 | Case([[1, 2], [4, 5, 6]], [[1, 4], [2, 5]]), 467 | Case([[1, 2, 3], [4, 5]], [[1, 4], [2, 5]]) 468 | ) 469 | expect(List.zip([1, 2, 3])([4, 5])).to.deep.equal([[1, 4], [2, 5]]) 470 | }) 471 | }) 472 | 473 | describe('List.zipWith', () => { 474 | const sum = (a, b) => a + b 475 | 476 | it('Should zipWith together its two arguments into a list of lists. ', () => { 477 | run(List.zipWith, 478 | Case([id, [], []], []), 479 | Case([sum, [1, 2, 3], [3, 2, 1]], [4, 4, 4]) 480 | ) 481 | expect(List.zipWith(id)([], [])).to.deep.equal([]) 482 | }) 483 | }) 484 | }) 485 | -------------------------------------------------------------------------------- /test/Num.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import * as Num from '../src/Num' 3 | 4 | describe('Num.js', () => { 5 | describe('Num.add', () => { 6 | it('Should add two values', () => { 7 | expect(Num.add(1, 2)).to.equal(3) 8 | expect(Num.add(-1, 2)).to.equal(1) 9 | expect(Num.add('foo', 2)).to.equal('foo2') 10 | expect(Num.add('foo', 'bar')).to.equal('foobar') 11 | expect(Num.add(null, undefined)).to.deep.equal(NaN) 12 | expect(Num.add(null, null)).to.equal(0) 13 | expect(Num.add(undefined, undefined)).to.deep.equal(NaN) 14 | }) 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /test/Obj.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import * as Obj from '../src/Obj' 3 | 4 | describe('Obj.js', () => { 5 | describe('Obj.keys', () => { 6 | it('Should return the list of keys in a given Object', () => { 7 | expect(Obj.keys({ a: 2, b: 3, c: 9 })).to.deep.equal(['a', 'b', 'c']) 8 | }) 9 | }) 10 | describe('Obj.values', () => { 11 | it('Should return the list of values in a given Object', () => { 12 | expect(Obj.values({ a: 2, b: 3, c: 9 })).to.deep.equal([2, 3, 9]) 13 | }) 14 | }) 15 | describe('Obj.clone', () => { 16 | it('Should return a copy of a given object, with no reference to it', () => { 17 | expect(Obj.clone({ a: 2, b: 3, c: 9 })).to.deep.equal({ a: 2, b: 3, c: 9 }) 18 | expect(Obj.clone({ a: 2, b: 3, c: 9 })).not.to.equal({ a: 2, b: 3, c: 9 }) 19 | expect(Obj.clone({})).to.not.equal({}) 20 | expect(Obj.clone(3)).to.equal(3) 21 | expect(Obj.clone('3')).to.equal('3') 22 | expect(Obj.clone(null)).to.equal(null) 23 | }) 24 | }) 25 | describe('Obj.merge', () => { 26 | it('Should merge any number of objects to the first given object', () => { 27 | expect(Obj.merge({ a: 2, c: 9 }, { b: 3 })).to.deep.equal({ a: 2, b: 3, c: 9 }) 28 | expect(Obj.merge({}, { a: 2, c: 9 }, { b: 3 })).to.deep.equal({ a: 2, b: 3, c: 9 }) 29 | expect(Obj.merge({ a: 2, c: 9 }, { b: 3 }, { a: 4 })).to.deep.equal({ a: 4, b: 3, c: 9 }) 30 | }) 31 | }) 32 | describe('Obj.pairsToObj', () => { 33 | it('Takes a list of pairs and turns them into an object', () => { 34 | expect(Obj.pairsToObj([['a', 'b'], ['c', 'd'], ['e', 1]])).to.deep.equal({ a: 'b', c: 'd', e: 1 }) 35 | }) 36 | }) 37 | 38 | describe('Obj.objToPairs', () => { 39 | it('Takes an object and returns a list of pairs', () => { 40 | expect(Obj.objToPairs({ a: 'b', c: 'd', e: 1 })).to.deep.equal([['a', 'b'], ['c', 'd'], ['e', 1]]) 41 | }) 42 | }) 43 | 44 | describe('Obj.get', () => { 45 | it('Should return a member (property or method) from a given object', () => { 46 | expect(Obj.get('foo', { foo: 'bar' })).to.equal('bar') 47 | expect(Obj.get('length', [])).to.equal(0) 48 | expect(Obj.get('length', 'foo')).to.equal(3) 49 | }) 50 | }) 51 | }) 52 | -------------------------------------------------------------------------------- /test/Str.js: -------------------------------------------------------------------------------- 1 | import * as Str from '../src/Str' 2 | import flip from '../Func/flip' 3 | import { expect } from 'chai' 4 | 5 | describe('Str.js', () => { 6 | describe('Str.capitalize', () => { 7 | it('Should capitalize the first character of a given string', () => { 8 | expect(Str.capitalize('foo')).to.equal('Foo') 9 | expect(Str.capitalize('bAR')).to.equal('BAR') 10 | expect(Str.capitalize('BAZ')).to.equal('BAZ') 11 | }) 12 | }) 13 | 14 | describe('Str.dasherize', () => { 15 | it('Should convert a camelCase string to a snake-case string', () => { 16 | expect(Str.dasherize('fooBar')).to.equal('foo-bar') 17 | expect(Str.dasherize('feeFiFoFoo')).to.equal('fee-fi-fo-foo') 18 | }) 19 | }) 20 | 21 | describe('Str.camelize', () => { 22 | it('Should convert a snake-case string to a camelCase string', () => { 23 | expect(Str.camelize('foo-bar')).to.equal('fooBar') 24 | expect(Str.camelize('fee-fi-fo-foo')).to.equal('feeFiFoFoo') 25 | }) 26 | }) 27 | 28 | describe('Str.split', () => { 29 | it('Should split a string by a given separator', () => { 30 | expect(Str.split('-', 'foo-bar')).to.deep.equal(['foo', 'bar']) 31 | expect(Str.split('-', 'fee-fi-fo-foo')).to.deep.equal(['fee', 'fi', 'fo', 'foo']) 32 | expect(Str.split(/[A-Z]/, 'feeFiFoFoo')).to.deep.equal(['fee', 'i', 'o', 'oo']) 33 | }) 34 | }) 35 | 36 | describe('Str.padLeft', () => { 37 | it('Should pad a string with a given value', () => { 38 | expect(Str.padLeft('00', 1)).to.equal('01') 39 | expect(Str.padLeft('0000', 1)).to.equal('0001') 40 | expect(Str.padLeft('0000', null)).to.equal('0000') 41 | expect(Str.padLeft('0000', undefined)).to.equal('0000') 42 | expect(Str.padLeft('0000', 30)).to.equal('0030') 43 | expect(Str.padLeft('0000', 9999)).to.equal('9999') 44 | expect(Str.padLeft('0000', 123456)).to.equal('123456') 45 | }) 46 | }) 47 | 48 | describe('Str.contains', () => { 49 | it('Should tell if a given string contain a substring', () => { 50 | expect(Str.contains('foo', 'bar')).to.equal(false) 51 | expect(Str.contains('foo', 'foobar')).to.equal(true) 52 | expect(Str.contains('bar', 'foobar')).to.equal(true) 53 | expect(Str.contains('z', 'baz')).to.equal(true) 54 | }) 55 | }) 56 | 57 | describe('Str.startsWith', () => { 58 | it('Should tell if a given string startsWith a substring', () => { 59 | expect(Str.startsWith('foo', 'bar')).to.equal(false) 60 | expect(Str.startsWith('foo', 'foobar')).to.equal(true) 61 | expect(Str.startsWith('bar', 'foobar')).to.equal(false) 62 | expect(Str.startsWith('b', 'baz')).to.equal(true) 63 | }) 64 | }) 65 | 66 | describe('Str.take', () => { 67 | it('Should return a substring composed of the first n character of a string', () => { 68 | expect(Str.take(4, 'hello')).to.equal('hell') 69 | }) 70 | }) 71 | 72 | describe('Str.takeWhile', () => { 73 | const isVowel = flip(Str.contains)('aeiou') 74 | 75 | it('Should return a substring composed of the first n character that satisfy a given predicate', () => { 76 | expect(Str.takeWhile(isVowel, 'art')).to.equal('a') 77 | expect(Str.takeWhile(isVowel, 'iao')).to.equal('iao') 78 | expect(Str.takeWhile(isVowel, 'fry')).to.equal('') 79 | }) 80 | }) 81 | }) 82 | -------------------------------------------------------------------------------- /test/cases.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai' 2 | import { curry } from '../src/Func' 3 | 4 | const deep = (actual, expected) => expect(actual).to.deep.equal(expected) 5 | 6 | const runCase = curry((f, { input, expected, comparison }) => comparison(f(...input), expected)) 7 | 8 | export const Case = (input, expected, comparison = deep) => ({ input, expected, comparison }) 9 | 10 | export const run = (f, ...cases) => cases.map(runCase(f)) 11 | --------------------------------------------------------------------------------