UNPKG

@fpjs/overture

Version:
97 lines (96 loc) 3.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.patchBuiltins = void 0; var _base = require("@fpjs/overture/base"); var _applicative = require("@fpjs/overture/algebras/applicative"); var _functor = require("@fpjs/overture/algebras/functor"); var _semigroup = require("@fpjs/overture/algebras/semigroup"); var _setoid = require("@fpjs/overture/algebras/setoid"); function Array$equals(other) { if (this === other) return true; if (other == null) return false; if (this.length !== other.length) return false; for (let i = 0; i < this.length; i++) { if (!(0, _setoid.equals)(this[i])(other[i])) return false; } return true; } function Array$concat(other) { return this.concat(other); } function Array$map(f) { return this.map(x => f(x)); } function Array$ap(fs) { if (this.length === 0 || fs.length === 0) { return []; } let ys = new Array(this.length * fs.length - 1); let k = 0; for (let i = 0; i < fs.length; i++) { for (let j = 0; j < this.length; j++) { ys[k++] = fs[i](this[j]); } } return ys; } function Array$chain(f) { let ys = []; for (let i = 0; i < this.length; i++) { for (let j = 0, xs = f(this[i]); j < xs.length; j++) { ys.push(xs[j]); } } return ys; } function Array$reduce(f, z) { let acc = z; for (let i = 0; i < this.length; i++) { acc = f(acc, this[i]); } return acc; } function Array$traverse(typeRep, f) { const pair = x => y => [x, y]; const go = (idx, n) => { switch (n) { case 0: return (0, _applicative.pure)(typeRep)([]); case 2: return (0, _applicative.lift2)(pair)(f(this[idx]))(f(this[idx + 1])); default: const m = Math.floor(n / 4) * 2; return (0, _applicative.lift2)(_semigroup.concat)(go(idx, m))(go(idx + m, n - m)); } }; return this.length % 2 === 1 ? (0, _applicative.lift2)(_semigroup.concat)((0, _functor.map)((0, _applicative.pure)(Array))(f(this[0])))(go(1, this.length - 1)) : go(0, this.length); } function Function$map(f) { return (0, _base.compose)(f)(this); } function Promise$map(f) { return this.then(x => f(x)); } function Promise$ap(a) { return this.then(x => a.then(f => f(x))); } const patchBuiltins = () => { Array['fantasy-land/empty'] = (0, _base.constant)([]); Array['fantasy-land/of'] = x => [x]; Array.prototype['fantasy-land/equals'] = Array$equals; Array.prototype['fantasy-land/concat'] = Array$concat; Array.prototype['fantasy-land/map'] = Array$map; Array.prototype['fantasy-land/ap'] = Array$ap; Array.prototype['fantasy-land/chain'] = Array$chain; Array.prototype['fantasy-land/reduce'] = Array$reduce; Array.prototype['fantasy-land/traverse'] = Array$traverse; Function.prototype['fantasy-land/map'] = Function$map; if (typeof Promise !== 'undefined') { Promise['fantasy-land/of'] = x => Promise.resolve(x); Promise.prototype['fantasy-land/map'] = Promise$map; Promise.prototype['fantasy-land/ap'] = Promise$ap; } }; exports.patchBuiltins = patchBuiltins;