UNPKG

asclasit

Version:

ASync CLasses + ASync ITerators

307 lines (253 loc) 7.47 kB
const {Readable} = require('stream'); const Iter = require('./base'); const $ = require('../func'); Iter.chain_(function *appendArray(iter, to) { for (const item of iter) { to.push(item); yield item; } }); Iter.value_(function toArray(iter, to) { if (to) { for (const item of iter) to.push(item); return to; } return Array.from(iter); }); Iter.chain_(function *prependArray(iter, to) { for (const item of iter) { to.unshift(item); yield item; } }); Iter.value_(function toPrependArray(iter, to) { if (!to) to = []; Iter.exec(Iter.prependArray.gen(iter, to)); return to; }); Iter.chain_(function *appendSet(iter, to) { for (const item of iter) { to.add(item); yield item; } }); Iter.chain_(function *unset(iter, to) { for (const item of iter) { to.delete(item); yield item; } }); Iter.chain_(function *omit(iter, to) { for (let item of iter) { yield item; if (item instanceof Array) item = item[0]; delete to[item]; } }); Iter.value_(function toSet(iter, to) { if (to) { for (const item of iter) to.add(item); return to; } return new Set(iter); }); Iter.chain_(function *appendXorSet(iter, xor) { if (!xor) xor = new Set(); for (const key of iter) { if (xor.has(key)) { xor.delete(key); yield false; } else { xor.add(key); yield true; } } }); Iter.value_(function toXorSet(iter, xor) { if (!xor) xor = new Set(); Iter.exec(Iter.appendXorSet.gen(iter, xor)); return xor; }); Iter.chain_(function *appendObject(iter, obj, value) { for (const item of iter) { if (item instanceof Array) { if (obj) obj[item[0]] = item[1]; yield item; } else if (typeof item === 'object') { if (obj) Object.assign(obj, item); yield* Iter.objectEntries.gen(item); } else { if (obj) obj[item] = value; yield [item, value]; } } }); Iter.value_(function toObject(iter, obj, value) { if (typeof obj !== 'object') { value = obj; obj = Object.create(null); } else if (!obj) obj = Object.create(null); Iter.exec(Iter.appendObject.gen(iter, obj, value)); return obj; }); Iter.chain_(function *appendXorObject(iter, obj, value) { if (typeof obj !== 'object') { value = obj; obj = Object.create(null); } else if (!obj) obj = Object.create(null); for (const item of iter) { if (item instanceof Array) { const key = item[0]; if (key in obj) { delete obj[key]; yield false; } else { obj[key] = item[1]; yield true; } } else { if (item in obj) { delete obj[item]; yield false; } else { obj[item] = value; yield true; } } } }); Iter.value_(function toXorObject(iter, obj, value) { if (typeof obj !== 'object') { value = obj; obj = Object.create(null); } else if (!obj) obj = Object.create(null); Iter.exec(Iter.appendXorObject.gen(iter, obj, value)); return obj; }); Iter.chain_(function *defaultsObject(iter, obj, value) { for (const item of iter) { if (item instanceof Array) { const key = item[0]; if (obj && !(key in obj)) obj[key] = item[1]; yield item; } else if (typeof item === 'object') { const ents = Iter.objectEntries.gen(item); if (!obj) yield* ents; else for (const [k, v] of ents) { if (!(k in obj)) obj[k] = v; yield [k, v]; } } else { if (obj && !(item in obj)) obj[item] = value; yield [item, value]; } } }); Iter.value_(function toDefaultsObject(iter, obj, value) { if (typeof obj !== 'object') { value = obj; obj = Object.create(null); } else if (!obj) obj = Object.create(null); Iter.exec(Iter.defaultsObject.gen(iter, obj, value)); return obj; }); Iter.chain_(function *appendMap(iter, map, value) { for (const item of iter) { if (item instanceof Array) { map.set(item[0], item[1]); yield item; } else { map.set(item, value); yield [item, value]; } } }); Iter.value_(function toMap(iter, map, value) { if (!(map instanceof Map)) { value = map; map = new Map(); } Iter.exec(Iter.appendMap.gen(iter, map, value)); return map; }); Iter.chain_(function *defaultsMap(iter, map, value) { for (const item of iter) { if (item instanceof Array) { const key = item[0]; if (!map.has(key)) map.set(key, item[1]); yield item; } else { if (!map.has(item)) map.set(item, value); yield [item, value]; } } }); Iter.value_(function toDefaultsMap(iter, map, value) { if (!(map instanceof Map)) { value = map; map = new Map(); } Iter.exec(Iter.defaultsMap.gen(iter, map, value)); return map; }); Iter.chain_(function *appendXorMap(iter, map, value) { if (!(map instanceof Map)) { value = map; map = new Map(); } for (const item of iter) { if (item instanceof Array) { const key = item[0]; if (map.has(key)) { map.delete(key); yield false; } else { map.set(key, item[1]); yield true; } } else { if (map.has(item)) { map.delete(item); yield false; } else { map.set(item, value); yield true; } } } }); Iter.value_(function toXorMap(iter, map, value) { if (!(map instanceof Map)) { value = map; map = new Map(); } Iter.exec(Iter.appendXorMap.gen(iter, map, value)); return map; }); Iter.value_(function count(iter) { let c = 0; for (const item of iter) ++c; return c; }); Iter.chain_(function* countTo(iter, to, field = 'count') { for (const item of iter) { yield item; ++to[field]; } }); Iter.value_(function exec(iter) { for (const item of iter); }); Iter.value_(function first(iter) { for (const item of iter) return item; }); Iter.value_(function last(iter) { let last; for (const item of iter) last = item; return last; }); Iter.chain_(function* reduceTo(iter, func, def, out) { const desc = {iter, ctx: this}; let n = 0; if (def == null) { const {value, done} = iter.next(); if (done) return def; def = value; n++; } if (func) { for (const item of iter) { def = func.call(this, def, item, n, desc); n++; yield item; } } else { for (const item of iter) { def += item; n++; yield item; } } if (out) { out.count = n; out.result = def; } }); Iter.value_(function reduce(iter, func, def, out = {}) { const it = Iter.reduceTo.gen.call(this, iter, func, def, out); for (const item of it); return out.result; }); Iter.value_(function stream(iter, to, opts = {}) { const read = Readable.from(iter); if (to) read.pipe(to, opts); opts.stream = read; return to || read; }); Iter.value_(function streams(iter, to, opts = {}) { if (!('end' in opts)) opts.end = false; return Iter.stream.call(this, iter, to, opts); }); Iter.value_(function toIter(it) { return new Iter(it); }); Iter.value_($.feedback); Iter.value_(function to(iter, Class, ...args) { const inst = new Class(iter, ...args); return inst; }); const appendResultFuncs = new Map([ [Object, Iter.appendObject.gen], [Array, Iter.appendArray.gen], [Set, Iter.appendSet.gen], [Map, Iter.appendMap.gen], ]); Iter.chain_(function appendResult(iter, to, ...args) { return (appendResultFuncs.get($.getClass(to)) || Iter.appendObject.gen).call(this, iter, to, ...args); }); const toResultFuncs = new Map([ [Object, Iter.toObject], [Array, Iter.toArray], [Set, Iter.toSet], [Map, Iter.toMap], ]); Iter.value_(function toResult(iter, to, ...args) { return (toResultFuncs.get($.getClass(to)) || Iter.toObject).call(this, iter, to, ...args); }); module.exports = Iter;