UNPKG

17.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"funprog.js","sources":["../src/operators.js","../src/functionalprogramming.js","../src/reducer.js","../src/transducer.js","../src/transformer.js","../src/iterator.js"],"sourcesContent":["const not = async (x) => {\r\n var operand = await x\r\n return !operand\r\n }\r\n\r\nconst identity = x => x\r\n\r\n// predicates\r\nconst isEven = x => x % 2 === 0\r\nconst isOdd = x => !isEven(x)\r\nconst isGreaterThan = x => y => y > x ? y : 0\r\nconst digitize = x => x ? 1 : 0\r\n\r\nconst modulus = val => x => x % val\r\n\r\nconst select = property => x => x[property]\r\n\r\nexport {\r\n isEven,\r\n modulus,\r\n isOdd,\r\n isGreaterThan,\r\n identity,\r\n not,\r\n digitize,\r\n select\r\n}\r\n","\nfunction apply (x, f) {\n return f(x)\n}\n\nfunction compose (...funcs) {\n return x => funcs.reduceRight(apply, x)\n}\n\nexport {\n compose\n}\n","\nfunction concat (accumlator, val) {\n return accumlator.concat(val)\n}\n\nfunction latest (accumlator, val) {\n return val\n}\n\nexport {\n concat,\n latest\n}\n","\nasync function transduceAsyncIterator (transform, reducerfunction, init, asynciterator) {\n var reducer = transform(reducerfunction)\n var n = null\n do {\n n = await asynciterator.next()\n if (!n.done) {\n var v = n.value\n init = await reducer(init, v)\n }\n } while (!n.done)\n return init\n}\n\nasync function transduceAsyncHasNextIterator (transform, reducerfunction, init, asynchasnextiterator) {\n var reducer = transform(reducerfunction)\n var n = null\n var r = null\n do {\n n = await asynchasnextiterator.hasNext()\n if (n) {\n var v = await asynchasnextiterator.next()\n r = await reducer(init, v)\n if (r.hasOwnProperty('reduced')) {\n if (r.reduced) {\n init = r.reduced\n }\n } else if (r) {\n init = r\n }\n }\n } while (r && n)\n return init\n}\n\nasync function transduceArray (xf, rf, init, xs) {\n // call reduce on the data structure internally (abstract it away)\n // pass the rf to the composed transformation\n // pass in the initial value\n var xrf = await xf(rf)\n return xs.reduce(xrf, init)\n}\n\nasync function * transduceGenerator (transform, reducerfunction, init, streamgenerator) {\n var reducer = transform(reducerfunction)\n for await (const value of streamgenerator) {\n var newinit = await reducer(init, value)\n // Here we checked if there is new a 'reduced' value and only generate a new value when this is the case\n if (!newinit) {\n } else if (newinit === init) {\n } else {\n if (newinit.hasOwnProperty('reduced')) {\n if (Array.isArray(newinit.reduced)) {\n for (var i = 0; i < newinit.reduced.length; i++) {\n init = newinit.reduced[i]\n yield newinit.reduced[i]\n }\n }\n } else {\n init = newinit\n yield newinit\n }\n }\n }\n}\n\nexport {\n transduceAsyncIterator,\n transduceAsyncHasNextIterator,\n transduceArray,\n transduceGenerator\n}\n","\n/**\n * Passes all events\n */\nfunction passthrough () {\n return function (rf) {\n // this takes 2 things and makes them 1\n return async (acc, val) => {\n return rf(acc, val) // <-- rf replaces 'concat'\n }\n }\n}\n\n/**\n * Performs a mapping operation on each record in the stream\n * @param {*} f\n */function mapping (f) {\n return function (rf) {\n // this takes 2 things and makes them 1\n return async (acc, val) => {\n var m = await f(val)\n var r = await rf(acc, m) // <-- rf replaces 'concat'\n if (r.hasOwnProperty('reduced')) {\n if (r.reduced) {\n return r\n } else {\n return acc\n }\n } else {\n return r\n }\n }\n }\n }\n\n /**\n * Removes records from the stream if the dont match the predicate\n * @param {*} p\n */\n function filtering (p) {\n return function (rf) {\n // this takes 2 things and makes them 1\n return async (acc, val) => {\n var pred = (await p(val))\n return pred ? rf(acc, val) : { reduced: null } // <-- rf replaces 'concat'\n }\n }\n }\n\n /**\n * Takes toTake records from the stream\n * @param {*} toTake\n */\nfunction take (toTake) {\n // assert(toTake && cnt > 0)\n var count = toTake\n return function (rf) {\n // this takes 2 things and makes them 1\n return async (acc, val) => {\n if ((--count) < 0) {\n return {\n reduced: null\n }\n } else {\n return rf(acc, val)\n }\n }\n }\n}\n\n/**\n * Skips forward in a stream by the toSkip records\n * @param {*} toSkip\n */\nfunction skip (toSkip) {\n // assertMod(toSkip && toSkip >= 0)\n var count = 0\n return function (rf) {\n // this takes 2 things and makes them 1\n return async (acc, val) => {\n if (count++ < toSkip) {\n return { reduced: null }\n } else {\n return rf(acc, val)\n }\n }\n }\n}\n\n/**\n * Samples from a stream at a particular frequency.\n * sample(1000) will sample a value once every second\n * @param {*} period\n */\nfunction sampling (period) {\n // assertMod(cnt && cnt >= 0)\n var last = 0\n return function (rf) {\n return async (acc, val) => {\n var nw = Date.now()\n var diff = nw - last\n // console.log(diff)\n if (diff < period) {\n // console.log('Skip' + val)\n return { reduced: null }\n } else {\n last = nw\n // console.log('Accept' + val)\n return rf(acc, val)\n }\n }\n }\n}\n\n/**\n * Transforms a series of measurements into events. The predicate determines when the measurements continue the event or non-event\n * @param {*} predicate\n */\nfunction eventing (predicate) {\n var latest = null\n var sequence = -1\n return function (rf) {\n return async (acc, val) => {\n sequence++\n var pred = (await predicate(val))\n if (pred && !latest) {\n latest = {\n start: val.time ? val.time : sequence,\n end: val.time ? val.time : sequence\n }\n return { reduced: null }\n } else if (pred && latest) {\n latest.end = val.time ? val.time : sequence\n return { reduced: null }\n } else if (!pred && latest) {\n var next = latest\n latest = null\n return rf(acc, next)\n } else {\n return { reduced: null }\n }\n }\n }\n}\n\n/**\n * Split one event into multiple\n * splitter is a function which maps a value to an array\n */\nfunction split (splitter) {\n return function (rf) {\n // this takes 2 things and makes them 1\n return async (acc, val) => {\n var rs = await splitter(val)\n var reduction = { reduced: [] }\n try {\n var acc2 = acc\n for (var i = 0; i < rs.length; i++) {\n var r = rs[i]\n acc2 = await rf(acc2, r)\n if (acc2.hasOwnProperty('reduced')) {\n if (acc2.reduced) {\n reduction.reduced.push(acc2.reduced)\n }\n } else {\n reduction.reduced.push(acc2)\n }\n }\n return reduction\n } catch (ex) {\n console.log(ex)\n }\n }\n }\n}\n\n/**\n * Randomly samples from a stream with a target frequency.\n * randomFilter(100) will target to sample one value in every 100\n * @param {*} countFrequency - a number\n */\nfunction randomFilter (countFrequency) {\n // assertMod(cnt && cnt >= 0\n return function (rf) {\n return async (acc, val) => {\n var rand = Math.floor((Math.random() * countFrequency))\n if (rand === 0) {\n return rf(acc, val)\n } else {\n return { reduced: null }\n }\n }\n }\n}\n\n /**\n * Make n neighbors available as each stream record is processed.\n * @param {*} numberOfNeighbors\n */\n function neighbors (numNeighbors = 10) {\n var neighbors = []\n\n return function (rf) {\n return async (acc, val) => {\n neighbors.push(val)\n if ((neighbors.length) < numNeighbors) {\n return {\n reduced: null\n }\n } else {\n let first = neighbors[0]\n let enriched = Object.assign({}, first)\n enriched.neighbors = neighbors\n enriched.data = first\n let res = rf(acc, enriched)\n neighbors.shift()\n return res\n }\n }\n }\n }\n\nexport {\n passthrough,\n mapping,\n filtering,\n take,\n skip,\n eventing,\n sampling,\n split,\n randomFilter,\n neighbors\n}\n","\nasync function * makeAsyncRangeIterator (start = 0, end = Infinity, step = 1, delay = 10) {\n let iterationCount = 0\n for (let i = start; i < end; i += step) {\n iterationCount++\n yield new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(i)\n }, delay)\n })\n }\n return iterationCount\n }\n\nfunction makeAsyncHasNextRangeIterator (start = 0, end = Infinity, step = 1) {\n let iterationCount = start\n return {\n hasNext: function () {\n return iterationCount < end\n },\n next: function () {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n resolve(iterationCount++)\n }, 10)\n })\n }\n }\n}\n\nfunction makeArrayIterator (dataArray) {\n let iterationCount = 0\n return {\n hasNext: function () {\n return iterationCount < dataArray.length\n },\n next: function () {\n return dataArray[iterationCount++]\n }\n }\n }\n\nexport {\n makeArrayIterator,\n makeAsyncRangeIterator,\n makeAsyncHasNextRangeIterator\n}\n"],"names":[],"mappings":"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"}
\No newline at end of file