Skip to content

Instantly share code, notes, and snippets.

@PaulMaynard
Last active May 2, 2016 16:13

Revisions

  1. PaulMaynard revised this gist May 2, 2016. 1 changed file with 20 additions and 3 deletions.
    23 changes: 20 additions & 3 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,5 @@
    /**
    * Eater.js version: 0.3.3
    * Eater.js version: 0.3.4
    * Usage examples:
    * // Even squares of numbers between 1-100
    * _(_.filter( x => x % 2 === 0, _.map(x => x * x, _.range(1, 100))))
    @@ -84,8 +84,19 @@ Object.assign(eater, {
    get(it) {
    return it.next().value;
    },
    taker(it) {
    return () => it.next().value;
    taker(amt, it) {
    if(it == null) {
    it = amt;
    amt = 1;
    }
    return () => eater.take(amt, it);
    },
    reduce(fun, val, it) {
    if(it == null) {
    return i => reduce(fun, val, i);
    } else {
    return reduce(fun, val, it)
    }
    },
    /* Manipulators */
    map(fun, it) {
    @@ -116,6 +127,12 @@ function* each(fun, it) {
    yield i;
    }
    }
    function reduce(fun, val, it) {
    for(let i of it) {
    val = fun(val, i);
    }
    return val
    }
    function* map(fun, it) {
    for(let i of it) {
    yield fun(i);
  2. PaulMaynard revised this gist Nov 24, 2015. 1 changed file with 29 additions and 0 deletions.
    29 changes: 29 additions & 0 deletions die.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,29 @@
    /** Sample die roller */
    function die(pattern) {
    let [, sign = '+', amt = 1, sides = 6, num, mod] = die.regex.exec(pattern)
    let gen
    if (num) {
    gen = _.fill(Number(num))
    } else {
    let die = _.func(() => Math.floor(Math.random() * sides) + 1)
    gen = _.combine(sum, ...Array(amt).fill(die))
    }
    gen = _.map(die.signs[sign], gen)
    if(mod) {
    return _.combine(sum, gen, die(mod))
    } else {
    return gen
    }
    }
    die.regex = /^([+-])?(?:(?:(\d*))?d(\d+)|(\d+))((?:[+-](?:(?:\d*d)?\d+|\d+))*)$/i
    die.signs = {
    '+': n => n,
    '-': n => -n,
    }
    function sum(a, ...b) {
    if (b.length) {
    return a + sum(...b)
    } else {
    return a
    }
    }
  3. PaulMaynard revised this gist Nov 24, 2015. 1 changed file with 5 additions and 5 deletions.
    10 changes: 5 additions & 5 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,5 @@
    /**
    * Eater.js version: 0.3.2
    * Eater.js version: 0.3.3
    * Usage examples:
    * // Even squares of numbers between 1-100
    * _(_.filter( x => x % 2 === 0, _.map(x => x * x, _.range(1, 100))))
    @@ -104,9 +104,9 @@ Object.assign(eater, {
    },
    combine(fun, ...its) {
    if(its.length === 0) {
    return i => combine(fun, i)
    return (...i) => combine(fun, i);
    } else {
    return combine(fun, ...its)
    return combine(fun, ...its);
    }
    }
    });
    @@ -131,7 +131,7 @@ function* filter(fun, it) {
    function* combine(fun, ...its) {
    while(true) {
    let results = its.map(i => i.next());
    done = results.every(r => r.done);
    let done = results.every(r => r.done);
    if(done) {
    break;
    } else {
    @@ -140,4 +140,4 @@ function* combine(fun, ...its) {
    }
    }
    return eater;
    })();
    })();
  4. PaulMaynard revised this gist Nov 24, 2015. 1 changed file with 18 additions and 0 deletions.
    18 changes: 18 additions & 0 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -101,6 +101,13 @@ Object.assign(eater, {
    } else {
    return filter(fun, it);
    }
    },
    combine(fun, ...its) {
    if(its.length === 0) {
    return i => combine(fun, i)
    } else {
    return combine(fun, ...its)
    }
    }
    });
    function* each(fun, it) {
    @@ -121,5 +128,16 @@ function* filter(fun, it) {
    }
    }
    }
    function* combine(fun, ...its) {
    while(true) {
    let results = its.map(i => i.next());
    done = results.every(r => r.done);
    if(done) {
    break;
    } else {
    yield fun(...results.map(r => r.value));
    }
    }
    }
    return eater;
    })();
  5. PaulMaynard revised this gist Nov 24, 2015. 1 changed file with 17 additions and 17 deletions.
    34 changes: 17 additions & 17 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -16,7 +16,7 @@ function eater(it, ...args) {
    return eater.func(it, ...args);
    } else if(it[Symbol.iterator]) {
    if(typeof args[0] === 'number'|| args[0] instanceof Number) {
    return [...eater.take(args[0], it)]
    return [...eater.take(args[0], it)];
    } else {
    return [...it];
    }
    @@ -34,7 +34,7 @@ Object.assign(eater, {
    if(end == null) {
    [start, end] = [1, start];
    }
    for(var i = start; i <= end; i++) {
    for(let i = start; i <= end; i++) {
    yield i;
    }
    },
    @@ -49,36 +49,36 @@ Object.assign(eater, {
    }
    },
    *loop(it) {
    for(var i = 0; i < it.length; i++) {
    for(let i = 0; i < it.length; i++) {
    yield it[i];
    }
    },
    *pick(a) {
    while(true) {
    yield a[Math.floor(Math.random() * a.length)]
    yield a[Math.floor(Math.random() * a.length)];
    }
    },
    *join(...its) {
    for(var it of its) {
    for(let it of its) {
    yield* it;
    }
    },
    /* Accessors */
    *take(amt, iter) {
    if(iter == null) {
    iter = amt;
    amt = Infinity
    amt = Infinity;
    }
    var it = iter[Symbol.iterator] ? iter[Symbol.iterator]() : iter
    for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
    let it = iter[Symbol.iterator] ? iter[Symbol.iterator]() : iter
    for(let i = 0, n; i < amt && !((n = it.next()).done); i++) {
    yield n.value;
    }
    },
    each(fun, it) {
    if(it == null) {
    return i => each(fun, i)
    return i => each(fun, i);
    } else {
    return each(fun, it)
    return each(fun, it);
    }
    },
    get(it) {
    @@ -90,32 +90,32 @@ Object.assign(eater, {
    /* Manipulators */
    map(fun, it) {
    if(it == null) {
    return i => map(fun, i)
    return i => map(fun, i);
    } else {
    return map(fun, it)
    return map(fun, it);
    }
    },
    filter(fun, it) {
    if(it == null) {
    return i => filter(fun, i)
    return i => filter(fun, i);
    } else {
    return filter(fun, it)
    return filter(fun, it);
    }
    }
    });
    function* each(fun, it) {
    for(var i of it) {
    for(let i of it) {
    fun(i);
    yield i;
    }
    }
    function* map(fun, it) {
    for(var i of it) {
    for(let i of it) {
    yield fun(i);
    }
    }
    function* filter(fun, it) {
    for(var i of it) {
    for(let i of it) {
    if(fun(i)) {
    yield i;
    }
  6. PaulMaynard revised this gist Nov 23, 2015. 1 changed file with 36 additions and 12 deletions.
    48 changes: 36 additions & 12 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,5 @@
    /**
    * Eater.js version: 0.2.0
    * Eater.js version: 0.3.2
    * Usage examples:
    * // Even squares of numbers between 1-100
    * _(_.filter( x => x % 2 === 0, _.map(x => x * x, _.range(1, 100))))
    @@ -74,28 +74,52 @@ Object.assign(eater, {
    yield n.value;
    }
    },
    *each(fun, it) {
    for(var i of it) {
    fun(i);
    yield i;
    each(fun, it) {
    if(it == null) {
    return i => each(fun, i)
    } else {
    return each(fun, it)
    }
    },
    get(it) {
    return it.next().value;
    },
    taker(it) {
    return () => it.next().value;
    },
    /* Manipulators */
    *map(fun, it) {
    for(var i of it) {
    yield fun(i);
    map(fun, it) {
    if(it == null) {
    return i => map(fun, i)
    } else {
    return map(fun, it)
    }
    },
    *filter(fun, it) {
    for(var i of it) {
    filter(fun, it) {
    if(it == null) {
    return i => filter(fun, i)
    } else {
    return filter(fun, it)
    }
    }
    });
    function* each(fun, it) {
    for(var i of it) {
    fun(i);
    yield i;
    }
    }
    function* map(fun, it) {
    for(var i of it) {
    yield fun(i);
    }
    }
    function* filter(fun, it) {
    for(var i of it) {
    if(fun(i)) {
    yield i;
    }
    }
    }
    });
    }
    return eater;
    })();
  7. PaulMaynard revised this gist Nov 23, 2015. 1 changed file with 19 additions and 10 deletions.
    29 changes: 19 additions & 10 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -1,25 +1,29 @@
    /**
    * Eater.js version: 0.2.0
    * Usage examples:
    * // Even squares of numbers between 1-10
    * _(_.filter( x => x % 2 === 0, _.map(x => x * x, _.range(1, 10))))
    * // Even squares of numbers between 1-100
    * _(_.filter( x => x % 2 === 0, _.map(x => x * x, _.range(1, 100))))
    * // 10 coin flips
    * _(_.take(10, _.map(n => n < 0.5, _.func(Math.random))))
    * _(_.pick([true, false]), 10)
    * // first 100 Fibonacci numbers (assuming already defined generator)
    * _(_.take(100, fibonacci()))
    * // Convert pseudo-array to array
    * _(_({ 0: 1, 1: 2, length: 2} ))
    * // Consume pseudo-array
    * _({0: 1, 1: 2, length: 2})
    */
    window._ = window.eater = (function(){'use strict';
    function eater(it) {
    function eater(it, ...args) {
    if(typeof it === 'function') {
    return eater.func(it);
    } else if(typeof it.length === 'number') {
    return eater.loop(it);
    return eater.func(it, ...args);
    } else if(it[Symbol.iterator]) {
    return [...it];
    if(typeof args[0] === 'number'|| args[0] instanceof Number) {
    return [...eater.take(args[0], it)]
    } else {
    return [...it];
    }
    } else if(it.next) {
    return eater.take(it);
    } else if(typeof it.length === 'number') {
    return eater.loop(it);
    } else {
    return eater.fill(it);
    }
    @@ -49,6 +53,11 @@ Object.assign(eater, {
    yield it[i];
    }
    },
    *pick(a) {
    while(true) {
    yield a[Math.floor(Math.random() * a.length)]
    }
    },
    *join(...its) {
    for(var it of its) {
    yield* it;
  8. PaulMaynard revised this gist Sep 14, 2015. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -14,8 +14,6 @@ window._ = window.eater = (function(){'use strict';
    function eater(it) {
    if(typeof it === 'function') {
    return eater.func(it);
    } else if(it.next) {
    return eater.take(it);
    } else if(typeof it.length === 'number') {
    return eater.loop(it);
    } else if(it[Symbol.iterator]) {
  9. PaulMaynard revised this gist Sep 14, 2015. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -14,8 +14,6 @@ window._ = window.eater = (function(){'use strict';
    function eater(it) {
    if(typeof it === 'function') {
    return eater.func(it);
    } else if(it[Symbol.iterator]) {
    return [...it];
    } else if(it.next) {
    return eater.take(it);
    } else if(typeof it.length === 'number') {
  10. PaulMaynard revised this gist Mar 18, 2015. 1 changed file with 13 additions and 8 deletions.
    21 changes: 13 additions & 8 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -1,11 +1,12 @@
    /**
    * Eater.js version: 0.2.0
    * Usage examples:
    * // Even squares of numbers between 1-10
    * _(_.filter(_.map(_.range(1, 10), x => x * x), x => x % 2 === 0))
    * _(_.filter( x => x % 2 === 0, _.map(x => x * x, _.range(1, 10))))
    * // 10 coin flips
    * _(_.take(_.map(_.func(Math.random), n => n < 0.5), 10))
    * _(_.take(10, _.map(n => n < 0.5, _.func(Math.random))))
    * // first 100 Fibonacci numbers (assuming already defined generator)
    * _(_.take(fibonacci(), 100))
    * _(_.take(100, fibonacci()))
    * // Convert pseudo-array to array
    * _(_({ 0: 1, 1: 2, length: 2} ))
    */
    @@ -58,13 +59,17 @@ Object.assign(eater, {
    }
    },
    /* Accessors */
    *take(iter, amt = Infinity) {
    var it = iter[Symbol.iterator]? iter[Symbol.iterator]() : iter
    *take(amt, iter) {
    if(iter == null) {
    iter = amt;
    amt = Infinity
    }
    var it = iter[Symbol.iterator] ? iter[Symbol.iterator]() : iter
    for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
    yield n.value;
    }
    },
    *each(it, fun) {
    *each(fun, it) {
    for(var i of it) {
    fun(i);
    yield i;
    @@ -74,12 +79,12 @@ Object.assign(eater, {
    return it.next().value;
    },
    /* Manipulators */
    *map(it, fun) {
    *map(fun, it) {
    for(var i of it) {
    yield fun(i);
    }
    },
    *filter(it, fun) {
    *filter(fun, it) {
    for(var i of it) {
    if(fun(i)) {
    yield i;
  11. PaulMaynard revised this gist Nov 18, 2014. 1 changed file with 6 additions and 2 deletions.
    8 changes: 6 additions & 2 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -19,6 +19,10 @@ function eater(it) {
    return eater.take(it);
    } else if(typeof it.length === 'number') {
    return eater.loop(it);
    } else if(it[Symbol.iterator]) {
    return [...it];
    } else if(it.next) {
    return eater.take(it);
    } else {
    return eater.fill(it);
    }
    @@ -54,8 +58,8 @@ Object.assign(eater, {
    }
    },
    /* Accessors */
    *take(iter, amt) {
    var it = iter[Symbol.iterator]? iter[Symbol.iterator]() : iter;
    *take(iter, amt = Infinity) {
    var it = iter[Symbol.iterator]? iter[Symbol.iterator]() : iter
    for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
    yield n.value;
    }
  12. PaulMaynard revised this gist Nov 17, 2014. 1 changed file with 36 additions and 10 deletions.
    46 changes: 36 additions & 10 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -1,21 +1,33 @@
    /**
    * Example usage: _(_.filter(_.map(_.range(1, 10), x => x * x), x => x % 2 === 0)) // Even squares of numbers between 1-100
    * Usage examples:
    * // Even squares of numbers between 1-10
    * _(_.filter(_.map(_.range(1, 10), x => x * x), x => x % 2 === 0))
    * // 10 coin flips
    * _(_.take(_.map(_.func(Math.random), n => n < 0.5), 10))
    * // first 100 Fibonacci numbers (assuming already defined generator)
    * _(_.take(fibonacci(), 100))
    * // Convert pseudo-array to array
    * _(_({ 0: 1, 1: 2, length: 2} ))
    */
    window._ = window.eater = (function(){'use strict';
    function eater(it) {
    if(typeof it !== 'function' && typeof it.length === 'number') {
    return eater.loop(it);
    if(typeof it === 'function') {
    return eater.func(it);
    } else if(it[Symbol.iterator]) {
    return [...it];
    } else if(it.next) {
    return eater.take(it)
    return eater.take(it);
    } else if(typeof it.length === 'number') {
    return eater.loop(it);
    } else {
    return eater.fill(it);
    }
    };
    }
    Object.assign(eater, {
    /* Creators */
    *range(start = Infinity, end) {
    *range(start = Infinity, end = null) {
    if(end == null) {
    [start, end] = [0, start];
    [start, end] = [1, start];
    }
    for(var i = start; i <= end; i++) {
    yield i;
    @@ -26,6 +38,11 @@ Object.assign(eater, {
    yield val;
    }
    },
    *func(fn, ...args) {
    while(true) {
    yield fn(...args);
    }
    },
    *loop(it) {
    for(var i = 0; i < it.length; i++) {
    yield it[i];
    @@ -37,12 +54,21 @@ Object.assign(eater, {
    }
    },
    /* Accessors */
    *take(iter, amt = Infinity) {
    var it = iter[Symbol.iterator]? iter[Symbol.iterator]() : iter
    *take(iter, amt) {
    var it = iter[Symbol.iterator]? iter[Symbol.iterator]() : iter;
    for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
    yield n.value;
    }
    },
    *each(it, fun) {
    for(var i of it) {
    fun(i);
    yield i;
    }
    },
    get(it) {
    return it.next().value;
    },
    /* Manipulators */
    *map(it, fun) {
    for(var i of it) {
    @@ -57,5 +83,5 @@ Object.assign(eater, {
    }
    }
    });
    return eater
    return eater;
    })();
  13. PaulMaynard revised this gist Nov 17, 2014. 1 changed file with 11 additions and 9 deletions.
    20 changes: 11 additions & 9 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -1,17 +1,19 @@
    /**
    * Usage: _(_.filter(_.map(_.range(1, 10), x => x * x), x => x % 2 === 0)) // Even squares of numbers between 1-100
    * Example usage: _(_.filter(_.map(_.range(1, 10), x => x * x), x => x % 2 === 0)) // Even squares of numbers between 1-100
    */
    window._ = window.eater = (function(){'use strict';
    function eater(it) {
    if(typeof it !== 'function' && typeof it.length === 'number') {
    return eater.loop(it);
    } else {
    } else if(it[Symbol.iterator]) {
    return [...it];
    } else if(it.next) {
    return eater.take(it)
    }
    };
    Object.assign(eater, {
    /* Creators */
    *range(start, end) {
    *range(start = Infinity, end) {
    if(end == null) {
    [start, end] = [0, start];
    }
    @@ -26,19 +28,19 @@ Object.assign(eater, {
    },
    *loop(it) {
    for(var i = 0; i < it.length; i++) {
    yield it[i]
    yield it[i];
    }
    },
    *concat(...its) {
    *join(...its) {
    for(var it of its) {
    yield* it
    yield* it;
    }
    },
    /* Accessors */
    *take(iter, amt) {
    var it = iter[Symbol.iterator]()
    *take(iter, amt = Infinity) {
    var it = iter[Symbol.iterator]? iter[Symbol.iterator]() : iter
    for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
    yield n.value
    yield n.value;
    }
    },
    /* Manipulators */
  14. PaulMaynard revised this gist Nov 17, 2014. 1 changed file with 8 additions and 6 deletions.
    14 changes: 8 additions & 6 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -5,8 +5,10 @@ window._ = window.eater = (function(){'use strict';
    function eater(it) {
    if(typeof it !== 'function' && typeof it.length === 'number') {
    return eater.loop(it);
    } else {
    } else if(it[Symbol.iterator]) {
    return [...it];
    } else if(it.next) {
    return eater.take(it)
    }
    };
    Object.assign(eater, {
    @@ -26,19 +28,19 @@ Object.assign(eater, {
    },
    *loop(it) {
    for(var i = 0; i < it.length; i++) {
    yield it[i]
    yield it[i];
    }
    },
    *concat(...its) {
    for(var it of its) {
    yield* it
    yield* it;
    }
    },
    /* Accessors */
    *take(iter, amt) {
    var it = iter[Symbol.iterator]()
    *take(iter, amt = Infinity) {
    var it = iter[Symbol.iterator]? iter[Symbol.iterator]() : it
    for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
    yield n.value
    yield n.value;
    }
    },
    /* Manipulators */
  15. PaulMaynard revised this gist Nov 17, 2014. 1 changed file with 20 additions and 3 deletions.
    23 changes: 20 additions & 3 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -3,14 +3,14 @@
    */
    window._ = window.eater = (function(){'use strict';
    function eater(it) {
    if(typeof it.length === 'number') {
    return it[Symbol.iterator]();
    if(typeof it !== 'function' && typeof it.length === 'number') {
    return eater.loop(it);
    } else {
    return [...it];
    }

    };
    Object.assign(eater, {
    /* Creators */
    *range(start, end) {
    if(end == null) {
    [start, end] = [0, start];
    @@ -19,12 +19,29 @@ Object.assign(eater, {
    yield i;
    }
    },
    *fill(val) {
    while(true) {
    yield val;
    }
    },
    *loop(it) {
    for(var i = 0; i < it.length; i++) {
    yield it[i]
    }
    },
    *concat(...its) {
    for(var it of its) {
    yield* it
    }
    },
    /* Accessors */
    *take(iter, amt) {
    var it = iter[Symbol.iterator]()
    for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
    yield n.value
    }
    },
    /* Manipulators */
    *map(it, fun) {
    for(var i of it) {
    yield fun(i);
  16. PaulMaynard revised this gist Nov 17, 2014. 1 changed file with 17 additions and 3 deletions.
    20 changes: 17 additions & 3 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -1,9 +1,16 @@
    /**
    * Usage: _(_.filter(_.map(_.range(1, 10), x => x * x), x => x % 2 === 0)) // Even squares of numbers between 1-100
    */
    (function(){'use strict';
    var _ = window._ = window.eater = it => [...it];
    Object.assign(_, {
    window._ = window.eater = (function(){'use strict';
    function eater(it) {
    if(typeof it.length === 'number') {
    return it[Symbol.iterator]();
    } else {
    return [...it];
    }

    };
    Object.assign(eater, {
    *range(start, end) {
    if(end == null) {
    [start, end] = [0, start];
    @@ -12,6 +19,12 @@ Object.assign(_, {
    yield i;
    }
    },
    *take(iter, amt) {
    var it = iter[Symbol.iterator]()
    for(var i = 0, n; i < amt && !((n = it.next()).done); i++) {
    yield n.value
    }
    },
    *map(it, fun) {
    for(var i of it) {
    yield fun(i);
    @@ -25,4 +38,5 @@ Object.assign(_, {
    }
    }
    });
    return eater
    })();
  17. PaulMaynard created this gist Nov 17, 2014.
    28 changes: 28 additions & 0 deletions eater.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,28 @@
    /**
    * Usage: _(_.filter(_.map(_.range(1, 10), x => x * x), x => x % 2 === 0)) // Even squares of numbers between 1-100
    */
    (function(){'use strict';
    var _ = window._ = window.eater = it => [...it];
    Object.assign(_, {
    *range(start, end) {
    if(end == null) {
    [start, end] = [0, start];
    }
    for(var i = start; i <= end; i++) {
    yield i;
    }
    },
    *map(it, fun) {
    for(var i of it) {
    yield fun(i);
    }
    },
    *filter(it, fun) {
    for(var i of it) {
    if(fun(i)) {
    yield i;
    }
    }
    }
    });
    })();