johnny-shaman/losand

View on GitHub
losand.dev.js

Summary

Maintainability
A
0 mins
Test Coverage
(() => {
  "use strict";

  let _ = function (v, re) {
    return Object.create(_.prototype, {
      "@": {
        configurable: true,
        writable: true,
        value: v
      },
      re: {
        configurable: true,
        writable: true,
        value: re
      },
      cached: {
        configurable: true,
        writable: true,
        value: undefined
      }
    });
  };

  Object.defineProperties(_.prototype, {
    by: {
      configurable: true,
      get () {
        return this.map(w => w.constructor);
      }
    },
    be: {
      configurable: true,
      value (f, ...v) {
        return f(this._, ...v) ? this : this.map(t => undefined);
      }
    },
    is: {
      configurable: true,
      value (t) {
        return this.be(v => _(v).by._ === t);
      }
    },
    isnt: {
      configurable: true,
      value (t) {
        return this.be(v => _(v).by._ !== t);
      }
    },
    "": {
      configurable: true,
      get () {
        return this["@"] === undefined || this["@"] === null;
      }
    },
    fullen: {
      configurable: true,
      get () {
        return !(this.vals._.includes(undefined) || this.vals._.includes(null));
      }
    },
    join: {
      configurable: true,
      get () {
        return this[""] ? this["@"] : this["@"].valueOf();
      }
    },
    _: {
      configurable: true,
      get () {
        return this.join;
      }
    },
    $: {
      configurable: true,
      value (f, ...v) {
        return this[""] ? this : this.map(f, ...v).re;
      }
    },
    $$: {
      configurable: true,
      value (f, ...v) {
        return this[""] ? this : this.fit(f, ...v).re;
      }
    },
    map: {
      configurable: true,
      value (f, ...v) {
        return this[""] ? this : _(f(this["@"], ...v), this);
      }
    },
    fit: {
      configurable: true,
      value (f, ...v) {
        return this[""] ? this : _(f(...v, this["@"]), this);
      }
    },
    bind: {
      configurable: true,
      value (f, ...v) {
        return this.map(f, ...v)._;
      }
    },
    link: {
      configurable: true,
      value (f, ...v) {
        return this.fit(f, ...v)._;
      }
    },
    keys: {
      configurable: true,
      get () {
        return this.map(Object.keys);
      }
    },
    vals: {
      configurable: true,
      get () {
        return this.map(Object.values);
      }
    },
    entries: {
      configurable: true,
      get () {
        return this.map(Object.entries);
      }
    },
    get: {
      configurable: true,
      value (...k) {
        return this.map(t => k.foldL((p, c) => _(p)[""] ? undefined : p[c], t));
      }
    },
    set: {
      configurable: true,
      value (v, ...k) {
        return this.$(
          t => _(k).map(l => l.pop()).bind(
            l => _(
              k.foldL(
                (p, c) => _(p[c])[""] ? _(p).draw({[c]: {}})._[c] : p[c], t
              )
            )
            .draw({[l]: v})
          )
        );
      }
    },
    been: {
      configurable: true,
      get () {
        return new Proxy(this, {
          get (t, k, r) {
            switch (k) {
              case "to": return t;
              case "_" : return t._;
              default: switch (t.get(k).by._) {
                case Function : return (...v) => t.$(w => w[k](...v)).been;
                default: return (v, ...l) => (l.unshift(k), t.set(v, ...l).been);
              }
            }
          }
        });
      }
    },
    draw: {
      configurable: true,
      value (...o) {
        return this.map(Object.assign, ...o);
      }
    },
    cast: {
      configurable: true,
      value (...o) {
        return this.fit(Object.assign, ...o);
      }
    },
    hold: {
      configurable: true,
      value (...v) {
        return this.bind(
          o => v.foldL(
            (p, c) => _(o[c])[""] ? p : p.draw({[c]: o[c]}), this.other()
          )
        );
      }
    },
    crop: {
      configurable: true,
      value (...v) {
        return this.hold(...this.keys._.filter(k => !v.includes(k)));
      }
    },
    pick: {
      configurable: true,
      value (o) {
        return this.bind(a => _(o).hold(...a));
      }
    },
    drop: {
      configurable: true,
      value (o) {
        return this.bind(a => _(o).crop(...a));
      }
    },
    valid: {
      configurable: true,
      get () {
        return this.hold(...this.keys._);
      }
    },
    turn: {
      configurable: true,
      get () {
        return this.keys.bind(
          a => a.foldL((p, c) => p.draw({[this["@"][c]]: c}), _({}))
        );
      }
    },
    relate: {
      configurable: true,
      value (o) {
        return this.$(t => _.pair.set(t, o).set(o, t));
      }
    },
    swap: {
      configurable: true,
      get () {
        return this.map(m => _.pair.get(m));
      }
    },
    define: {
      configurable: true,
      value (o = {}) {
        return this.map(Object.defineProperties, o);
      }
    },
    create: {
      configurable: true,
      value (o = {}) {
        return this.map(Object.create, o);
      }
    },
    other: {
      configurable: true,
      value (o = {}) {
        return this.map(m => Object.create(_(m).by.from._, o));
      }
    },
    depend: {
      configurable: true,
      value (o) {
        return this.bind(m => _(o).create().draw(m));
      }
    },
    give: {
      configurable: true,
      value (f) {
        return this.$(t => _(t).entries.$(i => i.forEach(([k, v]) => f(k, v))));
      }
    },
    list: {
      configurable: true,
      get () {
        return this.map(
          o => _(o.length)[""]
          ? _(o).draw({length: _(o).keys._.length}).list._
          : Array.from(o)
        );
      }
    },
    json: {
      configurable: true,
      get () {
        return JSON.stringify(this._);
      }
    },
    from: {
      configurable: true,
      get () {
        return this.bind(m => _(m.prototype || Object.getPrototypeOf(m)));
      }
    },
    affix: {
      configurable: true,
      value (o) {
        return this.$(m => _(m).from.draw(o));
      }
    },
    annex: {
      configurable: true,
      value (o) {
        return this.$(m => _(m).from.define(o));
      }
    },
    fork: {
      configurable: true,
      value (f) {
        return this.bind(
          m => _(f).draw({prototype: _(m).from.create({
            constructor: {
              configurable: true,
              writable: true,
              enumerable: false,
              value: f
            }
          }).draw(f.prototype)._})
        );
      }
    },
    hybrid: {
      configurable: true,
      value (o) {
        return this.bind(
          m => _(m).draw({prototype: _(m).from.from.create({
            constructor: {
              configurable: true,
              writable: true,
              enumerable: false,
              value: _(m).from.by._
            }
          }).draw(o, _(m).from._)._})
        );
      }
    },
    part: {
      configurable: true,
      value (...v) {
        return _(v).fullen
        ? this.map(f => f(...v))
        : (...vv) => this.part(...v.adaptL(...vv));
      }
    },
    done: {
      configurable: true,
      value (...v) {
        return this.cached === undefined
        ? _(this).draw({cached: this.map(f => f(...v))})._.cached
        : this.cached;
      }
    },
    redo: {
      configurable: true,
      value (...v) {
        return _(this).draw({cached: undefined})._.done(...v);
      }
    },
    apply: {
      configurable: true,
      value (...v) {
        return this.map(t => v.foldL((a, f) => f(a), t));
      }
    }
  });

  _(_).draw({
    pair: new Map(),
    version: "1.5.0",
    lib: "losand",
    get _ () {
      return void 0;
    }
  });

  _(Array).annex({
    each: {
      configurable: true,
      get () {
        return this.forEach;
      }
    },
    foldL: {
      configurable: true,
      get () {
        return this.reduce;
      }
    },
    foldR: {
      configurable: true,
      get () {
        return this.reduceRight;
      }
    },
    aMap: {
      configurable: true,
      value (a) {
        return Array.prototype.concat.call(
          [],
          ...(
            this.foldL((p, c) => c.constructor === Function || p, false)
            ? this
            : a
          )
        .map(
          f => (
            this.foldL((p, c) => c.constructor === Function || p, false)
            ? a.map(f)
            : this.map(f)
          )
        ));
      }
    },
    adaptL: {
      configurable: true,
      value (...a) {
        return this.map(v => !(v === undefined || v === null) ? v : a.shift());
      }
    },
    adaptR: {
      configurable: true,
      value (...a) {
        return this.adaptL(...a.reverse());
      }
    },
    adapt: {
      configurable: true,
      get () {
        return this.adaptL;
      }
    },
    adaptRight: {
      configurable: true,
      get () {
        return this.adaptR;
      }
    },
    flat: {
      configurable: true,
      get () {
        return this.foldL((a, v) => v instanceof Array ? Array.prototype.concat.call(a, v) : (a.push(v), a), []);
      }
    }
  });

  _(String).annex({
    json: {
      configurable: true,
      get () {
        try {
          return _(JSON.parse(this));
        } catch (e) {
          return _(this);
        }
      }
    }
  });

  _(Number).annex({
    _ : {
      configurable: true,
      value (n, s = 1) {
        return [...function* (v) {
          yield v;
          while (v + s <= n) {
            yield v += s;
          }
        }(this.valueOf())];
      }
    }
  });

  _(this).is(Object).$(() => _(_).annex({
    on: {
      configurable: true,
      value (d) {
        _(d).give(this["@"].on.bind(this["@"]));
        return this;
      }
    },
    once: {
      configurable: true,
      value (d) {
        _(d).give(this["@"].once.bind(this["@"]));
        return this;
      }
    }
  }));

  _(this).by._ === Object ? module.exports = _ : this._ = _;
})();