From 0715665ab84abd561f4bf5f39dbf4cff1f9099ac Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 5 Feb 2019 19:07:41 +0000 Subject: [PATCH 01/43] docs(geom-voronoi): add example screenshot --- assets/geom-voronoi.jpg | Bin 0 -> 321741 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/geom-voronoi.jpg diff --git a/assets/geom-voronoi.jpg b/assets/geom-voronoi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7dee595db7ce72a15067e6f158c8958d01bb9dce GIT binary patch literal 321741 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 z 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

~E1gn@d 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‹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

cPw@@RZKm5@-%mA! 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 literal 0 HcmV?d00001 From 2b3dd7f4b9218ddc84bff6cca1b75bfacbc48002 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 5 Feb 2019 20:38:37 +0000 Subject: [PATCH 02/43] feat(examples): dynamic chart width (package-stats) --- examples/package-stats/src/dep-chart.ts | 16 +++++++++------- examples/package-stats/src/size-chart.ts | 14 ++++++++------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/examples/package-stats/src/dep-chart.ts b/examples/package-stats/src/dep-chart.ts index 1d4c5c4bcc..94c5e4a18d 100644 --- a/examples/package-stats/src/dep-chart.ts +++ b/examples/package-stats/src/dep-chart.ts @@ -54,37 +54,39 @@ const packageDeps = packages const maxDeps = transduce(pluck(1), max(), packageDeps); +const width = packages.length * 16; + fs.writeFileSync( `package-deps.svg`, serialize( [barChart, { attribs: { - width: 1024, + width: width, height: 260, "font-size": "10px", "font-family": "Iosevka-Term-Light, Menlo, sans-serif" }, x: { - axis: [80, 1010, 170], + axis: [50, width - 15, 170], domain: [0, packageDeps.length, 1], - range: [80, 1020], + range: [50, width - 5], ticks: [...map((x) => x[0].substr(8), packageDeps)], label: labeledTickX }, y: { - axis: [170, 10, 65], + axis: [170, 10, 35], domain: [0, maxDeps, 10], range: [160, 20], - label: labeledTickY(1010) + label: labeledTickY(width - 15) }, axis: "#666", fill: "#0cc" }, mapIndexed((i, m) => [i, m[1]], packageDeps), group({ "font-size": "20px", "text-anchor": "middle" }, - text([552, 28], "@thi.ng/umbrella internal re-use"), - text([552, 56], "(transitive dependents)"), + text([width / 2 + 25, 28], "@thi.ng/umbrella internal re-use"), + text([width / 2 + 25, 56], "(transitive dependents)"), ) ] ) diff --git a/examples/package-stats/src/size-chart.ts b/examples/package-stats/src/size-chart.ts index 89c115248f..15f13d0751 100644 --- a/examples/package-stats/src/size-chart.ts +++ b/examples/package-stats/src/size-chart.ts @@ -35,6 +35,8 @@ const fileSizeChart = const get = getter([1, modType, type]); stats = [...stats].sort((a, b) => get(b) - get(a)); + const width = stats.length * 16; + const maxSize = transduce( mapcat(([_, m]) => [m.esm[type], m.cjs[type], m.umd[type]]), max(), @@ -47,15 +49,15 @@ const fileSizeChart = [barChart, { attribs: { - width: 1024, + width: width, height: 260, "font-size": "10px", "font-family": "Iosevka-Term-Light, Menlo, sans-serif" }, x: { - axis: [80, 1010, 170], + axis: [80, width - 15, 170], domain: [0, stats.length, 1], - range: [80, 1020], + range: [80, width - 5], ticks: [...map((x) => x[0], stats)], label: labeledTickX }, @@ -63,15 +65,15 @@ const fileSizeChart = axis: [170, 10, 65], domain: [0, maxSize, 5 * 1024], range: [160, 20], - label: labeledTickY(1010, bytes) + label: labeledTickY(width - 15, bytes) }, axis: "#666", fill: "#0cc" }, mapIndexed((i, m) => [i, get(m)], stats), group({ "font-size": "20px", "text-anchor": "middle" }, - text([552, 28], `@thi.ng/umbrella package sizes (${modType.toUpperCase()})`), - text([552, 56], `(minified + gzipped)`), + text([width / 2 + 40, 28], `@thi.ng/umbrella package sizes (${modType.toUpperCase()})`), + text([width / 2 + 40, 56], `(minified + gzipped)`), ) ] ) From 3ed4ea12fa62bf8700bf31a481070bbe6a94729f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 7 Feb 2019 00:51:59 +0000 Subject: [PATCH 03/43] fix(hdom): fix #72, update normalizeElement() - ensure empty elements with `__skip` attrib always have at least 1 child --- packages/hdom/src/normalize.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/hdom/src/normalize.ts b/packages/hdom/src/normalize.ts index 575fa7c46c..d7246fd844 100644 --- a/packages/hdom/src/normalize.ts +++ b/packages/hdom/src/normalize.ts @@ -55,7 +55,9 @@ export const normalizeElement = attribs.class = clazz; } } - return [match[1], attribs, ...spec.slice(hasAttribs ? 2 : 1)]; + return attribs.__skip && spec.length < 3 ? + [match[1], attribs, ""] : + [match[1], attribs, ...spec.slice(hasAttribs ? 2 : 1)]; }; /** From d990c3c2088a32955058e8e4b6c48fad34c89c08 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 8 Feb 2019 08:34:13 +0000 Subject: [PATCH 04/43] perf(geom-isoline): minor optimizations - use Uint8Array for pre-coded cells - cellValue() uses pre-computed index --- packages/geom-isoline/src/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/geom-isoline/src/index.ts b/packages/geom-isoline/src/index.ts index f09745f50e..5e49507adf 100644 --- a/packages/geom-isoline/src/index.ts +++ b/packages/geom-isoline/src/index.ts @@ -30,7 +30,7 @@ export const setBorder = const encodeCrossings = (src: ReadonlyVec, w: number, h: number, iso: number) => { - const out: number[] = new Array(src.length); + const out = new Uint8Array(src.length); const w1 = w - 1; const h1 = h - 1; for (let y = 0, i = 0; y < h1; y++) { @@ -47,8 +47,7 @@ const encodeCrossings = }; const cellValue = - (src: ReadonlyVec, w: number, x: number, y: number) => { - const idx = y * w + x; + (src: ReadonlyVec, w: number, idx: number) => { return ( src[idx] + src[idx + 1] + @@ -116,15 +115,16 @@ export function* isolines(src: ReadonlyVec, w: number, h: number, iso: number) { next = true; continue; } - const id = coded[y * w + x]; + const i = y * w + x; + const id = coded[i]; if (id === 5) { [to, clear] = S5[ - (cellValue(src, w, x, y) > iso ? 0 : 2) + + (cellValue(src, w, i) > iso ? 0 : 2) + (from === 3 ? 0 : 1) ]; } else if (id === 10) { [to, clear] = S10[ - cellValue(src, w, x, y) > iso ? + cellValue(src, w, i) > iso ? (from === 0 ? 0 : 1) : (from === 2 ? 2 : 3) ]; From 3e48f6c42b1a6a9e33080f9e50ae77c65f9e2e18 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 10 Feb 2019 16:43:17 +0000 Subject: [PATCH 05/43] minor(transducers): update filterFuzzy docs --- packages/transducers/src/xform/filter-fuzzy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transducers/src/xform/filter-fuzzy.ts b/packages/transducers/src/xform/filter-fuzzy.ts index 9679fdc655..2a73761f18 100644 --- a/packages/transducers/src/xform/filter-fuzzy.ts +++ b/packages/transducers/src/xform/filter-fuzzy.ts @@ -17,7 +17,7 @@ export interface FilterFuzzyOpts { * @thi.ng/equiv by default. * * ``` - * [...filterFuzzy({query: "ho"}, ["hello", "hallo", "hey", "heyoka"])] + * [...filterFuzzy("ho", ["hello", "hallo", "hey", "heyoka"])] * // ["hello", "hallo", "heyoka"] * ``` * From 895da65e4da27ab76c4299cf316490f1ce92057f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 10 Feb 2019 17:44:00 +0000 Subject: [PATCH 06/43] feat(hdom): add scrollTop/Left property support in setAttrib() --- packages/hdom/src/dom.ts | 3 +++ packages/hdom/src/normalize.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/packages/hdom/src/dom.ts b/packages/hdom/src/dom.ts index 06aa938878..632d78dbcb 100644 --- a/packages/hdom/src/dom.ts +++ b/packages/hdom/src/dom.ts @@ -232,7 +232,10 @@ export const setAttrib = case "value": updateValueAttrib(el, val); break; + case "id": case "checked": + case "scrollTop": + case "scrollLeft": // TODO add more native attribs? el[id] = val; break; diff --git a/packages/hdom/src/normalize.ts b/packages/hdom/src/normalize.ts index d7246fd844..4776e1db54 100644 --- a/packages/hdom/src/normalize.ts +++ b/packages/hdom/src/normalize.ts @@ -28,6 +28,9 @@ const isPlainObject = iso; * ["div.bar.baz", {class: "foo"}] => ["div", {class: "foo bar baz"}] * ``` * + * Elements with `__skip` attrib enabled and no children, will have an + * empty text child element injected. + * * @param spec * @param keys */ From f5c7c770e8827fdcd21bf92ef7f388e7f0ce8822 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 10 Feb 2019 18:03:59 +0000 Subject: [PATCH 07/43] feat(examples): add virtual scroller example --- examples/hdom-vscroller/.gitignore | 5 + examples/hdom-vscroller/README.md | 13 +++ examples/hdom-vscroller/index.html | 19 ++++ examples/hdom-vscroller/package.json | 29 ++++++ examples/hdom-vscroller/src/commits.json | 1 + examples/hdom-vscroller/src/index.ts | 114 ++++++++++++++++++++++ examples/hdom-vscroller/src/logo-64.png | Bin 0 -> 5029 bytes examples/hdom-vscroller/src/packages.json | 1 + examples/hdom-vscroller/src/vscroller.ts | 67 +++++++++++++ examples/hdom-vscroller/tsconfig.json | 12 +++ 10 files changed, 261 insertions(+) create mode 100644 examples/hdom-vscroller/.gitignore create mode 100644 examples/hdom-vscroller/README.md create mode 100644 examples/hdom-vscroller/index.html create mode 100644 examples/hdom-vscroller/package.json create mode 100644 examples/hdom-vscroller/src/commits.json create mode 100644 examples/hdom-vscroller/src/index.ts create mode 100644 examples/hdom-vscroller/src/logo-64.png create mode 100644 examples/hdom-vscroller/src/packages.json create mode 100644 examples/hdom-vscroller/src/vscroller.ts create mode 100644 examples/hdom-vscroller/tsconfig.json diff --git a/examples/hdom-vscroller/.gitignore b/examples/hdom-vscroller/.gitignore new file mode 100644 index 0000000000..0c5abcab62 --- /dev/null +++ b/examples/hdom-vscroller/.gitignore @@ -0,0 +1,5 @@ +.cache +out +node_modules +yarn.lock +*.js diff --git a/examples/hdom-vscroller/README.md b/examples/hdom-vscroller/README.md new file mode 100644 index 0000000000..1986c19fc5 --- /dev/null +++ b/examples/hdom-vscroller/README.md @@ -0,0 +1,13 @@ +# hdom-vscroller + +[Live demo](http://demo.thi.ng/umbrella/hdom-vscroller/) + +Please refer to the [example build instructions](https://github.com/thi-ng/umbrella/wiki/Example-build-instructions) on the wiki. + +## Authors + +- Karsten Schmidt + +## License + +© 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/examples/hdom-vscroller/index.html b/examples/hdom-vscroller/index.html new file mode 100644 index 0000000000..e4feadcaf7 --- /dev/null +++ b/examples/hdom-vscroller/index.html @@ -0,0 +1,19 @@ + + + + + + + + hdom-vscroller + + + + + +

+ + + + \ No newline at end of file diff --git a/examples/hdom-vscroller/package.json b/examples/hdom-vscroller/package.json new file mode 100644 index 0000000000..80795da4a3 --- /dev/null +++ b/examples/hdom-vscroller/package.json @@ -0,0 +1,29 @@ +{ + "name": "hdom-vscroller", + "version": "0.0.1", + "repository": "https://github.com/thi-ng/umbrella", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "clean": "rm -rf .cache build out", + "build": "yarn clean && parcel build index.html -d out --public-url ./ --no-source-maps --no-cache --detailed-report --experimental-scope-hoisting", + "start": "parcel index.html -p 8080 --open" + }, + "devDependencies": { + "parcel-bundler": "^1.11.0", + "rimraf": "^2.6.3", + "terser": "^3.14.1", + "typescript": "^3.2.2" + }, + "dependencies": { + "@thi.ng/api": "latest", + "@thi.ng/rstream": "latest", + "@thi.ng/transducers-hdom": "latest" + }, + "browserslist": [ + "last 3 Chrome versions" + ], + "browser": { + "process": false + } +} \ No newline at end of file diff --git a/examples/hdom-vscroller/src/commits.json b/examples/hdom-vscroller/src/commits.json new file mode 100644 index 0000000000..51aae4049b --- /dev/null +++ b/examples/hdom-vscroller/src/commits.json @@ -0,0 +1 @@ +[["d990c3c2","2019-02-08","perf(geom-isoline): minor optimizations"],["3ed4ea12","2019-02-07","fix(hdom): fix #72, update normalizeElement()"],["2b3dd7f4","2019-02-05","feat(examples): dynamic chart width (package-stats)"],["0715665a","2019-02-05","docs(geom-voronoi): add example screenshot"],["74fb4d83","2019-02-05","Publish"],["3b7d8cee","2019-02-05","docs: update main readme"],["c4aaa82b","2019-02-05","build: update various geom packages (deps, tags & readmes)"],["134c353f","2019-02-05","Merge branch 'develop' of github.com:thi-ng/umbrella into develop"],["cf7dc3a3","2019-02-05","feat(bencode): re-import updated bencode pkg"],["f2612a6b","2019-02-05","feat(bencode): re-import updated bencode pkg"],["9d8dd32e","2019-02-05","refactor(vectors): update imports (zip)"],["7f4e3989","2019-02-05","refactor(geom-tessellate): update imports (zip)"],["5204a7fe","2019-02-05","refactor(geom): update imports (zip)"],["29045902","2019-02-05","refactor(color): update imports (zip)"],["f15ea5fc","2019-02-05","refactor(examples): update deps & imports in various examples"],["d1151cea","2019-02-05","refactor(transducers): deprecate & rename tuples() => zip()"],["a7c1ef7b","2019-02-05","refactor(transducers): migrate binary related ops to new package"],["02877c79","2019-02-05","feat(transducers-binary): extract as new pkg from @thi.ng/transducers"],["ae83bb29","2019-02-05","fix(transducers): ensure all vals in hexDump iterator version"],["57d4488a","2019-02-05","feat(math): add PHI const"],["8d61b710","2019-02-05","refactor(examples): minor update iso-plasma"],["678c3ff0","2019-02-02","refactor(examples): update iso-plasma"],["37fb295f","2019-02-02","feat(examples): add iso-plasma demo"],["bd1754d5","2019-02-01","feat(geom-accel): add selectVals() impl"],["4bde37e1","2019-02-01","feat(geom-api): add ISpatialAccel.selectVals()"],["13f655a6","2019-02-01","docs: update main readme"],["d7ccc887","2019-02-01","refactor(vector-pools): update AttribPool & VecPool ctors"],["6d15686a","2019-02-01","refactor(malloc): update MemPoolOpts & MemPool ctor args"],["e30b2111","2019-02-01","feat(geom-isoline): import package (ported from clojure)"],["b7d162fa","2019-02-01","feat(vector-pools): update & fix AttribPool resize logic"],["1b72d1d4","2019-01-31","build: update deps in unreleased packages"],["3529c2f3","2019-01-31","Merge branch 'master' into develop"],["50a5098a","2019-01-31","Publish"],["3adabc4d","2019-01-31","fix(strings): fix #70, replace kebab() regex w/ legacy version"],["a55f4770","2019-01-31","feat(malloc): add reallocArray(), update realloc() & compact(), tests"],["bf8b28fc","2019-01-31","feat(malloc): add realloc(), update free()"],["16b48b38","2019-01-31","fix(vector-pools): AttribPool opts & default handling"],["4acc8318","2019-01-30","feat(examples): update hdom-canvas-shapes (add ellipse test)"],["ea322265","2019-01-30","refactor(geom-isec): update/merge intersectRayRect/AABB"],["5f7dd635","2019-01-30","feat(geom): add ray-rect/aabb impls for intersects()"],["93e2ea65","2019-01-30","feat(geom-isec): add ray-rect/aabb tests, fix ray-line, add NONE, update docs"],["4d19aa20","2019-01-29","perf(geom-voronoi): update computeDual(), update isBoundary()"],["2ff68db7","2019-01-29","feat(geom-voronoi): add support for vertex user data, tolerances, refactor QE changes"],["426cd37f","2019-01-29","refactor(quad-edge): replace QuadEdge class w/ type alias, add docs"],["f249b7e1","2019-01-29","docs: update main readme"],["613ffeba","2019-01-29","Merge branch 'feature/geom-qe' into develop"],["b11837a2","2019-01-29","docs(geom): update readme"],["c903293f","2019-01-29","feat(geom-voronoi): re-import & update QE delaunay/voronoi pkg (MBP2010)"],["ee76797b","2019-01-29","feat(quad-edge): re-import & update quad edge impl (MBP2010)"],["4b852882","2019-01-29","refactor(geom): minor update clippedLine()"],["084883eb","2019-01-29","refactor(geom-clip): minor update liangBarsky"],["6d14f2b7","2019-01-28","refactor(geom): swap Group ctor & factory arg order"],["af099ee5","2019-01-28","build(geom): update geom-clip dep & refs"],["004d7f46","2019-01-28","build(geom-clip): rename pkg geom-clip-convex => geom-clip, update deps"],["6391d104","2019-01-28","refactor(geom-tessellate): update imports / deps"],["31e369bd","2019-01-28","feat(math): add simplifyRatio()"],["226645fd","2019-01-28","refactor(geom): update pointInside & classifyPoint impls (delegate)"],["895102d4","2019-01-28","feat(geom-poly-utils): add convexity(), remove obsolete/migrated point checks"],["6ee03ebc","2019-01-28","feat(geom-api): re-add Convexity enum"],["2b235461","2019-01-28","feat(geom-isec): migrate point intersection/containment checks"],["11bf7232","2019-01-28","minor(geom-closest-point): minor updates"],["f9dd3037","2019-01-28","docs(vectors): update docstrings"],["e2047df3","2019-01-25","Merge branch 'feature/geom-refactor' into develop"],["df8332d0","2019-01-25","refactor(geom): remove obsolete/migrated fns, update deps, readme"],["37741081","2019-01-25","fet(geom-hull): extract from geom as new package"],["68a26f44","2019-01-25","feat(geom-poly-utils): move barycentric fns from main geom pkg"],["74aa9543","2019-01-25","docs(geom): update readme"],["f6a621a3","2019-01-25","docs(geom-subdiv-curve): add docs, minor updates subdivide()"],["87fddb89","2019-01-25","refactor(geom-api): minor update SubdivKernel"],["598fca55","2019-01-25","refactor(poisson): minor optimizations, update PoissonOpts & defaults"],["bee1c89c","2019-01-24","feat(poisson): add geom-api dep, optimize search"],["9022d5bb","2019-01-24","perf(geom-accel): optimize single nearest point search, fix select()"],["18ce6c96","2019-01-24","refactor(geom-api): update ISpatialAccel"],["5c98ed70","2019-01-24","refactor(geom-api): split into separate files, add ISpatialAccel"],["03352e11","2019-01-23","refactor(examples): update geom-tessel demo"],["b223603d","2019-01-23","refactor(geom): update to use geom-api types"],["f7ad4d3b","2019-01-23","refactor(geom-tessellate): update to use geom-api types"],["0964a956","2019-01-23","refactor(geom-subdiv-curve): update to use geom-api types"],["5b674154","2019-01-23","refactor(geom-splines): update to use geom-api types"],["8d878b99","2019-01-23","refactor(geom-resample): update to use geom-api types, add douglas-peucker"],["27c4bf07","2019-01-23","refactor(geom-isec): update return types, use geom-api"],["47fb5e7b","2019-01-23","minor(geom-clip-convex): update imports"],["e36e2213","2019-01-23","refactor(geom-arc): update to use geom-api types"],["4e53293d","2019-01-23","feat(geom-api): extract from geom as new package"],["02231a3a","2019-01-23","build: update make-module script"],["407e9a54","2019-01-23","docs: update readmes"],["fb532b8c","2019-01-23","refactor(geom): remove obsolete/extracted internal ops, update publics"],["cb2429c4","2019-01-23","feat(geom-tessellate): extract from geom as new package"],["324a5162","2019-01-23","feat(geom-subdiv-curve): extract from geom as new package"],["5ef4c56d","2019-01-23","feat(geom-poly-utils): extract from geom as new package"],["798de06b","2019-01-23","feat(geom-closest-point): add more fns, update pkg"],["2054574a","2019-01-23","fix(geom-arc): add bounds return type, add missing re-export, update pkg"],["2440ffdd","2019-01-23","feat(vectors): add corner2, clockwise2, signedAreaC2, isInArray fns"],["9576920b","2019-01-23","build: simplify bundle-module script, update build cmds in all packages"],["58e0a05d","2019-01-23","feat(vectors): add VecPair type alias, add copyVectors()"],["15d67121","2019-01-23","feat(geom-clip-convex): extract from geom as new package"],["027150a6","2019-01-23","feat(geom-splines): extract from geom as new package"],["6cc8c738","2019-01-23","feat(geom-arc): extract from geom as new package (#69)"],["79abd0ba","2019-01-23","feat(geom-resample): extract from geom as new package"],["285dde49","2019-01-23","feat(geom-isec): extract from geom as new package"],["4ff5005a","2019-01-23","feat(geom-closest-point): extract from geom as new package"],["cae83948","2019-01-22","feat(math): add minError() search"],["e998610c","2019-01-22","Publish"],["35a0a59e","2019-01-22","fix(examples): update canvas examples due to recent package changes"],["c6023793","2019-01-22","feat(geom): add asPolyline() multi-fn"],["a017b10a","2019-01-22","feat(geom): add attrib support to PathBuilder"],["8c1df496","2019-01-22","fix(geom): update Rect.toHiccup() format (separate widht/height vals)"],["1d92c8c3","2019-01-22","feat(hdom-canvas): add color dep, update color attrib handling"],["783d9faf","2019-01-22","docs(hiccup-svg): update readme, add attrib conv notes, fix example"],["7f6011e7","2019-01-22","feat(hiccup-svg): add color dep, add attrib conversion for all elements"],["571fc704","2019-01-21","docs: update main readme"],["124acdb1","2019-01-21","docs(poisson): add/update doc strings, readme, example screenshot"],["d098aff5","2019-01-21","Publish"],["193f9d4a","2019-01-21","feat(poisson): re-import & update poisson package (MBP2010)"],["8fd5728b","2019-01-21","fix(geom-accel): add root null check for select/selectKeys()"],["3d499ad5","2019-01-21","refactor(geom): update tangentAt(), use direction() from vectors pkg"],["07d5f8fc","2019-01-21","feat(vectors): migrate direction(), normalLeft/Right2() from geom pkg"],["862ed083","2019-01-21","docs(color): update readme"],["4cd3850b","2019-01-21","docs(vectors): update readme"],["d7053813","2019-01-21","docs(vector-pools): update readme"],["0d10d507","2019-01-21","docs: prune changelogs"],["348e7303","2019-01-21","Publish"],["b9cea8cc","2019-01-21","refactor(vectors): update angleBetween*() fns, add absInner opt arg"],["a78bd87b","2019-01-21","feat(math): add absInnerAngle()"],["7c1bf047","2019-01-21","refactor(examples): update gesture-analysis demo"],["822d8fba","2019-01-21","docs: update readme links / package names"],["31595ebe","2019-01-20","Merge branch 'master' of github.com:thi-ng/umbrella"],["51723f99","2019-01-20","build(pointfree-lang): fix UMD identifier"],["15e4cb2d","2019-01-20","Merge branch 'feature/vec-refactor' into develop"],["b5842fa7","2019-01-20","docs(geom): update readme"],["74b7a38a","2019-01-20","build(vectors): refix version to previous"],["0779337d","2019-01-20","build: update vectors3 => vectors references everywhere"],["0fd2498e","2019-01-20","build(vectors): replace old vectors package w/ vectors3 (renamed back to vectors)"],["4bd77082","2019-01-20","build: update geom3 => geom references"],["682385a1","2019-01-20","build(geom): replace old geom package w/ geom3"],["ff503669","2019-01-20","build: update depgraph script to display per package deps/dependents"],["2f26cf68","2019-01-20","docs(hdom-canvas): fix readme example"],["8e2c8b5c","2019-01-20","refactor(geom): update withAttribs() return type"],["9a507694","2019-01-20","feat(hdom-canvas): add ellipse() / ellipticArc(), update readme"],["6f341c5c","2019-01-20","docs(vector-pools): fix AttribPool example layout"],["db4a2018","2019-01-20","feat(geom): re-add barycentric conversions, collation mappers (still unused)"],["08f7bd16","2019-01-20","docs(matrices): add docstrings for most fns"],["2aceab97","2019-01-20","feat(matrices): add m22 & m23 matrix converters"],["311b0074","2019-01-20","feat(vectors): add default output handling for set/setC/setS fns"],["12ad59a1","2019-01-20","refactor(examples): update geom-knn & geom-tessel demos"],["5ca58032","2019-01-19","refactor(color): remove circular dependencies, update parseCss()"],["5270143a","2019-01-19","refactor(defmulti): remove optional excess args from type sigs"],["5d087367","2019-01-19","refactor(examples): update geom-knn demo"],["485051db","2019-01-19","refactor(geom-accel): update to use new vectors package"],["46bb8730","2019-01-19","build: remove obsolete geom2 package"],["370f9280","2019-01-19","fix(hiccup-svg): convert path arc segment axis theta to degrees"],["63b3a5d9","2019-01-19","feat(geom): update closestPoint(), add support for Arc"],["0e5e7768","2019-01-19","feat(geom): add arcPointAt() helper, refactor Arc, minor other updates"],["62ec49fe","2019-01-19","fix(geom): update arcFrom2Points()"],["910529dd","2019-01-19","feat(geom): add splitNearPoint() for line & polyline, update Sampler"],["499e14b3","2019-01-18","refactor(geom): add tessellate() multi-fn, move/rename tessellators"],["1d754eb9","2019-01-18","feat(geom): add splitNearPoint(), Sampler.closestT(), internal restructure"],["0451f8f6","2019-01-18","docs: update main readme"],["9623b4e9","2019-01-18","build(geom): add @thi.ng/compose dependency"],["9a4570bf","2019-01-18","minor(geom): minor updates"],["56f60372","2019-01-18","feat(geom): add flip() impls"],["ebc9a981","2019-01-18","feat(geom): add pointAt() impls for Cubic/Quadratic"],["eaf1a1b0","2019-01-18","feat(geom): add closestPoint() impls for splines, line, polygons, polyline"],["627e20d4","2019-01-18","feat(geom): add transform() impls for Cubic/Quadratic"],["d763621c","2019-01-18","feat(geom): add clippedLine(), minor update liangBarsky()"],["cd59f664","2019-01-18","perf(geom): use squared dist for classifyPoint() (circle)"],["e834597c","2019-01-18","feat(geom): add/update edges(), pointInside() & classifyPoint() impls"],["f5a53ca0","2019-01-18","feat(geom): re-add vertices() impls for Cubic/Quadratic"],["3c9a7b0f","2019-01-18","feat(geom): re-add pathFromSvg()"],["66267e22","2019-01-18","feat(geom): add intersection checks & intersects() multi-fn"],["f1f428a2","2019-01-17","feat(geom): re-add tessellators"],["9f91cfa1","2019-01-17","fix(api): update assert(), re-export mixin()"],["5f873009","2019-01-17","feat(vectors): add randMinMax"],["d09cc795","2019-01-17","feat(geom): add clipConvex, scatter, warpPoints"],["61cfb0f1","2019-01-16","feat(geom): add path builder, path & arc op impls"],["e81d8c31","2019-01-16","feat(vectors): update/split angleBetween for 2d/3d"],["df49c71c","2019-01-16","Merge branch 'master' into develop"],["a6e6f2af","2019-01-16","Merge pull request #68 from evilive3000/fix-cache-ltru"],["c3762e97","2019-01-16","fix(cache): TLRU: expected behavior on getSet()"],["2cc682a6","2019-01-16","fix(examples): add release() lifecycle method (hdom-inner-html)"],["4effc0ec","2019-01-16","feat(examples): add hdom-inner-html demo #67"],["fea8fbe3","2019-01-16","feat(geom): re-add arc, cubic, quadratic ops, splitAt & other ops"],["18437026","2019-01-16","perf(vectors): update copy()"],["446a1832","2019-01-16","fix(vectors): minor update opt arg in VecOp*"],["66e45ccd","2019-01-15","build: update .npmignore files"],["253b1be9","2019-01-15","Merge branch 'develop' into feature/vec-refactor"],["a75f1920","2019-01-15","docs: update/fix various readmes"],["1cfefdab","2019-01-15","refactor(malloc): update imports"],["c8d8a37e","2019-01-15","refactor(malloc): add/extract types to api.ts"],["e04eb294","2019-01-11","refactor(defmulti): update imports, fix tests (cherry picked from cdd8659a)"],["89dafa45","2019-01-15","build: update bundle-module script, disable minification in UMD outputs"],["b63d2589","2019-01-15","docs(transducers): update cat() docstring"],["b70e84d7","2019-01-15","build: update .npmignore files (add .meta)"],["9eb6f2d2","2019-01-15","build: update rollup dev dep"],["491980c3","2019-01-15","Merge branch 'develop' into feature/vec-refactor"],["d118464b","2019-01-15","test(vectors): update tests (due to math eqDelta change in eps handling)"],["c0e3a0bc","2019-01-15","feat(geom): add temp geom3 package (another refactored version of geom2)"],["e28f56ec","2019-01-15","Merge branch 'develop' into feature/vec-refactor"],["50180096","2019-01-15","feat(math): update eqDelta w/ adaptive eps, rename old => eqDeltaFixed"],["a39811c6","2019-01-15","feat(hiccup-svg): add ellipse shape type, update convert()"],["d14c94b2","2019-01-15","build: disable minification for UMD outputs"],["c12ad1cc","2019-01-15","test(vectors): update eqDelta tests"],["18aeb49c","2019-01-15","build(vectors): add memoize dep"],["61e40638","2019-01-14","feat(vectors): add addm/addmN, subm/submN"],["d5ba06a4","2019-01-11","build: remove obsolete temp package vectors2"],["aa995682","2019-01-11","Merge branch 'develop' into feature/vec-refactor"],["507218aa","2019-01-11","minor(examples): update package-stats"],["fcbc0c27","2019-01-11","build: update bundle-module, strip comments, add source maps & dev deps"],["048bdb1c","2019-01-11","refactor(vectors2): update imports"],["f3a5e0ff","2019-01-11","refactor(malloc): update imports"],["c41b96fb","2019-01-11","refactor(geom): update imports, fix tests"],["cdd8659a","2019-01-11","refactor(defmulti): update imports, fix tests"],["c9da5485","2019-01-11","build(examples): update geom-tessel tsconfig"],["82f8ef27","2019-01-10","revert(hiccup-svg): undo merge mistake in convert.ts"],["a7ea1fc3","2019-01-10","build(vectors): build: update package scripts, outputs, imports"],["d4eddef2","2019-01-10","build(vectors2): build: update package scripts, outputs, imports"],["372c199c","2019-01-10","build(vector-pools): build: update package scripts, outputs, imports"],["5d25c1ae","2019-01-10","build(matrices): build: update package scripts, outputs, imports"],["e247386c","2019-01-10","build(geom): build: update package scripts, outputs, imports"],["4e48cb98","2019-01-10","build(color): build: update package scripts, outputs, imports"],["d7d237d0","2019-01-10","Merge branch 'develop' into feature/vec-refactor"],["ab159105","2019-01-10","test(api): fix import in mixin test"],["c91df5fc","2019-01-10","build: add test-only yarn script"],["6be3a871","2019-01-10","build: fix cjs output path in bundle-module script"],["3741663f","2019-01-10","Merge branch 'feature/multi-output' into develop"],["f6e3cdd5","2019-01-10","docs(examples): add troubleshooting notes"],["bbe636f4","2019-01-10","fix(examples): add quote escaping in xml-converter"],["bb3db27c","2019-01-10","build(examples): update tsconfig for commit-table-ssr"],["cc26ae98","2019-01-10","docs(examples): update readmes to refer to wiki build instructions"],["8f270dfa","2019-01-10","build: update project tpl scripts, ignore files"],["1f01bf8f","2019-01-10","build: update make-module script"],["4df9ec41","2019-01-10","build: update bundle-module outputs, emit meta data, update .gitignore"],["a894a24a","2019-01-10","fix(transducers): update juxt re-export"],["5c3080d7","2019-01-10","build: temporarily add webpack until parcel-bundler/parcel#2513 is fixed"],["bac59db6","2019-01-10","feat(examples): add package-stats charting example"],["27438f9c","2019-01-09","minor(examples): cleanup"],["4e28b5a6","2019-01-09","build(examples): update dev deps"],["1618c136","2019-01-09","build(examples): enable scope hoisting in `yarn build` scripts"],["d2d7952e","2019-01-08","minor: update imports in readme's / examples"],["3f1b79de","2019-01-08","build: update .gitignore"],["3747ad7b","2019-01-08","refactor(examples): update imports & deps of all examples"],["3b8576f3","2019-01-08","fix(csp): disable __State reverse enum lookup"],["d89f28fd","2019-01-08","fix(rstream-log): remove __Level reverse enum lookup, update Level (non const)"],["19449e8d","2019-01-08","fix(rstream-gestures): disable __GestureType reverse enum export"],["b238a3a9","2019-01-08","fix(rstream): disable __State reverse enum lookups"],["227be4b5","2019-01-08","fix(pointfree-lang): update NodeType handling"],["b198c195","2019-01-08","fix(hiccup-markdown): re-export TagFactories interface"],["f912a84a","2019-01-08","build: update package scripts, outputs, imports in remaining packages"],["b54b703d","2019-01-08","build: update package build scripts & outputs, imports in ~50 packages"],["f913d7bf","2019-01-08","build(api): update package build scripts / outputs"],["7fee8573","2019-01-08","build: update shared dev deps, rewrite bundle-module script"],["4e768394","2019-01-07","Merge branch 'develop' into feature/multi-output"],["d3944fb0","2019-01-07","build: switch travis to use node 10"],["a42b2e11","2019-01-07","refactor(rstream-query): use rstream nextID() util (fix regression)"],["3e1467fa","2019-01-07","refactor(rstream-log): use rstream nextID() util (fix regression)"],["c28ce64f","2019-01-07","Merge branch 'develop' into feature/multi-output"],["b31065bb","2019-01-07","Merge branch 'develop' of github.com:thi-ng/umbrella into develop"],["28f77e60","2019-01-07","build: update tsconfig & .npmignore files in all packages"],["4be67c59","2019-01-07","build: prep api, atom, bench, binary, checks, equiv, errors, paths for multi outputs"],["3df29305","2019-01-06","Merge pull request #66 from acarabott/feature/scaleWithCenter"],["92bce73d","2019-01-06","fix(vectors): fix NaNs in Mat23.scaleWithCenter"],["d1e275bd","2019-01-05","fix(rstream): avoid Subscription ctor to workaround parceljs build issue"],["e201ca8d","2019-01-05","refactor(rstream): replace Subscription.NEXT_ID w/ nextID() util"],["a313d830","2019-01-05","build: add/update dev deps, update build scripts in all packages"],["ce4b5283","2019-01-05","refactor(transducers-hdom): use arrow fns"],["e103d740","2019-01-05","refactor(transducers-fsm): use arrow fns"],["48670f58","2019-01-05","refactor(memoize): use arrow fns"],["5d530286","2019-01-05","refactor(csp): use arrow fns"],["e9f0542a","2019-01-05","refactor(transducers): use arrow fns"],["6eba2415","2019-01-05","refactor(rle-pack): use arrow fns"],["762db4e3","2019-01-05","refactor(rstream-csp): use arrow fns"],["8904cb4c","2019-01-05","refactor(rstream-gestures): use arrow fns"],["393d23ed","2019-01-05","minor(rstream-query): update formatting"],["14c00b29","2019-01-05","refactor(rstream-log): use arrow fns"],["ff9f8e0c","2019-01-05","minor(rstream-graph): update formatting"],["6c3ea083","2019-01-05","refactor(rstream): use arrow fns, update formatting"],["e0f7cb85","2019-01-05","minor(resolve-map): update formatting"],["560207a0","2019-01-05","refactor(math): use arrow fns"],["ad5574b9","2019-01-05","refactor(iterators): use arrow fns"],["3b74de92","2019-01-05","refactor(hiccup-css): use arrow fns"],["d9f4bd3f","2019-01-05","refactor(errors): use arrow fns"],["35377bd5","2019-01-05","refactor(compose): use arrow fns"],["025412a0","2019-01-05","refactor(compare): use arrow fns"],["aaf2723f","2019-01-05","refactor(associative): use arrow fns, update formatting"],["30c59fd5","2019-01-05","Merge branch 'feature/arrowfns' into develop"],["fc22a27e","2019-01-05","refactor(paths): update all as arrow fns"],["b70a3e1a","2019-01-05","refactor(checks): update all as arrow fns"],["3038a844","2019-01-04","docs(hiccup-markdown): update readme"],["634e2504","2019-01-04","Publish"],["343280d8","2019-01-04","refactor(examples): update MD demo, use parser from hiccup-markdown package"],["35db07fe","2019-01-04","feat(hiccup-markdown): add & refactor markdown parser (from example), update docs"],["5f09d3ec","2019-01-04","fix(examples): add missing return types"],["ffc68cef","2019-01-04","Merge branch 'develop' into feature/vec-refactor"],["6030753a","2019-01-04","Publish"],["492992d7","2019-01-04","docs: update package list in main readme"],["17c14b49","2019-01-04","docs(examples): update readmes"],["0a505c1a","2019-01-04","docs(fsm): update readme & package"],["98081e3a","2019-01-04","Merge branch 'feature/fsm' into develop"],["81e3fc79","2019-01-04","feat(fsm): add never(), optimize alts(), add docs for all matchers"],["297356dd","2019-01-04","docs(examples): update readme"],["120a7afd","2019-01-04","refactor(examples): remove 2nd table row in collectTable()"],["b60bf31a","2019-01-04","refactor(examples): cleanup parser & rules, tag handling, update readme"],["9585b86e","2019-01-04","feat(examples): add initial MD table support"],["a9336075","2019-01-04","feat(fsm): update not()"],["980d4888","2019-01-04","feat(examples): update MD parser, styles, readme"],["992f31ac","2019-01-04","feat(fsm): add always(), lit(), not(), cleanup imports"],["995a104b","2019-01-03","refactor(examples): update title & blockquote parsers/style"],["4a9bb3d6","2019-01-03","feat(fsm): add support for lookahead-1, add docs"],["f9cece70","2019-01-03","refactor(examples): update MD title parser"],["55671fc7","2019-01-03","feat(fsm): add repeat(), success(), refactor all matchers"],["36cadc96","2019-01-03","feat(examples): update tags, add hrule, blockquote, update CSS / readme"],["b04e0747","2019-01-03","feat(examples): update MD parser, add parse rules & custom tag support"],["9875cda8","2019-01-03","feat(examples): add markdown parser example"],["e03390b1","2019-01-03","feat(fsm): import fsm package"],["731ede02","2019-01-02","build: update deps (defmulti / transducers)"],["5b98d55e","2019-01-02","Merge branch 'develop' into feature/vec-refactor"],["26a29cf1","2019-01-02","Publish"],["1d29153c","2019-01-02","feat(defmulti): add opt fallback arg for defmultiN(), update docs"],["cd175866","2019-01-02","fix(transducers): add reduced() handling for cat()"],["161199f4","2019-01-02","feat(geom): add/rename type ids, add sphere, isec fns"],["2e6d1965","2019-01-02","fix(vectors): disable default prefix for random*() fns"],["2fb2aa32","2019-01-01","build: update deps"],["ba755f8a","2019-01-01","Merge branch 'develop' into feature/vec-refactor"],["7729d993","2019-01-01","Publish"],["488698a6","2019-01-01","feat(defmulti): add addAll(), add/update doc strings"],["d47798ed","2019-01-01","refactor(examples): update gesture analysis demo"],["b10c8d67","2019-01-01","refactor(geom): prep/update intersectShape() w/ new dispatch fn"],["c0008a7a","2018-12-31","minor(geom): update formatting"],["7cf5f7c4","2018-12-31","refactor(geom): update subdivKernel* fns"],["76c343c3","2018-12-31","feat(geom): add pointAt/tangentAt impls for circle/line"],["b9125168","2018-12-31","feat(geom): add ray skeleton impl"],["c7052171","2018-12-31","fix(vectors): cartesian2/3"],["52fb9399","2018-12-31","feat(matrices): add quatToMat33, update readme"],["4c6fe066","2018-12-31","fix(matrices): re-add persp divide in mulV344()"],["4f024918","2018-12-31","fix(matrices): scaleWithCenter* (add missing concat() arg)"],["6d58c309","2018-12-30","docs: rename pd image (because of GH CDN issues), update readme"],["cfc88744","2018-12-30","docs(color): add porterduff image"],["83a46311","2018-12-30","docs: fix readme links"],["0ee2be0a","2018-12-30","docs: update readmes"],["10fc9cc5","2018-12-30","docs(matrices): update readme (add full API list)"],["4f2f512c","2018-12-30","build(matrices): update deps"],["ae7a039e","2018-12-30","feat(matrices): add cwise matrix multiply, rename mul* => mulM*, move mulQ"],["c70189aa","2018-12-30","docs(vectors): update readme"],["7e19e7b4","2018-12-30","minor(vectors): minor update vop()"],["66036e6c","2018-12-30","fix(vectors): update gvec prop lookup & interning"],["6c9fe88e","2018-12-30","refactor(vectors): rename addWeighted*() => addW*(), update package kw"],["064d61c5","2018-12-30","docs(vectors): update readme & package keywords"],["d462ae0a","2018-12-30","perf(matrices): use setC6() for M23 ops"],["809383c9","2018-12-30","refactor(matrices): extract m33to44/m44to33() into own files, update re-exports"],["0ee306a2","2018-12-30","feat(vectors): add setC6()"],["0b07ac86","2018-12-30","fix(matrices): inject default output handling code"],["b5adea6f","2018-12-30","refactor(matrices): replace setValues*() w/ setC*(), update dotC*() use"],["b03b9192","2018-12-30","feat(matrices): add quaternion fns"],["06dd9634","2018-12-30","fix(vectors): result handling jitter()/project()"],["745053c5","2018-12-30","refactor(vector): minor updates arg/result handling"],["cfe333fe","2018-12-30","refactor(vectors): simplify various ops, improve tpl re-use"],["6b3608da","2018-12-30","fix(vectors): sum() impls"],["9b789bca","2018-12-30","refactor(vectors): simplify various ops, use setC*()"],["809bf9b9","2018-12-30","refactor(vectors): rename dotValues*() => dotC*()"],["6857f347","2018-12-30","feat(vectors): add clamp01(), clamp11() fns"],["dc6f4661","2018-12-30","refactor(vectors): add defMathOp()/defMathNOp(), update basic math ops"],["784f5c34","2018-12-29","build: update deps"],["b849bd1b","2018-12-29","feat(color): add alpha()/setAlpha(), add docs, re-exports, update readme"],["e7bb46b7","2018-12-29","feat(color): add Hue enum, closestHue*() fns, namedHueRgba()"],["172f5070","2018-12-29","docs(color): update readme"],["9d4fffa1","2018-12-29","build(color): add package keywords"],["aa303442","2018-12-29","feat(color): add convert() fallback, minor other updates"],["445b8c1f","2018-12-29","feat(color): add luminance defmulti"],["36b7d038","2018-12-29","refactor(color): rename, update matrix ops"],["f2cac286","2018-12-29","refactor(color): update type factory fns & ensureArgs()"],["a0f19956","2018-12-29","Merge branch 'develop' into feature/vec-refactor"],["b2cab4d0","2018-12-29","Publish"],["a90a712c","2018-12-29","fix(transducers): interpolate() interval selection, add minPos/maxPos"],["b0d28788","2018-12-29","refactor(color): update multiCosineGradient(), update readme"],["0546839d","2018-12-29","refactor(color): ColorMode const enum, update convert() dispatcher"],["a5c53c38","2018-12-29","fix(color): add/update conversions"],["04c38372","2018-12-28","refactor(color): update converters"],["4ca7a23d","2018-12-28","Merge branch 'feature/vec-refactor' into feature/color"],["a72562cf","2018-12-28","Merge branch 'develop' into feature/vec-refactor"],["eae8d140","2018-12-28","Publish"],["846ab5ca","2018-12-28","feat(transducers): add interpolate() iterator, update readme"],["dbbb26cf","2018-12-28","feat(color): add multiCosineGradient()"],["46013514","2018-12-28","refactor(color): update conversions"],["0a9456bf","2018-12-28","docs(color): update readme"],["1c28c22b","2018-12-28","fix(color): HCYA field names"],["e930d736","2018-12-28","feat(color): add more color spaces, refactor, rename, simplify"],["714381de","2018-12-27","perf(color): refactor porterDiff as HOF, update all PD ops, add docs"],["d0b1e60e","2018-12-27","refactor(color): add AColor, re-use for existing wrappers, update deps"],["f515f6cb","2018-12-27","Merge branch 'feature/vec-refactor' into feature/color"],["ef4562a2","2018-12-27","build: update deps"],["95ac1e86","2018-12-27","Merge branch 'feature/vec-refactor' into feature/color"],["5b49e70d","2018-12-27","Merge branch 'develop' into feature/vec-refactor"],["ea0dee0f","2018-12-27","Publish"],["3f9b2443","2018-12-27","refactor(pointfree): re-use comp() from thi.ng/compose"],["1ebfea95","2018-12-26","fix(compose): fix comp() for arities >10"],["0061b21f","2018-12-26","feat(compose): add threadFirst/Last, rename compI => compL"],["5788646f","2018-12-26","feat(color): add/update class wrappers"],["7a735f2d","2018-12-25","refactor(vectors): update gvec, Vec2/3/4, extract iterator impl"],["7bcd21ac","2018-12-24","Merge branch 'feature/vec-refactor' into feature/color"],["aa5ad976","2018-12-24","fix(vectors): update field names in declareIndex()"],["0caf599b","2018-12-24","Merge branch 'feature/vec-refactor' into feature/color"],["5620483b","2018-12-24","refactor(vector-pools): update IVector refs (new field names)"],["0c0fce6a","2018-12-24","feat(vectors): update gvec, add generic setS()"],["6e6a33ce","2018-12-24","refactor(vectors): update IVector (rename fields), add ICopyView"],["c2556c2e","2018-12-24","refactor(vectors): update declareIndices, extract single declareIndex fn"],["610699ab","2018-12-24","feat(color): add RGBA/HSLA wrapper types, update convert"],["404ac54b","2018-12-24","feat(color): add HSI converters, add clampH(), minor refactors"],["a5d2f98e","2018-12-23","feat(color): add Porter-Duff ops, pre/post-multiply, update types"],["8fa05c3d","2018-12-22","feat(math): add constants"],["eb5f6391","2018-12-22","feat(vectors): add setC()"],["0b51ef1c","2018-12-22","feat(color): add new package"],["946af71e","2018-12-21","Merge branch 'feature/vec-refactor' into feature/color"],["0099c27c","2018-12-21","Merge branch 'develop' into feature/vec-refactor"],["ec6084b5","2018-12-21","Publish"],["6618c226","2018-12-21","feat(hdom): add support for event listener options, update readme"],["696a0ce3","2018-12-21","Merge branch 'feature/vec-refactor' into feature/color"],["f617c7ec","2018-12-21","Merge branch 'develop' into feature/color"],["e49d3caa","2018-12-21","Merge branch 'develop' into feature/vec-refactor"],["62418f90","2018-12-21","Publish"],["9f48a760","2018-12-21","fix(hdom): fix #63 update removeChild() (IE11)"],["e2874932","2018-12-21","build(geom): update deps"],["c8e25bb0","2018-12-21","build(vectors): update deps"],["b130a944","2018-12-21","refactor(vectors): rename mapBufferV* fns => mapV*"],["8b582cb5","2018-12-21","refactor(vectors): extract & reuse Vec2/3/4 static fns, add copyView()"],["a916f3e7","2018-12-20","Merge branch 'develop' into feature/vec-refactor"],["802fab85","2018-12-20","Publish"],["61b7b117","2018-12-20","feat(iterators): add `children` arg for walk()/walkIterator()"],["f44070e4","2018-12-20","Publish"],["caad2d38","2018-12-20","docs: update package list"],["9984c51d","2018-12-20","Merge branch 'feature/hiccup-markdown' into develop"],["58f591e8","2018-12-20","feat(hiccup-markdown): add new package"],["df38394e","2018-12-20","refactor(hiccup): export normalize() fn"],["9884a67c","2018-12-19","build: update depgraph script"],["2a43bf37","2018-12-19","Publish"],["a78c6a7f","2018-12-19","feat(intervals): add Interval.parse(), update docs, readme, deps"],["6d753f98","2018-12-18","Merge branch 'develop' into feature/vec-refactor"],["47782618","2018-12-18","Publish"],["8545ded8","2018-12-18","Merge branch 'develop'"],["82814288","2018-12-18","docs: update package list"],["14a8a634","2018-12-18","docs: update package list"],["b0a31426","2018-12-18","feat(intervals): add new package"],["33bcd152","2018-12-17","Publish"],["04705053","2018-12-17","fix(transducers): add return type for range()"],["aa128298","2018-12-17","build: update deps"],["6201c9b8","2018-12-17","Merge branch 'develop' into feature/vec-refactor"],["1d5278f8","2018-12-16","Publish"],["6d85c626","2018-12-16","fix(hdom): life cycle init / release handling"],["159ce8f6","2018-12-15","Publish"],["a3290b08","2018-12-15","build: update deps in make-* scripts"],["32847a91","2018-12-15","build(examples): update deps"],["aac8b6f6","2018-12-15","feat(hiccup-css): add animation(), add test & update readme"],["3b3e5032","2018-12-14","fix(pointfree-lang): update parser stubs (TS3.2.x)"],["0436c506","2018-12-14","build: update dev deps in all packages"],["dae12057","2018-12-14","minor(hiccup-carbon-icons): fix repo link"],["a7491117","2018-12-14","Publish"],["d734b570","2018-12-14","docs: update package list (main readme)"],["da441c18","2018-12-14","feat(hdom-components): merge button & button group attribs"],["6b04e160","2018-12-14","feat(hiccup-carbon-icons): add new package"],["b86737a6","2018-12-14","feat(examples): update xml-converter cli arg handling (var name)"],["87e6cb31","2018-12-13","docs: update main readme"],["388c14b4","2018-12-13","Merge branch 'develop' into feature/vec-refactor"],["e36a7ee0","2018-12-13","Publish"],["151e1422","2018-12-13","docs(hdom): update readme"],["fbbf5f90","2018-12-13","minor(examples): update source links"],["582c69ff","2018-12-13","Merge branch 'feature/hdom-skip' into develop"],["fea3d777","2018-12-13","fix(examples): minor update hdom-benchmark2"],["8155bf4b","2018-12-13","feat(examples): add proper DOM stats calculation, remove interlacing (obsolete)"],["2ff75609","2018-12-13","perf(examples): update __skip handling in hdom-benchmark2"],["92c11107","2018-12-13","feat(examples): improve axis tick resolution estimate in crypto-chart"],["c3b1528f","2018-12-13","feat(examples): add more UI & controls to hdom-benchmark2"],["a40c0f5e","2018-12-13","minor(hdom-components): minor updates fpsCounter()"],["10afa0d5","2018-12-13","docs(examples): update hdom-skip comments"],["db4d0a58","2018-12-13","Merge branch 'develop' into feature/hdom-skip"],["1b298f76","2018-12-13","fix(strings): update kebab()"],["8dcc73a1","2018-12-13","feat(strings): add slugify()"],["ba0d5e5c","2018-12-13","docs(examples): update readme list"],["73a298df","2018-12-13","refactor(hdom-components): emit int coords for sparkline"],["baa1dfef","2018-12-13","feat(examples): add hdom-benchmark2 example"],["ebd33808","2018-12-13","feat(hdom-components): add FPS counter & sparkline components, update deps"],["c1fecc4d","2018-12-12","refactor(hdom-mock): update text node handling, tests, add readme"],["1dc6e721","2018-12-12","minor(hdom): intern strings"],["046ab206","2018-12-12","minor(hiccup): reformat"],["d3500df5","2018-12-12","feat(hiccup): add __skip support, add test, update readme"],["5609d24a","2018-12-11","feat(hdom-mock): add hdom-mock package and implementation, add initial tests"],["fe9a3120","2018-12-11","refactor(hdom): update createTextElement() sig, update docstrings"],["6db31708","2018-12-11","fix(transducers-hdom): integrate recent hdom updates"],["43327c9e","2018-12-11","refactor(hdom-canvas): update HDOMImplementation, add __skip support, reformat"],["69b29ad7","2018-12-11","docs(hdom): add __skip attrib docstring"],["6f2e8ee0","2018-12-11","refactor(hdom): extend & simplify HDOMImplementation, update DEFAULT_IMPL"],["8dc755d9","2018-12-10","minor(examples): fix typo"],["6d387dbd","2018-12-10","feat(examples): add hdom-skip example"],["a4e67362","2018-12-10","feat(hdom): add initial __skip ctrl attrib handling in diffTree()"],["42eab0bc","2018-12-09","Merge branch 'develop' into feature/vec-refactor"],["97bf837e","2018-12-09","doc(vectors): update readme (add note about vectors3 & matrices)"],["ceb404c4","2018-12-09","doc(geom): update readme (add note about geom2)"],["6726925b","2018-12-09","docs: add links to WIP packages"],["71300e92","2018-12-09","docs: update main readme"],["20e0884b","2018-12-09","Publish"],["19b0a554","2018-12-09","perf(diff): further array caching/reuse"],["cfdc4d76","2018-12-08","Merge branch 'develop' into feature/vec-refactor"],["6e361d62","2018-12-08","Publish"],["a7e9def5","2018-12-08","refactor(hdom-canvas): update diffArray call site"],["c3f6f98c","2018-12-08","refactor(hdom): minor update diff call sites"],["64feacfb","2018-12-08","refactor(diff): flatten linear edit logs, update readme & arg order"],["b627f60c","2018-12-08","Merge branch 'feature/hdom-perf' into develop"],["8165005c","2018-12-08","refactor(equiv): minor update (intern string consts)"],["899941f0","2018-12-08","perf(hdom-canvas): update diffTree() to compute edit dist only"],["e9b067b7","2018-12-08","refactor(hdom): update diffTree & diffAttributes (@thi.ng/diff updates)"],["e8356cd2","2018-12-08","perf(diff): flatten linear edit logs, rewrite diffObject(), add DiffMode"],["d1ee6d9e","2018-12-08","perf(diff): reduce amount of temp/internal array allocs (diffArray)"],["6c6da825","2018-12-08","feat(diff): add fast paths for simple cases, add tests, refactor as arrow fns"],["34b515b2","2018-12-08","Merge branch 'develop' into feature/vec-refactor"],["9878c556","2018-12-03","feat(examples): add ClojureX talk-slides example (presentation tool)"],["b08b8e55","2018-12-01","Merge branch 'develop' into feature/vec-refactor"],["88efaa91","2018-12-01","Publish"],["ba8bad68","2018-12-01","minor(transducers): manual array destructuring in reduce/iterator"],["0e77d2c6","2018-12-01","refactor(transducers): implement range() as class w/ IReducible impl"],["57836390","2018-12-01","refactor(examples): update geom-tessel example to use new geom lib"],["0b351e12","2018-12-01","refactor(examples): move gradient defs (mandelbrot)"],["896855de","2018-12-01","feat(geom): re-add arcLength() impls, update imports"],["d4172ee3","2018-12-01","refactor(geom): update everything to use new vectors package"],["68806d93","2018-11-30","feat(vectors): add 2d/3d constants, update Vec2/3"],["87510f74","2018-11-30","feat(vectors): add addWeighted, eqDeltaArray, mixCubic, mixQuadratic"],["9f36a681","2018-11-30","docs(vectors): update readme"],["84ab9b25","2018-11-30","docs(vectors): update readme"],["b415c803","2018-11-30","refactor(vector-pools): update AttribPool internals"],["21d107d9","2018-11-30","docs(vector-pools): update/fix readme"],["27ea8c4a","2018-11-30","minor(vector-pools): fix typos in readme"],["3a51a42d","2018-11-30","docs(vector-pools): fix readme links"],["fd54d323","2018-11-30","feat(vector-pools): update readme, add examples"],["4fe2047e","2018-11-30","feat(vector-pools): add GLType alias, AttribPoolOpts, update pool impls"],["019c0af3","2018-11-30","feat(vector-pools): add AttribPool, refactor lists"],["25b97891","2018-11-30","refactor(vectors): add StridedVec, update IVector, AVec"],["d381ace2","2018-11-29","feat(api): add assert()"],["c31ce8ad","2018-11-28","refactor(vector-pools): various minor updates & fixes"],["48d5d572","2018-11-28","feat(vector-pools): add VecPool, VecArrayList & VecLinkedList"],["ea6bafaf","2018-11-28","feat(malloc): expose SIZEOF, add wrap()"],["6cb3b92b","2018-11-28","feat(vectors): add IVector interface impls for gvec()"],["63458c2c","2018-11-28","feat(vectors): add proxied gvec(), update mapBuffer*() docs"],["1fe9650d","2018-11-27","feat(vectors): add mapBuffer*() fns"],["c3d19141","2018-11-27","feat(vectors): add Vec2/3/4.iterator()"],["4a8295b7","2018-11-27","feature(vectors): update swizzle*() to support in-place updates"],["27f65f9e","2018-11-27","feat(matrices): add rotationAroundAxis33/44()"],["28f04ac1","2018-11-27","feat(vectors): add project(), signedArea2(), update orthoNormal3()"],["a373e55b","2018-11-27","feat(vectors): update `out` default behavior & codegens, bugfixes"],["d9e1b2ec","2018-11-27","feat(matrices): add viewport(), project/unproject(), update invert()"],["16d56a37","2018-11-27","feat(matrices): add trace()"],["28fd0f1f","2018-11-27","feat(vectors): add sum()"],["f1a5cf12","2018-11-27","feat(matrices): add M44 factories"],["97ac629d","2018-11-27","feat(vectors): add/update ops, add docstrings"],["35babfc6","2018-11-27","feat(matrices): add more matrix ops"],["f04e79e9","2018-11-26","feat(matrices): add more matrix ops, optimize & simplify"],["e19f6223","2018-11-26","feat(vectors): add faceForward, invSqrt & dotValues* fns"],["b697fd5d","2018-11-26","refactor(vectors): update codegens"],["8e6ddca9","2018-11-26","Merge branch 'develop' into feature/vec-refactor"],["bb625eb0","2018-11-26","Publish"],["18ffdb79","2018-11-26","fix(vectors): update VecOpSRoVV & dotS impls"],["f940672e","2018-11-26","feat(matrices): extract matrix ops to own package"],["52273cde","2018-11-25","feat(vectors): re-add (some) strided ops, update codegens, simplify"],["b4fffe85","2018-11-25","feat(vectors): add cosh, sinh, tanh, round, jitter, wrap"],["7448c6b6","2018-11-25","feat(vectors): re-add Vec2/3/4, clamp, reflect, refract, restructure package"],["18d44342","2018-11-25","refactor(vectors): update eqDelta & compileHOF()"],["bfbaaa9b","2018-11-25","feat(vectors2): update rand codegen tpls & compileHOF/GHOF"],["26d41996","2018-11-25","feat(vectors): add yet another version of vectors package"],["bb7e003d","2018-11-25","Merge pull request #62 from acarabott/feature/hdom-canvas-text-maxWidth"],["97965d89","2018-11-24","fix(hdom-canvas): actually pass maxWidth argument to text function"],["3f7fe2ad","2018-11-24","build(vectors): update deps"],["82186aa6","2018-11-24","Merge branch 'develop' into feature/vec-refactor"],["bb18d7a2","2018-11-24","Publish"],["d210668e","2018-11-24","docs: update package list"],["4aea85d2","2018-11-24","feat(random): re-import, extend & refactor random package (MBP2010)"],["65ee909f","2018-11-24","Merge branch 'develop' into feature/vec-refactor"],["364f27e3","2018-11-24","Publish"],["02ec7a7a","2018-11-24","docs(hdom-canvas): update readme"],["3872e379","2018-11-24","assets: add mandelbrot screenshot"],["738091d5","2018-11-24","docs(examples): update list (readme)"],["ca47a885","2018-11-24","docs(rstream): update readme"],["9ef64f16","2018-11-23","Merge branch 'feature/rs-tunnel' into develop"],["c6eec4ef","2018-11-23","fix(examples): add download fn (mandelbrot)"],["46c2882e","2018-11-23","fix(rstream): make maxWorkers optional"],["a47edd53","2018-11-23","feat(examples): update mandelbrot demo"],["67a5b104","2018-11-23","feat(rstream): add support multiple workers in Tunnel & TunnelOpts"],["f24e69ea","2018-11-23","refactor(rstream): move tunnel to /subs, add docs"],["a39b98c0","2018-11-23","Merge branch 'develop' into feature/rs-tunnel"],["4592fbb5","2018-11-23","Merge pull request #61 from acarabott/feature/hdom-canvas-text-maxWidth"],["4d1fa1c5","2018-11-23","minor(hdom-canvas): add maxWidth param to text draw call"],["2a4bd412","2018-11-22","feat(examples): add gradients, simplify"],["1b567440","2018-11-22","refactor(examples): minor updates mandelbrot demo"],["70ea4bd6","2018-11-21","feat(examples): add key controls & wheel zoom to mandelbrot demo"],["bab55c3c","2018-11-21","feat(rstream-gestures): add absZoom option (abs vs. relative)"],["9549067e","2018-11-21","fix: update build-examples script (multiple js outputs)"],["a68b9f9a","2018-11-21","refactor(examples): update mandelbrot demo"],["4cab7080","2018-11-21","fix: upload-examples script (if multiple sources)"],["80679d3c","2018-11-21","feat(examples): add mandelbrot worker/tunnel example"],["ef0fe42c","2018-11-21","feat(rstream): add StreamSync.getSources() / getSourceForID()"],["4750e796","2018-11-21","feat(rstream): add worker tunnel() sub"],["7007d633","2018-11-19","Merge branch 'develop' into feature/vec-refactor"],["e044a6a2","2018-11-19","Publish"],["143c47cd","2018-11-19","fix(math): fix #60, add range check for norm()"],["71c568c3","2018-11-13","Publish"],["9334f833","2018-11-13","feat(interceptors): update forwardSideFx(), refactor iceps as arrow fns"],["62b3c312","2018-11-13","Publish"],["1d085bff","2018-11-13","refactor(router): update Route, RouteMatch & minor optimizations"],["9b4a7b45","2018-11-12","Merge branch 'develop' into feature/vec-refactor"],["4bf18805","2018-11-12","Publish"],["4048849d","2018-11-12","Merge branch 'develop' of github.com:thi-ng/umbrella into develop"],["068255f6","2018-11-12","Merge pull request #59 from acarabott/feature/linecap"],["734a1428","2018-11-12","minor(hdom-canvas): fix default key for lineCap"],["74827068","2018-11-09","Merge branch 'develop' into feature/vec-refactor"],["a4bc35bd","2018-11-08","Publish"],["33e915b4","2018-11-08","feat(strings): add configurable units() HOF & presets"],["6eaa5f5f","2018-11-07","Publish"],["b0a4b65e","2018-11-07","refactor(examples): update hdom-dyn-context demo"],["52a47f0f","2018-11-07","refactor(transducers-hdom): update auto-deref ctx behavior"],["30161166","2018-11-07","feat(hdom): update auto-deref ctx behavior"],["749925f0","2018-11-07","feat(hiccup): update derefContext() to only apply to selected keys"],["5a3b860e","2018-11-07","feat(vectors): update VecPool & NDArray1"],["34930b31","2018-11-07","refactor(malloc): update package structure, fix stats()"],["c3751198","2018-11-06","Merge branch 'develop' into feature/vec-refactor"],["d2797516","2018-11-06","feat(examples): add hdom-dyn-context demo"],["79a6a365","2018-11-06","Publish"],["e91dbbc1","2018-11-06","feat(transducers-hdom): add support for dynamic user context vals"],["6a3a8739","2018-11-06","feat(hdom): add support for dynamic user context vals"],["a9478732","2018-11-06","feat(hiccup): add support for dynamic user context values"],["dc2c487d","2018-11-06","refactor(geom): update implementations() call sites"],["a24715e7","2018-11-06","refactor(defmulti): merge relations() w/ implementations(), update readme"],["3713c02a","2018-11-06","refactor(hiccup-svg): update convertTransforms(), update formatting"],["9f03889b","2018-11-06","minor(geom): add/update edges()/vertices() arg types"],["9a18620d","2018-11-06","minor(hiccup-svg): update path conversion/creation"],["c0134fda","2018-11-06","minor(geom): update imports"],["94a40cc5","2018-11-06","fix(geom): Path2 transform() & translate(), add asCubic() impl"],["df9b9f9f","2018-11-06","fix(geom): asCubic() for arc"],["9d60ad09","2018-11-06","perf(geom): emit hline/vline segments if possible"],["c4db51aa","2018-11-06","feat(vectors): add IMatrix & impls for Mat23/33/44, add/update accessors"],["4066c80f","2018-11-06","feat(defmulti): add relations()"],["35bd0679","2018-11-06","feat(geom): add new / update all types / ops, add tests"],["c41d12c0","2018-11-03","feat(vectors): re-add quaternion, various refactorings"],["358169fd","2018-11-01","feat(geom): add/update shape types"],["e197f908","2018-11-01","feat(hiccup-svg): add toHiccup() support in convertTree()"],["30f61da5","2018-11-01","feat(vectors): add eqDeltaArray()"],["0043fb5d","2018-11-01","feat(math): add cossin(), add opt scale arg for sincos()"],["184d55da","2018-10-31","build(vectors): update deps"],["954e0c28","2018-10-31","feat(vectors): add generic impls for common vec ops"],["816c9c01","2018-10-31","feat(strings): add floatFixedWidth(), update float()"],["766fdee2","2018-10-31","feat(vectors): re-add vec4, mat23/33/44, nd arrays"],["e3727ce9","2018-10-27","refactor(malloc): add/extract types to api.ts"],["228e08a1","2018-10-27","Merge branch 'develop' into feature/vec-refactor"],["46bf1a73","2018-10-27","Publish"],["c5b0f2f5","2018-10-27","feat(malloc): add MemPoolOpts, fix top block alloc, update tests, readme"],["cfd88555","2018-10-27","feat(geom): re-add & update more types / shape ops"],["a070016c","2018-10-27","feat(vectors): add VecPool skeleton, add more types, export codegen fns"],["51c4a49f","2018-10-26","feat(vectors): add/update types, multi-methods, minor optimizations"],["125c784f","2018-10-26","feat(defmulti): add versions w/ 1 optional typed arg, add .impls()"],["252f66db","2018-10-25","feat(geom): re-add more classes & methods, add svg conversions"],["505ca49c","2018-10-25","feat(vectors): add vec2n/vec3n(), copy() methods, update deps"],["fde2db21","2018-10-25","feat(defmulti): add callable() & implementations(), update readme"],["fe14b791","2018-10-24","Merge branch 'develop' into feature/vec-refactor"],["accda790","2018-10-24","fix(rstream-gestures): Publish (0.5.16 had publish error)"],["673bf50f","2018-10-24","Publish"],["a8c38987","2018-10-24","feat(defmulti): add support for dispatch value relationships / hierarchy"],["7b740ab8","2018-10-24","docs(malloc): update readme"],["4f156b04","2018-10-24","Merge branch 'develop' of github.com:thi-ng/umbrella into develop"],["724fe28f","2018-10-24","feat: add temp geom2 & vectors2 packages (defmulti API)"],["f271b78b","2018-10-24","Merge pull request #57 from acarabott/feature/rstream-gesture-local"],["f1f6af4d","2018-10-23","fix(rstream-gestures): fix incorrect local position when scrolled"],["5bb51391","2018-10-21","Publish"],["abba2d62","2018-10-21","Merge branch 'feature/geom-accel' into develop"],["be7acc33","2018-10-21","refactor(examples): update geom-knn demo"],["b47e6413","2018-10-21","feat(geom-accel): add KV support, update select/selectKeys()"],["c387887d","2018-10-21","docs: update package list"],["51071ac7","2018-10-21","Merge branch 'develop' into feature/geom-accel"],["6f8a8963","2018-10-21","docs: update package list"],["b7457cef","2018-10-21","Merge branch 'feature/malloc' into develop"],["4b72cda6","2018-10-21","feat(malloc): add freeAll(), release(), tests & benchmarks, update docs"],["40f07876","2018-10-21","docs(malloc): add docs to readme"],["787102a4","2018-10-21","fix(malloc): add size check, update readme"],["89f2bc28","2018-10-21","feat(malloc): re-add block compaction & splitting, update readme"],["2cf20c90","2018-10-21","feat(malloc): initial import @thi.ng/malloc package"],["ce131d48","2018-10-19","feat(geom): add IToCubic, add/update impls"],["4a47daa4","2018-10-19","feat(math): migrate mixCubic()/mixQuadratic() from geom package"],["85426d98","2018-10-19","fix(hiccup-svg): fix arc segment handling"],["f891c419","2018-10-19","feat(math): add sincos() & roundEps()"],["2469992e","2018-10-18","build(geom-accel): update deps (add morton)"],["ac2f3e83","2018-10-18","feat(morton): update/add muxScaled2/3 versions, add error handling"],["971dfb45","2018-10-18","Merge pull request #55 from acarabott/feature/readme-arc"],["b9cfb56f","2018-10-18","minor(hdom-canvas): add arc, hline, vline to readme"],["1063fea9","2018-10-18","feat(heaps): add pushPopAll()"],["f0deebb9","2018-10-18","minor(examples): update geom-knn"],["b31b4807","2018-10-18","refactor(hdom-canvas): update points() to accept iterables"],["0c76c024","2018-10-18","refactor(geom-accel): move iterator into KdNode"],["aa01a2de","2018-10-18","build: update .gitignore"],["f82c8b16","2018-10-18","feat(examples): add geom-knn example"],["e14ac8b1","2018-10-18","feat(geom-accel): re-import geom-accel skeleton (MBP2010)"],["f7bbfde4","2018-10-18","refactor(heaps): public fields"],["0cf708f4","2018-10-18","feat(bench): add timedResult() / benchResult()"],["6e0972e9","2018-10-17","build: further updates dev deps in all packages"],["f01551ac","2018-10-17","build: update make-module/example scripts"],["e6cef6b3","2018-10-17","build(examples): update dev deps"],["1ebae947","2018-10-17","build: update dev deps (TS3.1, parcel etc.)"],["348cdd4e","2018-10-17","docs(examples): update table"],["3569d242","2018-10-17","feat(examples): add geom-tessel example"],["d4d44b32","2018-10-17","fix(examples): update @thi.ng/math occurrences"],["cf2970aa","2018-10-17","minor: update readme"],["6e563377","2018-10-17","Publish"],["39d414f5","2018-10-17","docs: update package list in main readme"],["940fc312","2018-10-17","build(dsp): update package"],["456a2ee3","2018-10-17","build(math): update package desc"],["10cf5646","2018-10-17","build: update gitignore & yarn.lock"],["83ef61a1","2018-10-17","docs(geom): update readme, add/move assets"],["ffea836f","2018-10-17","refactor(geom): update deps & @thi.ng/math imports"],["0967929f","2018-10-17","feat(vectors): replace math.ts w/ imports from @thi.ng/maths package"],["f257330e","2018-10-16","refactor(transducers): add ensureArrayLike(), update permutations()"],["1bd9fd43","2018-10-16","docs(heaps): update readme"],["501536b9","2018-10-16","feat(morton): import & update @thi.ng/morton package (MBP2010)"],["6851f2c4","2018-10-16","feat(compose): add partial(), update readme"],["405cf51a","2018-10-16","feat(dlogic): add @thi.ng/dlogic package"],["458d4a07","2018-10-16","feat(binary): add @thi.ng/binary package"],["889730f8","2018-10-16","feat(dsp): add oscillators as @thi.ng/dsp package (from synstack / VEX)"],["4af1fba3","2018-10-16","feat(math): extract maths fns from @thi.ng/vectors as new package"],["e085136b","2018-10-13","Merge branch 'develop' into feature/geom"],["2e9f0486","2018-10-13","refactor(geom): update arg handling, update readme"],["328a9b03","2018-10-13","Merge pull request #54 from acarabott/feature/transducer-links"],["08372abd","2018-10-13","minor(transducers): fix links to reducers in README"],["2546039a","2018-10-13","Merge pull request #53 from acarabott/feature/baseline"],["6a9747bf","2018-10-13","minor(hdom-canvas): baseLine -> baseline"],["fa87f1e9","2018-10-11","feat(geom): add/update tessellate() impls"],["555fc515","2018-10-10","feat(geom): add/update factory fns, arg handling, tessel, poly area"],["3a20ef34","2018-10-10","feat(geom): add/update various shape impls & ops"],["296e1e07","2018-10-08","refactor: update Infinity consts in various packages"],["d655ec29","2018-10-08","feat(geom): re-import & refactor partial port of thi.ng/geom (clojure)"],["ff435be6","2018-10-07","minor(hdom-canvas): rename arc() => circularArc()"],["b2f9af93","2018-10-07","refactor(vectors): replace static Vec2/3/4 methods w/ IVector impls"],["221fb7f6","2018-10-06","feat(vectors): add collate & eqDelta fns, update ctors"],["6094738e","2018-10-03","feat(defmulti): add varargs support"],["2657df66","2018-09-30","feat(geom): add/update interfaces & impls"],["775cc8a7","2018-09-30","fix(hdom-components): add Canvas2DContextAttributes (removed in TS3.1)"],["1ef23611","2018-09-30","fix(transducers): minor TS3.1 fixes"],["515e5ba5","2018-09-30","feat(transducers): update wrap*() fns to accept iterables"],["aa6b1206","2018-09-30","feat(geom): re-add Arc2, update Circle2, update helper fns"],["3b1bf647","2018-09-30","feat(geom): add ICollate & ICopy impls, re-add/update convexHull2"],["2ba99311","2018-09-30","build(geom): update dev deps & yarn.lock"],["473ec800","2018-09-30","feat(vectors): add axis consts, add/update ops"],["6a0f8aa9","2018-09-29","feat(vectors): add comparators & ICompare impls for vec2/3/4"],["9fb2091a","2018-09-29","refactor(geom): add interfaces, split out common.ts into /func folder"],["34312d8f","2018-09-29","feat(vectors): add IMinMax interface"],["9c27c77f","2018-09-29","feat(geom): update all shape types, add interfaces & ops, update tests"],["5c44ad98","2018-09-29","feat(vectors): add operation specific interfaces, rename Vec3.toPolar()"],["22f6aab4","2018-09-29","Merge branch 'develop' into feature/geom"],["4f15ea80","2018-09-28","Publish"],["8399ec2f","2018-09-28","docs(vectors): fix docstrings, hide CommonOpts type alias"],["f2114d52","2018-09-28","Merge branch 'feature/vec-codegen' into develop"],["247dec02","2018-09-28","refactor(vectors): generate more ops, move declareIndices() (#51)"],["719b27ac","2018-09-28","refactor(vectors): rewrite codegen, add more types & gen ops (#51)"],["9bee7f85","2018-09-28","refactor(vectors): use codegen for unary vec2/3/4 ops"],["b5ed2545","2018-09-28","feat(vectors): add vector ops codegen, update basic vec2/3/4 ops (#51)"],["d964865e","2018-09-28","docs(hdom): add xml-converter example link & screenshot"],["6db26c2b","2018-09-28","feat(examples): add copy-to-clipboard, extract UI config & components"],["5cfbf70d","2018-09-27","feat(examples): update css"],["71cbd19a","2018-09-27","fix(examples): fix attrib format"],["95ba4f6d","2018-09-27","feat(examples): extend xml-converter, add CLI version, update docs"],["2f014471","2018-09-26","Publish"],["4b78c8a3","2018-09-26","minor(examples): xml-converter"],["96367021","2018-09-26","docs(hdom): add/update docs (fix #47)"],["0a49d0a5","2018-09-25","fix: update .gitignore (fixes #46, fixes #50)"],["ad1bac8f","2018-09-25","refactor(examples): refactor hiccup formatter, minor fixes"],["823d828d","2018-09-25","fix(transducers): fix matchLast(), fix & update return match*() types"],["61af7e51","2018-09-25","Merge branch 'master' of github.com:thi-ng/umbrella"],["b8a93ea8","2018-09-25","fix(examples): add null check & parseAttrib() in transformCSS()"],["3abfc42c","2018-09-25","Merge pull request #49 from nkint/patch-1"],["a169d2df","2018-09-25","fix(examples): add missing index.html (#46)"],["04872dbe","2018-09-25","Publish"],["79cf49e1","2018-09-25","feat(examples): add value coercions & re-formatter (xml-converter)"],["0cce0488","2018-09-25","feat(strings): add splice(), refactor repeat(), add tests"],["8b8bf885","2018-09-25","typo"],["0cddc7d6","2018-09-25","feat(example): update xml-converter (add boolean attrib support)"],["5119b67e","2018-09-25","feat(sax): add opt support for boolean attribs, add tests"],["5a893d5b","2018-09-25","docs(examples): update table"],["436edc0f","2018-09-25","Publish"],["50fa6492","2018-09-25","fix(hdom): add DEFAULT_IMPL to re-exports (#47)"],["febe3c36","2018-09-25","Publish"],["cb263002","2018-09-25","feat(examples): add xml-converter example"],["8cbfb97e","2018-09-24","fix(strings): rename number parsers"],["888ea747","2018-09-24","fix(examples): rename `prepare` script aliases"],["c0a8926b","2018-09-24","fix(examples): rename `prepare` script alias, add commits.json (#46)"],["cf05efbf","2018-09-24","Publish"],["665564c7","2018-09-24","feat(sax): update parse() to return iterator if input given (optional)"],["fc6a4d32","2018-09-24","perf(rstream-log): `Level` => const enum"],["8e4fc902","2018-09-24","perf(rstream-gestures): `GestureType` => const enum"],["7ac83c6f","2018-09-24","perf(rstream): `State` => const enum"],["a7b9a427","2018-09-24","perf(pointfree-lang): `NodeType` => const enum"],["c3e8d689","2018-09-24","perf(csp): `State` => const enum"],["39f7fb0c","2018-09-24","build: add `preserveConstEnums` to global tsconfig"],["657a3088","2018-09-24","docs: fix twitter badges, update make-module script"],["89ab34a3","2018-09-24","Merge branch 'master' of github.com:thi-ng/umbrella"],["94f64698","2018-09-24","docs: update all readme files"],["56bfecbc","2018-09-23","Merge pull request #45 from rgtk/patch-1"],["b2a24f8c","2018-09-23","Fix links to @thi.ng/transducers"],["edf68556","2018-09-23","Publish"],["7cd08281","2018-09-23","docs(hdom): update readme"],["4a2f79b8","2018-09-23","refactor(hdom): minor refactoring, fix/update docs"],["1d8eeb4d","2018-09-23","feat(hiccup): emmet class & class attrib merging in normalize()"],["ff5e5550","2018-09-23","docs(rstream): re-org readme"],["ed3f10b5","2018-09-23","docs(hdom): fix/update changelog"],["bb224a75","2018-09-22","docs(examples): update readme"],["02548fd2","2018-09-22","Publish"],["70de921a","2018-09-22","build: add npm registry for publish script"],["ee0c2b96","2018-09-22","build: update yarn.lock"],["897f2b36","2018-09-22","docs: update branch links (all back to master now)"],["39d35d93","2018-09-22","chore(examples): add missing .gitignore"],["4bc64394","2018-09-22","chore: add HMR handling to make-example script"],["387376ed","2018-09-22","docs(hdom): major update readme"],["86bdd06d","2018-09-22","feat(examples): add svg-barchart demo"],["5ef9cf0e","2018-09-22","feat(hdom): add renderOnce()"],["06dccee4","2018-09-21","docs(hdom): update readme"],["8441afcb","2018-09-21","assets: add new diagram sources (hdom & interceptors)"],["bb5569f7","2018-09-21","build: update yarn.lock"],["0dcc1b86","2018-09-21","refactor(rstream): remove Stream.NEXT_ID, replace w/ Subscription field"],["8aa66055","2018-09-21","build: update example generator & build scripts"],["efcbe2de","2018-09-21","minor(examples): fix sort icon in triple-query"],["7c4dc3f0","2018-09-21","fix(examples): update commit-table-ssr to work w/ parceljs, update docs"],["22732421","2018-09-21","build(examples): update yarn build commands"],["1ee6c43a","2018-09-21","build: update typedoc dep"],["022101f3","2018-09-21","fix(transducers): add missing type annotation"],["78b1f4ac","2018-09-21","fix(transducers-hdom): add missing type annotation"],["3cd03bd7","2018-09-20","assets(examples): add gesture-analysis screenshot"],["288b68d9","2018-09-20","feat(rstream): add trigger() generics"],["75889156","2018-09-20","docs(rstream): update readme & doc strings"],["d5ec6fd8","2018-09-20","docs(rstream): add docs, update readme"],["dbdb72ec","2018-09-20","docs(rstream): add diagrams"],["bbb87f4a","2018-09-20","docs(hdom): update readme"],["1ac1110b","2018-09-20","feat(examples): rename interceptor-basics, add more simpler version"],["6d6fae33","2018-09-20","refactor(hdom): allow HDOMOpts extensions"],["74816eb0","2018-09-20","docs(hdom): update readme"],["46d851b6","2018-09-19","feat(examples): add hdom-canvas-draw demo"],["09a821b2","2018-09-19","refactor(hdom-canvas): switch canvas back to lifecycle object form"],["e390a54d","2018-09-19","feat(api): add `IToHiccup` interface"],["929c6f42","2018-09-19","feat(rstream): add trigger() utility stream"],["e82e3122","2018-09-19","feat(examples): add SVG export comment to hdom-canvas-shapes"],["de17db8f","2018-09-19","perf(hdom): minor updates"],["53a1d2c0","2018-09-19","refactor(hdom-canvas): add _serialize control attrib to root group"],["363c241c","2018-09-19","feat(hiccup): add control attrib handling, add comment support"],["bca4cc4b","2018-09-17","Publish"],["b488d2b3","2018-09-17","feat(transducers): add randomID()"],["f001314d","2018-09-17","fix(transducers): str() initial result handling"],["eb674268","2018-09-17","fix(transducers): update arg types for choices() & weightedRandom()"],["bd228110","2018-09-17","Publish"],["3e647a18","2018-09-17","fix(atom): add .value getter to IView"],["76309858","2018-09-17","minor(examples): update clock example"],["38125686","2018-09-17","docs: add hdom-canvas to package table"],["60f00590","2018-09-17","build(examples): fix deps, update readmes"],["7bbd1bcf","2018-09-17","docs(hdom-canvas): update links"],["95c462a5","2018-09-17","Publish"],["decc26b2","2018-09-17","build: update deps"],["b9738cc4","2018-09-17","v1.2.0"],["b43fcb39","2018-09-17","v2.0.0-alpha"],["f424fa92","2018-09-17","Publish"],["d4487066","2018-09-17","v1.1.0"],["3835cf43","2018-09-17","v2.2.0"],["ff919070","2018-09-17","v0.4.0"],["339342b3","2018-09-17","v0.1.9"],["7481df23","2018-09-17","v1.5.9"],["4297d649","2018-09-17","Merge branch 'feature/hdom-canvas' into develop"],["4fe6a742","2018-09-17","Merge branch 'feature/hdom-v5' into develop"],["eb4e6891","2018-09-17","refactor(examples): minor updates"],["ae4b6212","2018-09-16","perf(hdom-canvas): inline type checks, update deps & readme"],["a52f83c4","2018-09-16","fix(hdom-canvas): update __normalize handling, rename fns"],["382c45ca","2018-09-16","perf(hdom): update diffTree(), inline node type checks"],["224a537a","2018-09-16","perf(checks): inline checks in isNotStringAndIterable()"],["b93dc745","2018-09-16","feat(examples): add static canvas test"],["74547aa6","2018-09-16","feat(hdom-canvas): update canvas component & diffTree impl, update docs"],["3b628326","2018-09-16","refactor(hiccup-svg): update points(), minor fixes, add docs"],["ebfcf159","2018-09-16","refactor(hdom): export diff related fns"],["bb7e08a8","2018-09-16","refactor(examples): update canvas demo"],["5de02559","2018-09-16","feat(hdom-canvas): add HDPI auto-adjustment, update docs"],["b219d67a","2018-09-15","Merge branch 'feature/hdom-v5' into feature/hdom-canvas"],["d9af2e5f","2018-09-15","refactor(hdom): update custom equiv()"],["6c33901f","2018-09-15","fix(hdom): delegate diffTree() to branch impl"],["3de83bb7","2018-09-15","refactor(hiccup): add `button` to NO_SPANS elements"],["adaaa7a0","2018-09-15","feat(hdom-canvas): add warning msg for hydrateTree() impl"],["ae1371d8","2018-09-15","Merge branch 'feature/hdom-v5' into feature/hdom-canvas"],["05920636","2018-09-15","fix(hdom): exclude hdom control attribs in setAttrib()"],["4e230164","2018-09-15","feat(vectors): add random vector ops for Vec2/3/4 & GVec"],["8e796480","2018-09-15","Merge branch 'develop' into feature/geom"],["6a76bfd1","2018-09-15","Merge branch 'develop' into feature/hdom-canvas"],["442f14f4","2018-09-15","Merge branch 'develop' into feature/hdom-v5"],["7963e256","2018-09-15","feat(strings): add U24 hex preset"],["be25c48e","2018-09-15","feat(examples): add circles test"],["56b919d8","2018-09-15","Merge branch 'feature/hdom-canvas' into feature/geom"],["2bb41d45","2018-09-14","docs(examples): update crypto readme (replace diagram)"],["1d463ea6","2018-09-14","build(examples): update deps (hdom-canvas-shapes)"],["141e7c86","2018-09-14","docs(examples): add dflow diagram, update readme"],["42c1c403","2018-09-14","fix(examples): add missing file download.ts"],["7778c404","2018-09-14","Merge branch 'feature/hdom-canvas' into feature/geom"],["6e20e3e2","2018-09-14","feat(hiccup): add `.toHiccup()` interface support"],["8ecdd139","2018-09-14","feat(hdom-canvas): add `.toHiccup()` interface support"],["54ba0ce1","2018-09-14","feat(hdom): add `.toHiccup()` interface support"],["177855c3","2018-09-14","feat(examples): add geom circle test"],["c03259cb","2018-09-14","feat(geom): import (updated) old thi.ng/geom package (minus vectors)"],["f25db9a2","2018-09-14","docs(hdom-canvas): update readme"],["b8f79568","2018-09-14","feat(examples): add SVG conversion & export to hdom-canvas-shapes"],["3acb0dd8","2018-09-14","fix(hiccup-svg): update points() to use \"xlink:href\" (fix for safari)"],["7a6cf519","2018-09-14","feat(hiccup-svg): re-parse alpha colors in gradients (fix for safari)"],["d4122694","2018-09-14","feat(hdom-canvas): update points() to use circle or rect shapes"],["214cb62d","2018-09-14","feat(hiccup-svg): add custom shape support for points(), use instancing"],["cf4add3e","2018-09-14","refactor(hiccup-svg): update attrib conversion"],["a00761ba","2018-09-14","refactor(examples): update svg `text` arg order (hiccup-svg update)"],["f45f4ff0","2018-09-14","refactor(examples): update gradient def in svg-waveform"],["c20b24a7","2018-09-14","refactor(hdom-canvas): swap `img` args to be more consistent w/ others"],["4cb8cf72","2018-09-14","feat(hiccup-svg): add new elements, update convertTree(), refactor"],["0c4dddce","2018-09-14","feat(hiccup-svg): add convertTree() interop helpers (#44)"],["fb9c704d","2018-09-14","docs(hdom-canvas): update readme"],["de61c215","2018-09-14","feat(hdom-canvas): add `defs` node/group type"],["75002fad","2018-09-13","build: update upload-examples"],["17d13866","2018-09-13","feat(examples): use location.hash to select tests, update assets"],["c8d7a7c9","2018-09-13","feat(examples): update canvas image test"],["f7af43c1","2018-09-13","Merge branch 'feature/hdom-v5' into feature/hdom-canvas"],["c2859105","2018-09-13","perf(checks): update isPlainObject()"],["bde18d50","2018-09-13","refactor(hdom): use custom equiv also for diffAttributes()"],["481d9d34","2018-09-13","perf(diff): update diffObject() & add IOC support for custom equiv fn"],["a9e173e7","2018-09-13","test(hdom): update tests"],["96beaf38","2018-09-13","refactor(hdom): trial run of custom equiv() impl for diffTree()"],["ee55accd","2018-09-13","perf(equiv): inline & refactor type checks, add IOC support for helpers"],["360f15af","2018-09-13","feat(examples): add canvas image test"],["6b62067b","2018-09-13","docs(hdom-canvas): update readme"],["99020cad","2018-09-13","docs(hdom-canvas): update readme"],["5aa9d46a","2018-09-13","refactor(hdom-canvas): update attrib aliases"],["b6c1e42e","2018-09-13","docs(examples): update hdom-canvas-* build instructions"],["2b16d24d","2018-09-13","docs(examples): update readme"],["2fa4c56c","2018-09-13","refactor(examples): update hdom-canvas-shapes"],["6496e47b","2018-09-13","feat(hdom-canvas): add new shape types, add canvas attribs, refactor"],["5a3c3147","2018-09-13","refactor(examples): minor updates shape test"],["98735395","2018-09-13","docs(examples): update example table (readme)"],["7aae4333","2018-09-13","feat(examples): add hdom-canvas-shapes"],["81fe154d","2018-09-13","feat(hdom-canvas): fix #43, add gradient support"],["d5e01ff8","2018-09-12","Merge branch 'feature/hdom-v5' into feature/hdom-canvas"],["e4f780c7","2018-09-12","fix(hdom): minor fix (hydrateDOM)"],["81a39ba7","2018-09-12","refactor(hdom-canvas): update to reflect hdom api changes"],["700352de","2018-09-12","Merge branch 'feature/hdom-v5' into feature/hdom-canvas"],["832e419c","2018-09-12","fix(transducers-hdom): update to work w/ new @thi.ng/hdom v5 API"],["1ac245f8","2018-09-12","feat(hdom): reorg & extend HDOMImplementation"],["66c007de","2018-09-12","feat(checks): add isNotStringAndIterable()"],["764373a7","2018-09-12","feat(hdom-canvas): add rounded rect option (as path)"],["2a973fd1","2018-09-12","Merge branch 'feature/hdom-v5' into feature/hdom-canvas"],["1cfad519","2018-09-12","refactor(hdom-canvas): update canvas component, add docs"],["2e3fb660","2018-09-12","perf(hdom): add opt `__release` attrib to disable releaseDeep()"],["cfadbe3e","2018-09-12","refactor(examples): update clock main group attribs"],["1d24a166","2018-09-12","feat(hdom-canvas): add canvas-specific normalizeTree() impl"],["59bb19c2","2018-09-11","feat(hdom): update normalizeTree, add to HDOMImplementation"],["82cd9389","2018-09-11","feat(hdom-canvas): add path shape type, embedded fn & iterator handling"],["c69454b0","2018-09-11","refactor(examples): update attribs & scengraph in hdom-canvas-clock"],["ccbf53cf","2018-09-11","feat(hdom-canvas): implement drawing state inheritance & restoration"],["17060403","2018-09-11","build(examples): enable source maps in all examples, update make-example"],["d93efa86","2018-09-11","refactor(examples): minor updates hdom-canvas-clock, enable source map"],["d3acb707","2018-09-11","feat(hdom-canvas): add more shapes/prims, update transform handling"],["b4a37dd3","2018-09-10","Merge branch 'develop' into feature/hdom-canvas"],["685fd0bd","2018-09-10","Merge branch 'develop' into feature/hdom-v5"],["bdb57f83","2018-09-10","Publish"],["f4cc0dda","2018-09-10","refactor(vectors): Vec3/4 toString() impls"],["ae261ab5","2018-09-10","fix(vectors): GVec.copy() / get()"],["07d1ccfc","2018-09-10","fix(vectors): Mat23/33/44 toString() impls"],["3dd00725","2018-09-10","feat(vectors): add matrix index & property accessors"],["54e59a08","2018-09-10","fix(examples): re-enable HMR logic"],["dc618983","2018-09-10","refactor(hdom-canvas): rename types due to hdom update"],["5546c0d2","2018-09-10","Merge branch 'feature/hdom-v5' into feature/hdom-canvas"],["cc73c769","2018-09-10","refactor(hdom): rename HDOMOps => HDOMImplementation, add docs"],["ada7d34e","2018-09-10","build: add max-age cache header (upload-examples)"],["2fdcf104","2018-09-10","refactor(examples): update clock demo"],["689e775e","2018-09-10","feat(examples): add hdom-canvas-clock demo"],["f41014eb","2018-09-10","feat(hdom-canvas): rename package, add text support, refactor"],["60f12c5d","2018-09-10","feat(hiccup-canvas): add canvas comp, createTree impl, update deps"],["46c5cd2c","2018-09-10","Merge branch 'feature/hdom-v5' into feature/hiccup-canvas"],["525d90d5","2018-09-10","feat(hdom): generalize diffElement() (#4)"],["5cb4350f","2018-09-09","feat(hdom): add optional support for blocking normalize & diff"],["c47711f9","2018-09-09","refactor(hiccup-canvas): add notes"],["84a6f441","2018-09-09","Merge branch 'develop' into feature/hiccup-canvas"],["146868d1","2018-09-09","build: update make-module script"],["890eb97c","2018-09-09","docs(compose): add missing package desc"],["266d02b0","2018-09-09","docs: update badges in all readme files"],["eb284f01","2018-09-09","feat(hiccup-canvas): add hiccup-canvas package"],["9bde777a","2018-09-08","fix(examples): add missing html file"],["d003cab6","2018-09-08","docs(examples): update readme"],["6051439d","2018-09-08","feat(examples): add gesture-analysis example"],["bfd3c2f2","2018-09-08","Publish"],["06f61cf4","2018-09-08","fix: missing comma in make-example script"],["8856a18f","2018-09-08","test(rstream): add merge-only sync tests"],["1f22867f","2018-09-08","feat(transducers): rename window() => slidingWindow(), update readme"],["2916432d","2018-09-08","docs(transducers): update partitionSync() docs"],["162aa2d5","2018-09-08","feat(rstream): add merge-only mode for StreamSync, update docs"],["d8fdc018","2018-09-08","feat(transducers): update partitionSync() xform & PartitionSyncOpts"],["2f0f3d48","2018-09-08","feat(transducers): add window() xform"],["014bd980","2018-09-07","fix: update upload-examples script"],["b4c2e1c0","2018-09-07","build: update `yarn examples` command, update readme"],["81610117","2018-09-07","build: add build-examples, update make-example script"],["316ad6ae","2018-09-07","build(examples): update all examples to use parcel instead of webpack"],["b1ef187d","2018-09-07","build: update lerna, replace webpack deps w/ parcel"],["42d142dc","2018-09-06","Publish"],["d54dffb0","2018-09-06","docs(examples): update table"],["cf516aa5","2018-09-06","Merge branch 'feature/defonce' into develop"],["83fa7ade","2018-09-06","feat(examples): add hmr-basics demo (fixes #40)"],["61bed88b","2018-09-06","feat(memoize): add defonce()"],["e0f83c4a","2018-09-05","Publish"],["2eec7006","2018-09-05","feat(vectors): add/update transformVectors*(), update types"],["2d5d0c86","2018-09-05","refactor(vectors): rename immutable vec ops, update readme table"],["f7df4cba","2018-09-05","chore: update .gitignore (add gtm)"],["c4631533","2018-09-05","test(vectors): add benchmarks"],["2583380b","2018-09-04","docs(vectors): update readme"],["a3c04076","2018-09-04","feat(vectors): add immutable vec2/3/4 ops"],["be6ae489","2018-09-03","Publish"],["9510f01a","2018-09-03","feat(vectors): add new vector ops, update readme"],["a5b3f84c","2018-09-03","docs(vectors): add/update doc strings"],["7001b7a8","2018-09-03","refactor(vectors): update matrix factories"],["f0ccd0c5","2018-09-03","feat(vectors): add mixBilinear1/2/3/4"],["ad131513","2018-09-03","fix(vectors): update GVec method args (readonly)"],["25ea00ca","2018-09-03","fix(vectors): add opt normalize for angleBetween2/3"],["c0fbb4ed","2018-09-03","fix(vectors): add missing arg types"],["34ffe9d7","2018-09-03","docs(hdom): update/fix docs & readme"],["4a16bd56","2018-09-03","refactor(transducers): update normRange()"],["16aa0c46","2018-09-03","feat(vectors): add Vec*.intoBuffer() impls"],["ba386e52","2018-09-01","Publish"],["6acb05bb","2018-09-01","build(examples): fix deps"],["1795f187","2018-09-01","refactor(vectors): update Vec2/3/4 index signatures"],["fc7c670b","2018-09-01","Publish"],["e5662a0a","2018-09-01","docs(paths): update readme, add tests"],["a7104535","2018-09-01","fix(resolve-map): deep resolve of yet unknown path values"],["f0183530","2018-09-01","feat(paths): add exists() path checker & tests"],["e66a4929","2018-09-01","fix(hdom): fix local import"],["71ee43ca","2018-09-01","Publish"],["e7016b42","2018-09-01","docs(hdom): fix screenshot link"],["a8282925","2018-09-01","Publish"],["d2b4fafb","2018-09-01","fix(vectors): add missing deps"],["208e57d2","2018-09-01","docs: update various readme's, add/move screenshots"],["7fa3852a","2018-08-31","Publish"],["1060b2a3","2018-08-31","docs(hdom): update readme, add hydrate docs"],["473aadc1","2018-08-31","refactor(examples): update crypto-chart to use `updateDOM` xform"],["1a6741a1","2018-08-31","refactor(examples): update `updateDOM()` transducer call sites"],["0f396948","2018-08-31","feat(transducers-hdom): add DOM hydration support, rename (#39)"],["5e74a9c0","2018-08-31","feat(hdom): update HDOMOpts & start()"],["1e8b4efa","2018-08-31","fix(hiccup): serialize() args"],["52417e37","2018-08-31","fix(examples): minor update hydrate demo"],["e7607f53","2018-08-31","docs(examples): update readmes"],["0d34bb7d","2018-08-31","feat(examples): add hydrate-basics example"],["26bc7e74","2018-08-31","refactor(examples): update hdom start() call sites to new API"],["d55d9303","2018-08-31","refactor(hdom): minor update HDOMOpts & start()"],["9f8010db","2018-08-31","feat(hdom): add DOM hydration support (SSR), update start() (#39)"],["1b97a25a","2018-08-31","fix(hiccup): disable spans for certain element types"],["1b0deb22","2018-08-31","feat(hiccup): add optional support for spans & auto keying (#39)"],["b8d944eb","2018-08-31","refactor(vectors): update matrices & types"],["0a806011","2018-08-30","refactor(vectors): update mulV*() arg order"],["80f291b5","2018-08-30","Publish"],["461adeef","2018-08-30","docs(resolve-map): fix #35, update docs & tests"],["0673f0f4","2018-08-30","fix(examples): fix #38, add missing dep"],["75d6409e","2018-08-30","build: update yarn.lock"],["d1b77cfe","2018-08-30","docs(vectors): update readme"],["d5cec948","2018-08-30","feat(vectors): update types, update GVec, add maths fns, swap impls"],["bdb5d377","2018-08-29","feat(vectors): consolidate vector consts, add toJSON() impls"],["bb55adf3","2018-08-29","Merge branch 'develop' into feature/webgl"],["b82a22f5","2018-08-29","refactor(vectors): simplify prop accessors (DRY)"],["f5795eee","2018-08-28","Publish"],["cd834f82","2018-08-28","feat(vectors): add more vec2/3 ops"],["4a373674","2018-08-28","feat(bench): add opt prefix arg, update docs"],["39cced5f","2018-08-28","minor(examples): add cursor css for dial"],["986e954f","2018-08-27","Publish"],["5afb5791","2018-08-27","Merge pull request #34 from andrew8er/pr/fix-rstream-resolve-errors"],["34a97b47","2018-08-27","fix(rstream): Fix unbound this in method call expression"],["917d81d1","2018-08-27","Publish"],["dee0476d","2018-08-27","docs(examples): update list of examples"],["d7235a3e","2018-08-27","feat(examples): add mouse & touch events for canvas-dial, refactor"],["a0cbd2b8","2018-08-27","feat(atom): add .value accessor aliases (for deref()/reset())"],["cfb2b747","2018-08-27","feat(vectors): add mix1(), minor cleanups"],["ccc40a9d","2018-08-27","feat(rstream-gestures): add options for local & scaled positions"],["b25edbec","2018-08-27","fix(hdom-components): call canvas update from init()"],["3f27acd7","2018-08-27","docs(rstream): update merge() docs"],["b5633b18","2018-08-27","feat(examples): add canvas-dial example (WIP)"],["135d6f1b","2018-08-27","feat(hdom-components): add HDPI adaptation helper for canvas comps"],["9d542b92","2018-08-26","minor(examples): fix/update comments"],["80a5f300","2018-08-26","feat(examples): add client/browser version of commit-log"],["318401c0","2018-08-25","refactor(examples): update components, add docs"],["37718855","2018-08-25","refactor(examples): further DRY & readme updates"],["82db75b2","2018-08-25","docs: fix example table"],["0cd261cf","2018-08-25","docs(example): update example list"],["fca0b13d","2018-08-25","docs(examples): add more comments"],["ae383f8e","2018-08-25","refactor(examples): simplify date handling"],["4be74bae","2018-08-25","fix(examples): commit log parsing, minor update html()"],["d0b1a1e4","2018-08-25","feat(examples): add commit-table-ssr express server / git commit log demo"],["80cae22d","2018-08-25","chore: update make-module script"],["866f3cdd","2018-08-25","refactor(cache): update iterator methods"],["8e9ba347","2018-08-24","Publish"],["113b424b","2018-08-24","docs: fix links in readmes"],["f9a1cc2a","2018-08-24","docs(transducers-stats): fix screenshot link"],["89e1bd51","2018-08-24","docs(rle-pack): fix diagram link"],["1c92f223","2018-08-24","Publish"],["cff9d18a","2018-08-24","docs(transducers): update readme examples"],["7a5be213","2018-08-24","fix(transducers): arg handling in rename()"],["389aff82","2018-08-24","build: update yarn.lock"],["b3f94159","2018-08-24","Merge branch 'feature/tx-v2' into develop"],["3057237f","2018-08-24","refactor(iges): transducer imports & usage"],["28110726","2018-08-24","assets(examples): update crypto-chart screenshot"],["2a443a56","2018-08-24","docs(transducers-stats): update readme"],["024a4e96","2018-08-24","docs(transducers): update readme"],["832e57f1","2018-08-24","fix(transducers): copy&paste error (push)"],["d861bdd1","2018-08-24","fix(transducers): iterator1() final reduced value handling"],["599f2b66","2018-08-24","feat(transducers): update base64Encode() to return string if input given"],["1025996e","2018-08-24","docs(rle-pack): update readme & diagram"],["40415217","2018-08-24","feat(rle-pack): further update data format (non-repeats)"],["694a2537","2018-08-24","feat(rle-pack): update data format, custom repeat sizes, rename fns"],["89b4ad5d","2018-08-23","feat(transducers): update all reducers to accept opt iterables"],["2c3a1147","2018-08-23","feat(transducers): add GroupByOpts interface, update groupBy* reducers"],["8565edb8","2018-08-23","fix(rle-pack): fix initial repeat counts in encodeBytes(), update readme"],["0bd860e6","2018-08-23","feat(transducers): add fill() & fillN() reducers"],["fb3c04da","2018-08-23","refactor(vectors): make Vec & Mat type aliases of NumericArray"],["519394b3","2018-08-23","feat(api): add NumericArray and TypedArray types"],["ecfcdcd9","2018-08-23","build: update yarn.lock"],["116ede83","2018-08-23","docs(transducers): update readme"],["c716e4ac","2018-08-23","add(transducers): add IReducible support for transduce() & run()"],["1280cfd5","2018-08-22","feat(dcons): add IReducible impl, update deps & imports"],["f14f7ce5","2018-08-22","feat(associative): add IReducible impls for SortedMap & SortedSet"],["9d83255a","2018-08-22","perf(transducers): add IReducible, update reduce()"],["fd8e7614","2018-08-09","feat(rle-pack): add support for custom input word sizes"],["4fdd3c92","2018-08-09","docs(transducers): update readme"],["3e659181","2018-08-09","minor(transducers): fix comp import"],["1434b0ed","2018-08-09","refactor(hdom): remove thi.ng/iterators dependency"],["802c5b44","2018-08-09","build(memoize): update/fix dev deps"],["f3d46460","2018-08-09","refactor(rstream): use SEMAPHORE from thi.ng/api, not transducers"],["5d5c70ab","2018-08-09","Merge branch 'master' into feature/tx-v2"],["e9c8ddc6","2018-08-09","chore(strings): update exports, add docs"],["653a175a","2018-08-09","feat(strings): add case converters"],["5209c426","2018-08-09","fix(strings): buffer length (for null inputs) (`center()`)"],["1a20bc2f","2018-08-09","feat(strings): add truncateLeft() & wrap() stringers"],["3a8bd088","2018-08-09","refactor(transducers): replace local types w/ external defs"],["ca0a04e7","2018-08-09","feat(compose): extract comp() & juxt() to new @thi.ng/compose package"],["bea7a1fd","2018-08-09","refactor(resolve-map): replace SEMAPHORE const w/ thi.ng/api def"],["9b443cb4","2018-08-09","refactor(hdom): replace SEMAPHORE const w/ thi.ng/api def"],["c22ac3ce","2018-08-09","refactor(associative): replace Pair & SEMAPHORE w/ identical thi.ng/api defs"],["cf30ba26","2018-08-09","feat(api): add new/move type aliases into api.ts"],["c9ac981a","2018-08-09","feat(transducers-stats): make xforms iterable if input given"],["ab662d8a","2018-08-09","perf(transducers): add iterator1(), update various xforms"],["d130aaa1","2018-08-08","build: fix transducer versions"],["8a111efd","2018-08-08","refactor(transducers): add shared SortOpts, update xforms"],["3e6c4624","2018-08-08","chore: update .gitignore"],["afb267a0","2018-08-08","docs: add graphviz dot files"],["dcccbcba","2018-08-08","refactor(examples): simplify transducer usages"],["c17cb087","2018-08-08","refactor(hdom-components): update/replace deps (iterators => transducers)"],["420cfe37","2018-08-08","test(csp): fix regression to due transducers update"],["d6352267","2018-08-08","refactor(dgraph): update/replace deps (iterators => transducers)"],["78d0a844","2018-08-08","fix(iges): regression to due transducers update"],["065d78ba","2018-08-08","refactor(cache): update/replace deps (iterators => transducers)"],["abe1a886","2018-08-08","refactor(associative): update/replace deps (iterators => transducers)"],["eb1714f5","2018-08-08","refactor(rstream-query): simplify transducer uses"],["cd5c6ff1","2018-08-08","refactor(rstream): update StreamSync transducer init"],["bae8a1d8","2018-08-08","feat(transducers): update all xforms to also work as iterator"],["e713704f","2018-08-08","refactor(transducers): rename inspect() => trace()"],["45e49930","2018-08-08","refactor(transducers): add ReductionFn type alias, update Reducer"],["723da5bb","2018-08-08","fix(transducers): hex type decl"],["ea768ad0","2018-08-08","Publish"],["6a0db9c7","2018-08-08","refactor(examples): replace hex() => radix(), update deps"],["b1ea9a55","2018-08-08","refactor(transducers): deprecate hex(), update hexDump() xform & deps"],["5864f2cd","2018-08-08","feat(strings): add opt prefix arg for radix()"],["a5e2c28a","2018-08-08","feat(transducers): add partitionBits() xform & tests"],["6eb97b58","2018-08-08","Publish"],["b2ebbfc8","2018-08-08","fix(strings): float type decl"],["0f2cf77d","2018-08-08","Publish"],["a14e5b24","2018-08-08","docs: update readmes"],["56d64c50","2018-08-08","refactor(examples): update crypto-chart to use @thi.ng/strings"],["df067d84","2018-08-08","refactor(iges): update to use @thi.ng/strings"],["40781eb3","2018-08-08","feat(strings): re-import & update @thi.ng/strings from MBP2010"],["369f375d","2018-08-08","build(memoize): update deps"],["2bc092d4","2018-08-08","feat(memoize): add optional cache arg for memoizeJ()"],["adc49285","2018-08-07","feat(memoize): add @thi.ng/memoize package"],["252411aa","2018-08-06","Publish"],["46d02f34","2018-08-06","refactor(examples): update rstream examples"],["378772fb","2018-08-06","fix(rstream): add generics for stream()"],["ec777c09","2018-08-03","Publish"],["f7500359","2018-08-03","docs: add rootlevel license file"],["7c54c68f","2018-08-03","refactor(examples): minor update rstream examples"],["361f8b43","2018-08-03","refactor(rstream-query): remove obsolete `reset` in addJoin()"],["f9466317","2018-08-03","refactor(rstream-graph): remove obsolete `reset` in node() factory"],["32810900","2018-08-03","test(rstream): update tests"],["e1f4667c","2018-08-03","chore(rstream): remove obsolete file"],["9101e089","2018-08-03","docs(rstream): add/update docs for all remaining stream constructs"],["e97aac0d","2018-08-03","feat(rstream): add stream() & subscription() factories, add/update docs"],["55499cc4","2018-08-03","feat(rstream): update StreamSync to use `reset: false` by default, update docs"],["2f0235ea","2018-08-03","docs: update main readme"],["4a9b4cce","2018-08-03","Publish"],["c5afc7b3","2018-08-03","refactor(examples): simplify rstream-hdom example"],["fdc7630b","2018-08-03","refactor(iges): only expect ArrayLike points/vectors, minor other updates"],["9ea44beb","2018-08-03","test(transducers): add padLast() tests"],["e50fd10e","2018-08-03","feat(transducers): add peek() helper fn"],["ff91987f","2018-08-03","docs(transducers): add docs & examples for ~50% of all transducers"],["69d25c8c","2018-08-02","refactor(examples): update transducers-hdom example"],["949a5d46","2018-08-02","fix(transducers-hdom): support hdom user context"],["feae35b0","2018-08-02","Publish"],["8ee1b103","2018-08-02","Merge branch 'develop'"],["698bb60d","2018-08-02","fix(examples): add missing files (triple-query)"],["3e70c31a","2018-08-02","feat(examples): add transducers-hdom example"],["7efce7a7","2018-08-02","feat(transducers-hdom): add new package @thi.ng/transducers-hdom"],["d4aa5ea2","2018-08-02","refactor(examples): add new types for crypto-chart example"],["bc26fb33","2018-08-02","Publish"],["381ad971","2018-08-02","Merge branch 'develop'"],["4ce80e79","2018-08-02","docs(vectors): update readme"],["befc7785","2018-08-02","refactor(vectors): update cylindrical coord conversion, add Vec3 methods"],["74f939c3","2018-08-02","feat(vectors): add toCylindrical3() / fromCylindrical3()"],["3039a35a","2018-08-02","feat(vectors): make Vec2/3/4 array-like, add IEquiv impls, add tests"],["2a13f28c","2018-08-02","feat(vectors): add gvec size checks, add IEquiv & Iterable impls"],["d007a8ae","2018-08-02","docs(examples): update example table (add triple-query)"],["248150ee","2018-08-01","Publish"],["b1cf171f","2018-08-01","chore: update make-* scripts, add cloc stats script"],["748131a3","2018-08-01","chore: update .gitignore"],["cbfd65a3","2018-08-01","fix(examples): add utf meta to all example html files"],["1a8ff8a6","2018-08-01","refactor(examples): cleanup imports"],["4db3fa83","2018-08-01","refactor(rstream-query): cleanup imports"],["c1690170","2018-08-01","refactor(rstream-dot): cleanup imports"],["0f7e82ae","2018-08-01","refactor(rstream): cleanup imports"],["14672731","2018-08-01","refactor(hdom): cleanup imports"],["e0ce1061","2018-08-01","Publish"],["68f59f21","2018-08-01","refactor(vectors): add IVec to all vector class wrappers"],["3ca2cbf1","2018-08-01","refactor(iges): make fill mode optional for addPolyline2d()"],["2ac23a34","2018-08-01","Merge branch 'feature/iges' into develop"],["ee24ede1","2018-08-01","Merge branch 'feature/ts3' into develop"],["e7d2675d","2018-08-01","feat(examples): add triple-query example project"],["0f01cc36","2018-08-01","minor: markdown fixes in various readmes"],["542540f0","2018-08-01","build(examples): update webpack deps"],["2ecd5384","2018-08-01","refactor(router): TS3.0 PropertyKey handling"],["bf2a3074","2018-08-01","refactor(pointfree): TS3.0 PropertyKey handling"],["38372cc9","2018-08-01","refactor(interceptors): TS3.0 PropertyKey handling"],["30d65d4b","2018-08-01","refactor(defmulti): TS3.0 PropertyKey handling"],["2234313c","2018-08-01","refactor(associative): TS3.0 PropertyKey handling"],["20478072","2018-08-01","refactor(api): TS3.0 PropertyKey handling"],["c7f72440","2018-08-01","build: update dev dependencies in all packages & examples"],["56a1f0eb","2018-07-30","Publish"],["3534274a","2018-07-30","fix(vectors): get*() return types, refactor using set*()"],["0ca667a4","2018-07-30","Publish"],["3de5cea4","2018-07-30","fix(vectors): naming convention, add function overview tables"],["474f8df5","2018-07-29","Merge branch 'develop' into feature/iges"],["e82d97a7","2018-07-29","docs: update package list main readme"],["aef277f8","2018-07-29","Publish"],["ae1da134","2018-07-29","docs(vectors): update readme & package info"],["acedfae8","2018-07-29","Merge branch 'feature/geom' into develop"],["93b268a6","2018-07-29","docs(vectors): update readme"],["6571b8a3","2018-07-29","test(vectors): add gvec tests"],["d2bdf79e","2018-07-29","refactor(vector): update eqDelta impls, rename array transformers"],["54b3db2d","2018-07-29","feat(vectors): update get & copy fns to retain buffer types"],["f99cf3dc","2018-07-29","refactor(vectors): add gvec default length args"],["5bba592d","2018-07-29","feat(vectors): add swizzle fns, update/unify fn naming"],["e3c61675","2018-07-29","feat(vectors): add generic vec fns & class wrapper"],["1f0551d0","2018-07-28","refactor(vectors): various small fixes/additions (matrices)"],["1ec75e61","2018-07-27","feat(vectors): re-add matrix class wrappers, update vec classes"],["29500b6d","2018-07-26","build: add babel-minify dev dependency"],["21b04f06","2018-07-26","feat(vectors): re-import updated mat44, add orthoNormal3"],["eb3f66fb","2018-07-26","test(vectors): add tests"],["4fdda6a9","2018-07-26","feat(vectors): re-import updated mat23/33/44 functions"],["2a5a744d","2018-07-25","fix(vectors): copy/paste mistakes, add tests"],["e289db2b","2018-07-25","refactor(vectors): add op22/32, simplify various vec2/3 ops"],["b59fadfd","2018-07-25","feat(vectors): add vec4 ops & class wrapper"],["35af6a56","2018-07-25","feat(vectors): add minor/majorAxis(), minor/major2/3"],["5c52f771","2018-07-25","Merge branch 'develop' into feature/geom"],["5a3b9988","2018-07-25","Publish"],["a322e001","2018-07-25","fix(transducers-stats): fix naming of MACD results (#31)"],["03f94352","2018-07-25","Publish"],["d967f94e","2018-07-25","docs(transducers-stats): update docs & readme"],["c97cb75c","2018-07-25","feat(transducers-stats): add BollingerBand value interface"],["b92aaa58","2018-07-25","feat(transducers-stats): add MACD (fixes #31)"],["d1541539","2018-07-25","feat(vectors): re-import vector types from old thi.ng/geom TS version"],["f7a084ae","2018-07-24","feat(iges): add PolylineMode enum, update addPolyline2d()"],["e349cb6a","2018-07-23","docs(transducers): update readmes"],["e7772934","2018-07-21","Publish"],["0b0a7ca9","2018-07-21","feat(transducers-stats): add stochastic oscillator, refactor"],["2953caaa","2018-07-21","feat(examples): add MA mode dropdown, update crypto-chart dataflow"],["e3def294","2018-07-21","refactor(examples): switch to WMA plots in crypto-chart demo"],["fde777d0","2018-07-21","docs: update main readme"],["76dc450d","2018-07-21","feat(range-coder): re-import @thi.ng/range-coder package from MB2010"],["8389a2c7","2018-07-20","Publish"],["7cfb8e5a","2018-07-20","minor(rstream): remove obsolete args (pubsub)"],["a59c5c94","2018-07-20","perf(rstream): optimize dispatch if only single child"],["cd751fb4","2018-07-20","feat(rstream): add reset option for timeout()"],["7b10e0c9","2018-07-20","Merge pull request #30 from andrew8er/feature/rstream-add-timeout"],["e8009a68","2018-07-19","docs(transducers-stats): update readme links"],["52ce30c4","2018-07-19","docs: update main readme"],["7e497439","2018-07-19","build(transducers-stats): update package deps"],["1de746b2","2018-07-19","Merge branch 'feature/tx-stats' into develop"],["7df3ce04","2018-07-19","feat(transducers-stats): add other xforms"],["7a5812fb","2018-07-19","feat(transducers-stats): add @thi.ng/transducers-stats package"],["1fe612de","2018-07-19","docs(transducers): reapply MD fixes"],["3a2aa7a6","2018-07-19","Merge branch 'master' into develop"],["78701493","2018-07-19","feat(examples): update axis ticks, add more symbols, refactor SMAs"],["08db846b","2018-07-19","docs(transducers): update readme"],["64de94b5","2018-07-19","Publish"],["9874acec","2018-07-19","perf(transducers): update movingAverage() xform, add docs"],["482943c8","2018-07-18","docs(transducers): add/update doc strings"],["ccc37c67","2018-07-18","feat(transducer): add asIterable() helper"],["092154c7","2018-07-18","feat(transducers): allow key arrays for rename(), simplify call sites"],["9b07d12a","2018-07-18","feat(transducers): add juxtR() for multiplexed reductions from same src"],["aa55973e","2018-07-17","feat(rstream): Add a timeout() subscription"],["2733684e","2018-07-16","Publish"],["732a0967","2018-07-16","docs(examples): update readme & dataflow diagram"],["3edbaefc","2018-07-16","feat(examples): add auto-refresh, add data credits"],["9be20180","2018-07-16","fix(rstream): emit first value immediately in fromInterval()"],["0508e40a","2018-07-16","docs(examples): add/update types in rstream-hdom"],["694e6c64","2018-07-16","feat(examples): improve time labels on crypto-chart"],["3c1c29ac","2018-07-16","refactor(examples): remove atom usage from rstream-hdom demo, update docs"],["7cd78e03","2018-07-15","feat(examples): add theme support for crypto chart, update diagram"],["9ff8d352","2018-07-15","docs(examples): update list of demos"],["f1e3d081","2018-07-15","docs(examples): add dataflow graph to readme"],["6989b8db","2018-07-15","docs(examples): temp fix live demo link in readme"],["9b26c4b4","2018-07-15","Publish"],["24829454","2018-07-15","fix(resolve-map): add support for alt ES6 destructure form `{a: b}`"],["08a7600a","2018-07-15","build(hdom-components): update @types/webgl dep"],["2d7e7cdf","2018-07-15","build: update dev dependencies"],["c95a3701","2018-07-15","docs(example): add API ref link, update readme"],["a8487edc","2018-07-15","feat(examples): add crypto chart example"],["20b028c6","2018-07-13","chore: update make-module script"],["4f19be90","2018-07-13","docs: fix various markdown issues"],["973f1a42","2018-07-13","Publish"],["ee48a94c","2018-07-13","fix(rstream-gestures): touchevent check in safari"],["d636876d","2018-07-13","Publish"],["976a6d85","2018-07-13","refactor(iges): update formatParams(), optimize iges file size"],["81223dca","2018-07-13","feat(transducers): add wordWrap() xform"],["634de84d","2018-07-12","docs: add @thi.ng/iges to package list"],["3935d9a5","2018-07-12","Publish"],["eb6dfa9b","2018-07-12","build(iges): update package info"],["b841269a","2018-07-12","Merge branch 'feature/iges' into develop"],["087f3480","2018-07-12","refactor(iges): emit compressed globals section"],["7f1b2d46","2018-07-12","feat(iges): re-import & update IGES exporter (via MBP2010)"],["d061c7d0","2018-07-11","Publish"],["73c7b8ac","2018-07-11","perf(interceptors): update valueSetter()/valueUpdater()"],["ad4caad9","2018-07-11","feat(paths): add updater(), refactor updateIn(), update readme"],["fd23a34e","2018-07-11","docs(sax): minor update readme"],["ef161341","2018-07-11","docs(sax): add tests & DOM parsing example to readme"],["8cd279a8","2018-07-10","Publish"],["126103b3","2018-07-10","fix(hdom): always update \"value\" attrib last in diffAttributes()"],["fcfd4bf8","2018-07-09","docs(hiccup-css): fix #26, add pseudo-class & attrib selector docs"],["e4b62d8b","2018-07-09","Publish"],["22890961","2018-07-09","docs(rstream): add AUTHORS.md"],["d485bfa5","2018-07-09","Merge pull request #28 from andrew8er/pr/rstream-fix-transduce"],["03543ee9","2018-07-09","fix(transducers): revert mean() from regression introduced in 095e6ef"],["9513ddd8","2018-07-09","Merge branch 'master' into pr/rstream-fix-transduce"],["5ec61406","2018-07-09","build(examples): add missing html/webpack config for rstream-hdom demo"],["8321660c","2018-07-09","feat(examples): add rstream-hdom example"],["7f2d5dd2","2018-07-09","fix(rstream): Fix potential reference error in transduce()"],["84f23d35","2018-07-09","Publish"],["095e6ef3","2018-07-09","refactor(transducers): add reducer() helper, update existing reducers"],["0430c769","2018-07-04","Publish"],["dbbeffb3","2018-07-04","docs(paths): update docs & readme"],["c7f2f92d","2018-07-04","test(paths): add/update tests"],["3d9d6200","2018-07-04","feat(paths): update setter() to support arrays, optimize (~2.5x faster)"],["7fb407c0","2018-07-04","Publish"],["36165be8","2018-07-04","minor(rstream-graph): formatting"],["de17340a","2018-07-04","feat(rstream-gestures): add event & preventDefault opts, update docs"],["d5ac2643","2018-07-04","feat(rstream): add support for event listener opts in `fromEvent()`"],["9ffa346d","2018-07-03","Publish"],["677c7cc0","2018-07-03","feat(transducers): add ensureArray(), refactor reverse()"],["17d412af","2018-07-03","test(rstream-graph): increase timeout to avoid travis errors"],["a5942022","2018-07-03","Publish"],["33f0d197","2018-07-03","fix(associative): minor SortedSet fixes"],["1e185011","2018-06-29","Merge pull request #24 from andrew8er/pr/rstream-transduce-unsubscibe-on-error"],["8c7d9376","2018-06-28","fix(rstream): unsubscribe on error in transduce()"],["576f1da3","2018-06-25","Publish"],["c4fad707","2018-06-25","fix(rstream-graph): individual node outputs"],["eb2015df","2018-06-21","Publish"],["d0b1e5c4","2018-06-21","feat(rstream-graph): add stop(), fix `const` inputs, update docs/readme"],["cc5b7367","2018-06-21","feat(rstream): option to avoid auto-closing `fromInterval()`, add docs"],["4611e8e0","2018-06-21","chore: update repo & homepage fields in all packages"],["2223bded","2018-06-21","docs: fix package links in readmes"],["a3b245c8","2018-06-20","Publish"],["cd863214","2018-06-20","docs(transducers-fsm): fix readme (example)"],["60dca8ee","2018-06-20","Publish"],["882f3949","2018-06-20","feat(sax): add children & trim opts, add CDATA support"],["6cf0d915","2018-06-19","Publish"],["eed50b81","2018-06-19","docs: update main readme"],["343e07f1","2018-06-19","refactor(sax): wrap FSM handler results as arrays, update ELEM_SINGLE"],["a9ca1351","2018-06-19","feat(transducers-fsm): support multiple results, add tests, update readme"],["8959b938","2018-06-19","docs(sax): update readme (add SVG example)"],["bbd3b4ba","2018-06-19","docs(transducers-fsm): update readme, whitespace"],["bc261e57","2018-06-19","feat(transducers): add matchFirst()/matchLast() xforms, update readme"],["e824b6bb","2018-06-19","feat(sax): add support for escape seqs, minor optimizations"],["4e7fca56","2018-06-18","chore: update make-module script"],["30811ce5","2018-06-18","docs(transducers-fsm): update package keywords"],["cc11ade5","2018-06-18","Publish"],["0e4662d1","2018-06-18","fix(sax): correct docs in readme"],["278a86c2","2018-06-18","Publish"],["b5b26300","2018-06-18","docs: update package docs (bench / dot)"],["42e22921","2018-06-18","docs: update readmes (add/fix links)"],["10e807c5","2018-06-18","Merge branch 'feature/sax' into develop"],["3589e155","2018-06-18","fix(checks): isOdd() for negative values"],["23b9cc2e","2018-06-18","docs(transducers-fsm): update docs & readme"],["0f2fcdff","2018-06-18","feat(sax): add entity support, update result format, update states"],["56deb455","2018-06-17","refactor(sax): remove extracted FSM transducer & types, update readme"],["7c3c2903","2018-06-17","feat(transducers-fsm): inital import"],["64f23789","2018-06-17","feat(sax): update error handling, add parse() wrapper, add FSMOpts"],["a4766a54","2018-06-17","feat(sax): add support for proc & doctype elements, update `end` results"],["3dea9549","2018-06-17","feat(sax): emit child elements with `end` results, support comments"],["74f7d02e","2018-06-17","refactor(sax): extract parser sub-states"],["dce189f9","2018-06-17","feat(sax): initial import"],["f13138a4","2018-06-08","Publish"],["e1a8c915","2018-06-08","docs(hiccup-css): update readme"],["cffab49d","2018-06-08","Merge branch 'feature/hcss-inject' into develop"],["8d6e6c86","2018-06-08","feat(hiccup-css): add injectStyleSheet()"],["244bf213","2018-06-08","feat(hiccup-css): add class scoping support"],["b358c1a7","2018-06-07","Publish"],["e0535b4c","2018-06-07","docs(resolve-map): update readme"],["0beaffb1","2018-06-07","docs(resolve-map): update readme"],["0fc2305e","2018-06-07","fix(rstream-graph): rename `resolveMap` => `resolve` due to upstream changes"],["35deb3b8","2018-06-07","Merge branch 'feature/resolve-auto' into develop"],["e61c3b59","2018-06-07","feat(resolve-map): add cycle detection, fix edge cases"],["57f1ed5f","2018-06-06","feat(resolve-map): add ES6 destructuring shorthands for function vals"],["93b40b78","2018-06-06","Publish"],["720b1f18","2018-06-06","docs(rstream-graph): update api docs & readme"],["576668e3","2018-06-06","Merge branch 'feature/rs-graph-outputs' into develop"],["48c796f5","2018-06-06","fix(resolve-map): also use _resolvePath for plain lookups, optimize"],["dd2cbd44","2018-06-06","refactor(examples): update rstream-graph examples"],["1a09b61e","2018-06-06","minor(rstream-graph): minor fix exported types"],["558f4f8c","2018-06-06","fix(resolve-map): add private _resolveDeep"],["f2e0df25","2018-06-06","feat(rstream-graph): add full/optional support for multiple node outputs"],["dc6e0acc","2018-06-06","refactor(resolve-map): export absPath(), add LookupPath type alias"],["be21c4c2","2018-06-06","feat(rstream-graph): update NodeOutput, support multiple handlers"],["de48e134","2018-06-05","build: add yarn bootstrap"],["67c7e17d","2018-05-30","Publish"],["45785229","2018-05-30","Merge branch 'develop'"],["b267c999","2018-05-30","Merge branch 'feature/command' into develop"],["7ac6227d","2018-05-30","feat(atom): provide prev/curr states to history event listeners"],["94225989","2018-05-29","feat(atom): add INotify impl for History"],["44998ca0","2018-05-20","Publish"],["ad56421a","2018-05-20","refactor(rstream-graph): allow fn vals in GraphSpec too, update test"],["b7560989","2018-05-20","Publish"],["0818498a","2018-05-20","feat(rstream-graph): update types, initGraph(), node1(), add tests"],["c880a633","2018-05-20","Publish"],["773829e4","2018-05-20","minor(rstream): add alt subscribe() overrides (disabled)"],["846aaf97","2018-05-20","feat(rstream): re-implement bisect() using PubSub, update tests"],["cbc600e7","2018-05-20","fix(rstream): minor update PubSub topic fn return type"],["23fdd398","2018-05-19","feat(rstream): update resolve(), update subscribe() overrides"],["0e103c50","2018-05-16","Publish"],["0c292503","2018-05-16","feat(examples): add input clearing"],["7e1028a2","2018-05-15","fix(examples): tab handling in fuzzy dropdown"],["2482b16e","2018-05-15","fix(hdom): delay init() lifecycle call to ensure children are available"],["81b596f6","2018-05-15","refactor(examples): update highlightMatches()"],["db58ebc7","2018-05-15","feat(examples): add fuzzy match highlighting"],["09d531a7","2018-05-15","feat(exmples): add hdom-dropdown-fuzzy (unfinished)"],["577bdde8","2018-05-15","docs: add discord badge"],["7349ef43","2018-05-15","test(hdom): fix/update lifecycle test"],["5595cc2a","2018-05-14","Publish"],["4dd97abd","2018-05-14","docs: update readmes (compare / equiv)"],["4b94a1b9","2018-05-14","docs(api): update doc strings"],["f7b6b342","2018-05-14","Publish"],["191bc981","2018-05-14","chore: update package keywords"],["ade96f86","2018-05-14","fix(hdom): component obj lifecycle method thisArg handling"],["c54f7357","2018-05-14","test(transducers): remove obsolete test file"],["e238541f","2018-05-14","refactor(transducers): replace wrapBoth/Left/Right w/ wrap()"],["fbba5d27","2018-05-14","Publish"],["d59b0af3","2018-05-14","docs(transducers): update readme"],["37362dd2","2018-05-14","test(transducers): add fuzzy tests"],["fc6acd16","2018-05-14","chore(transducers): update deps, readme, re-exports"],["2bebba28","2018-05-14","feat(transducers): add filterFuzzy() xform"],["306625df","2018-05-14","feat(transducers): add wrap*() iterators"],["9efa5762","2018-05-14","docs(resolve-map): update readme"],["4591d5d5","2018-05-14","minor(examples): update dropdown html"],["2076d25b","2018-05-14","docs(resolve-map): add readme example"],["ea185897","2018-05-14","Publish"],["6661fc3a","2018-05-14","feat(examples): add hdom-dropdown example"],["5e729701","2018-05-14","feat(interceptors): update dispatch() / dispatchNow()"],["644d1ffe","2018-05-13","docs(hdom): update readme example"],["5d6e762d","2018-05-13","Publish"],["609d66dd","2018-05-13","docs(hdom): update readme"],["01f0fa56","2018-05-13","Merge branch 'feature/hiccup-context' into develop"],["f8fe5001","2018-05-13","docs(hiccup): update readme"],["67015ce9","2018-05-13","refactor(examples): update svg examples"],["dc775404","2018-05-13","docs(hiccup-svg): resolve #19, update readme, add invocation notes"],["373701b0","2018-05-13","feat(pointfree): add execjs for host calls, update readme"],["396faec8","2018-05-13","refactor(hiccup-svg): rename svgdoc => svg"],["765e7302","2018-05-13","docs(hiccup): update readme"],["b1cb7d9a","2018-05-12","perf(hiccup): update css()"],["feca5666","2018-05-12","refactor(hiccup): fix #19, add support for context object"],["4b8caec9","2018-05-12","docs: update main readme"],["2d4fd682","2018-05-12","docs: update all readme's (add deps links)"],["6ff48a41","2018-05-12","docs(defmulti): update readme"],["8b2e67ce","2018-05-12","Publish"],["41ce19c5","2018-05-12","test(csp): update IEnabled test impl"],["67f0e546","2018-05-12","refactor(dcons): update pop()"],["9b388604","2018-05-11","refactor(api): update interfaces, add docs"],["04b66b2f","2018-05-11","Publish"],["fbb721f8","2018-05-11","docs: remove dep graph from main readme, update package"],["eeed25ed","2018-05-11","feat(defmulti): add generics, update docs & readme"],["011519d7","2018-05-11","docs: update dep graph"],["2fd3d822","2018-05-11","Publish"],["126ecf36","2018-05-11","feat(defmulti): add defmultiN(), update readme, add tests"],["5391d986","2018-05-11","fix(pointfree): minor update error handling"],["5227dd1f","2018-05-11","refactor(errors): update return types (`never`)"],["790d0130","2018-05-11","test(defmulti): add tests"],["8c74a99d","2018-05-10","docs: update dep graph"],["08cef30e","2018-05-10","Publish"],["304669de","2018-05-10","Merge branch 'feature/defmulti' into develop"],["7ae718c5","2018-05-10","docs: update main readme"],["edc66bf2","2018-05-10","feat(defmulti): add @thi.ng/defmulti package"],["a818acd4","2018-05-10","docs(transducers): update readme"],["e6f2972b","2018-05-10","docs: update dep graph"],["051a05db","2018-05-10","Publish"],["55f29b8f","2018-05-10","feat(transducers): add normRange() iterator"],["bd1fba33","2018-05-10","docs: update dep graph"],["c72e81c3","2018-05-10","Publish"],["7af3ef86","2018-05-10","docs: update readmes"],["6349b918","2018-05-10","Merge branch 'feature/api-split' into develop"],["fc7c5c70","2018-05-10","refactor(examples): update imports"],["bdf5bf06","2018-05-10","refactor(examples): update imports"],["bc456364","2018-05-10","refactor: update deps & imports in all packages due to @thi.ng/api split"],["f051ca3c","2018-05-10","refactor(api): remove obsolete files from package"],["9466d4b2","2018-05-10","feat(bench): add new package @thi.ng/bench"],["e4a87c41","2018-05-10","feat(compare): add new package @thi.ng/compare"],["1e97856f","2018-05-10","feat(errors): add new package @thi.ng/errors"],["6d12ae08","2018-05-10","feat(equiv): add new package @thi.ng/equiv"],["aba06b0c","2018-05-10","docs(examples): fix link"],["34903210","2018-05-10","feat(examples): add icon button"],["a49e30cf","2018-05-10","Merge branch 'master' into develop"],["d5f1037a","2018-05-10","fix(examples): fix #22, update router-basics"],["7a8e43ea","2018-05-10","docs(examples): update readmes"],["cea77deb","2018-05-09","feat(examples): add hdom-theme-adr-0003 demo"],["5af437c1","2018-05-09","docs(hdom-components): add ADR-0003"],["b4476cb9","2018-05-09","refactor(hdom-components): add ButtonGroup type alias"],["1dd6e9a2","2018-05-09","docs: update dep graph"],["5da6c578","2018-05-09","Publish"],["6e7599ac","2018-05-09","docs(resolve-map): update/fix doc strings"],["5d2a3fe8","2018-05-09","refactor(resolve-map): fix #21"],["68ca46d2","2018-05-09","feat(dgraph): add leaves() & roots() iterators, update sort()"],["91a2b748","2018-05-09","docs: add @thi.ng/dot to main readme"],["b5132b3d","2018-05-09","docs: update dep graph"],["850716bc","2018-05-09","Publish"],["d8d9435e","2018-05-09","build: update deps in all packages, examples & scripts"],["68ea0864","2018-05-09","fix(hdom): native boolean attrib handling (e.g. \"checked\")"],["ede76916","2018-05-09","docs(hdom-components): update readme"],["053c8c6f","2018-05-09","feat(rstream-gestures): add zoom smooth config option, update readme"],["b52c503e","2018-05-09","docs: update readme's"],["5991be61","2018-05-09","feat(associative): add new functions, update arg & return types"],["c0950d65","2018-05-08","feat(hdom-components): add buttonGroup"],["5416887a","2018-05-07","doc(hdom-components): update ADR-0002"],["c0fef3d3","2018-05-07"," doc(hdom-components): update ADR-0002"],["a9574a0b","2018-05-07","feat(associative): add mapKeysObj() / mapKeysMap()"],["cefb1994","2018-05-07","refactor(hdom-components): remove CanvasOpts, update re-exports"],["4f8e7bab","2018-05-07","refactor(hdom-components): update notification & appLink comps"],["a11803c4","2018-05-07","feat(hdom-components): add notification component"],["ec41eb9c","2018-05-07","refactor(hdom-components): update button args"],["5e815256","2018-05-05","doc(hdom-components): add ADRs"],["cef3c6a8","2018-05-05","feat(hdom-components): add button component"],["334a4d24","2018-05-04","refactor(hdom-components): make pager more customizable"],["23b64517","2018-05-04","refactor(dot): replace NodeShape enum, minor other refactoring, add example"],["500dfa3b","2018-05-03","feat(dot): initial import @thi.ng/dot"],["f9a2daf2","2018-05-02","feat(hdom-components): add title component"],["6748515b","2018-05-02","feat(interceptors): add dispatch/dispatchNow() helper interceptors"],["5a6ce274","2018-05-02","build(examples): update packages"],["cbfa44b7","2018-05-02","build: update dev deps in all packages"],["efb288df","2018-05-01","feat(hdom-components): add pager component, add @thi.ng/iterators dep"],["b2806236","2018-05-01","docs: update dep graph"],["212e5013","2018-05-01","Publish"],["146fad62","2018-05-01","build: update upload-examples script"],["593654a7","2018-05-01","docs: update dep graph"],["a93cb98b","2018-05-01","fix(hdom): boolean attrib reset/removal"],["698438a5","2018-04-30","docs: update dep graph"],["f6e944c6","2018-04-30","Publish"],["7a543a50","2018-04-30","perf(hdom): only build linear diff edit log"],["431527a5","2018-04-30","perf(diff): add option to only build linear edit log"],["12b8dcb3","2018-04-30","fix(examples): CA dropdown"],["c2a5bcb3","2018-04-29","docs: update dep graph"],["5888f224","2018-04-29","Publish"],["95c57ec3","2018-04-29","Merge branch 'hotfix/arraylike'"],["491a6f85","2018-04-29","revert: b86d5b2"],["31ec3af4","2018-04-29","perf(hdom): update event handling in diffAttributes()"],["a7c5eafc","2018-04-29","refactor(examples): update todo list"],["b86d5b25","2018-04-29","refactor(examples): update hdom-basics"],["7fdf1721","2018-04-29","perf(api): major speedup equivObject(), update equivSet()"],["76920f75","2018-04-29","fix(checks): return type isMap()"],["ac60404e","2018-04-29","fix(checks): exclude functions in isArrayLike()"],["a6dc02e4","2018-04-28","docs: update dep graph"],["048632a4","2018-04-28","Publish"],["c4d8851d","2018-04-28","fix(interceptors): multiple sidefx value assignment"],["2aaa134a","2018-04-28","refactor(examples): minor update rstream-grid, add missing files"],["7c3faed2","2018-04-28","docs(interceptors): update readme"],["cba30e36","2018-04-28","docs(examples): update readme"],["1c469afa","2018-04-28","minor(examples): update rstream-grid sidebar"],["115dff2b","2018-04-28","docs: update dep graph"],["df55f40b","2018-04-28","Publish"],["661e34f5","2018-04-28","feat(examples): add rstream-grid dataflow demo"],["f4a095a5","2018-04-28","feat(interceptors): add dispatchLater()"],["f84fe450","2018-04-27","docs: update dep graph"],["8f5b3d91","2018-04-27","Publish"],["6f95bcb3","2018-04-27","feat(rstream-query): add obj->triple converter, update readme & example"],["d03520d8","2018-04-26","docs: update dep graph"],["085a81d9","2018-04-26","Publish"],["af6c807e","2018-04-26","style: reformat/sort imports in all packages"],["d36a5eaf","2018-04-26","refactor(rstream-query): simplify case selection in addPatternQuery()"],["2ab5af5d","2018-04-26","build: update/add upload scripts"],["5c048615","2018-04-26","docs: update dep graph"],["7fa54577","2018-04-26","Publish"],["ced200af","2018-04-26","docs(rstream-query): update readme, diag, add example"],["75f2af2e","2018-04-26","perf(rstream-query): optimize pattern queries, fix bindVars()"],["6bcd5dd4","2018-04-26","docs: update dep graph"],["6d261caa","2018-04-26","Publish"],["f5735a66","2018-04-26","Merge branch 'feature/rs-query' into develop"],["d093a5c8","2018-04-26","feat(rstream-query): add query spec types, addQueryFromSpec(), dedupe xforms"],["2ac8bff3","2018-04-26","feat(api): support more types in equiv(), add tests"],["a865f62b","2018-04-26","feat(checks): add date, map, nan, set checks"],["d057d954","2018-04-26","feat(rstream-dot): add option to include stream values in diag"],["76f00c36","2018-04-26","refactor(rstream): update ISubscribable (add IDeref parent)"],["679c4e08","2018-04-26","feat(rstream-query): add path query, multi-joins, pattern query reuse"],["9b5c58ac","2018-04-25","feat(rstream-query): rename TripleStore methods, use Set-like API"],["443ff8f6","2018-04-25","feat(rstream-query): add removeTriple(), simplify wildcard subqueries"],["c5f36a2d","2018-04-25","feat(rstream-query): add addQueryJoin(), add type aliases, update tests"],["7d927144","2018-04-25","docs: update dep graph"],["6215335f","2018-04-25","Publish"],["888f4e56","2018-04-25","build: update package keywords"],["cf388ddb","2018-04-25","docs: update rstream-* readmes"],["28cf39f9","2018-04-25","build: temporarily force node v9 for travis"],["72aa848a","2018-04-25","docs: update dep graph"],["a3e0cf82","2018-04-25","Publish"],["cc286e12","2018-04-25","fix(rstream): minor fix StreamSync.addAll()"],["fa36f989","2018-04-25","docs: update main readme"],["60bd67a4","2018-04-25","docs: update dep graph"],["8fc5fb40","2018-04-25","Publish"],["2f3bdaea","2018-04-25","build: update make-module script"],["b121c476","2018-04-25","refactor(rstream-query): rename types, update readme"],["97a6e945","2018-04-24","docs: update various readmes"],["781ae217","2018-04-24","test(rstream-query): add query tests"],["d9b845e0","2018-04-24","feat(rstream-query): add param queries w/ variables, update addPatternQuery"],["6368cd2d","2018-04-24","docs(rstream-dot): update readme, add diagram"],["3135da20","2018-04-24","docs(examples): update rs-dlow diagram & readme"],["a68eca0b","2018-04-24","feat(rstream-query): add IToDot impl for graphviz conversion/viz"],["7ffaa615","2018-04-24","feat(rstream-dot): add xform edge labels, extract types to api.ts"],["32fb7ff9","2018-04-24","docs(rstream-graph): update readme"],["2b9a8883","2018-04-24","refactor(rstream-graph): extract ensureInputs(), update docs"],["e11b9a80","2018-04-24","refactor(examples): update rstream-dataflow to use new specs"],["d564e109","2018-04-24","refactor(rstream-graph): update node input specs & node factories"],["3408c137","2018-04-24","feat(rstream-gestures): allows partial opts, add ID option"],["b3928174","2018-04-24","perf(rstream): support (re)named StreamSync inputs"],["66ec92fb","2018-04-24","feat(rstream-query): update index & sub-query caching/reuse"],["d35b5ff1","2018-04-24","feat(examples): add graphviz DOT output for rstream-dataflow"],["704025a9","2018-04-24","feat(rstream-dot): support multiple roots in walk()"],["0153903d","2018-04-24","feat(rstream-graph): add IDs for all generated nodes, rename factory type"],["e72478ab","2018-04-24","feat(rstream-dot): initial import @thi.ng/rstream-dot package"],["33f55b3e","2018-04-24","feat(rstream): add owner meta data & IDs for merge/sync inputs"],["16fabb8c","2018-04-23","refactor(rstream-query): simplify addQuery()"],["a4aa4cb3","2018-04-23","refactor(rstream-query): simplify query handling, optimize addFact()"],["ef3903e4","2018-04-23","feat(rstream-query): initial import"],["c73b0be9","2018-04-22","docs: update dep graph"],["d4423f2c","2018-04-22","Publish"],["03cee0fa","2018-04-22","build(heaps): update package desc"],["aa78d77e","2018-04-22","fix(cache): TLRUCache.get(), add tests, update package"],["7d38e5b0","2018-04-22","test(cache): add tests"],["9d53ae33","2018-04-22","feat(cache): add TLRUCache.prune(), fix ensureSize()"],["fa67252c","2018-04-22","docs: update dep graph"],["23e36a10","2018-04-22","Publish"],["944aaf6d","2018-04-22","test(heaps): add tests"],["fccb3af1","2018-04-22","feat(heaps): iterator now returns min() seq"],["58945727","2018-04-22","fix(heaps): add DHeap ICopy/IEmpty impls, fix return types"],["c4bbee0a","2018-04-22","feat(heaps): add min/max(), update heapify() and percolate methods"],["34996f23","2018-04-22","docs: update package list main readme"],["d6e175db","2018-04-22","docs: update dep graph"],["17ccbb1f","2018-04-22","Publish"],["05a68dbe","2018-04-22","Merge branch 'feature/lru' into develop"],["b83c0300","2018-04-22","minor(cache): cleanup"],["ab4abf55","2018-04-22","refactor(heaps): major update / simplify, fix DHeap, add accessors"],["24113b27","2018-04-21","docs(cache): update readme"],["574b5d96","2018-04-21","feat(cache): add TLRUCache"],["c4a9c074","2018-04-21","fix(cache): recompute size in LRUCache.delete(), extract removeEntry()"],["0ea0847d","2018-04-21","feat(heaps): import @thi.ng/heaps package"],["26c4cfd0","2018-04-21","feat(cache): add MRUCache, update package & readme"],["00ca831f","2018-04-21","refactor(cache): make LRU ops O(1), update/remove (some) interfaces"],["19f7e761","2018-04-21","feat(dcons): add asHead()/asTail()"],["3947419c","2018-04-21","fix(cache): don't insert new val if > maxsize"],["1c9d73f5","2018-04-21","docs(cache): update readme"],["d37a91eb","2018-04-21","refactor(cache): update/extend ICache & LRUCache, update readme"],["7bbbfa88","2018-04-20","feat(cache): initial import @thi.ng/cache package"],["dab48115","2018-04-20","docs: update dep graph"],["ff5705d4","2018-04-20","Publish"],["a335a66e","2018-04-20","docs(rstream): update readme"],["ba10907c","2018-04-20","feat(rstream): allow arbitrary PubSub topic vals, add @thi.ng/associative dep"],["bb11ddfb","2018-04-20","fix(associative): allow partial options arg for EquivMap ctor"],["27a098d7","2018-04-20","feat(rstream): add PubSub, add ISubscribableSubscriber, remove cache()"],["40903ea2","2018-04-19","docs: update dep graph"],["e0e95587","2018-04-19","Publish"],["d40f3a82","2018-04-19","docs: update dep graph"],["f77b443d","2018-04-19","Publish"],["87e3b488","2018-04-19","feat(interceptors): add EV_TOGGLE_VALUE handler, update EV_UNDO/REDO"],["920a3406","2018-04-19","docs(hdom): update readme"],["a2320ff2","2018-04-18","docs(paths): update readme"],["e0b41d81","2018-04-18","docs: update dep graph"],["59806881","2018-04-18","Publish"],["b7dff0ea","2018-04-18","fix(rstream-graph): import path"],["6fcc2358","2018-04-18","docs: update dep graph"],["adc2fb4a","2018-04-18","Publish"],["3b7c9d97","2018-04-18","fix(transducers): add generics for compR(), fix types in mapNth()"],["4c014b18","2018-04-18","Merge pull request #17 from andrew8er/pr/compr-types"],["c26fed40","2018-04-18","docs: update dep graph"],["88283db1","2018-04-18","Publish"],["3087776e","2018-04-18","fix(rstream-log): ID handling in Logger ctor"],["08af60af","2018-04-18","refactor(rstream-log): minor update matchID()"],["de474933","2018-04-18","docs(rstream-log): fix typo"],["0de3d200","2018-04-18","docs(examples): add undo info (svg-waveform)"],["c67607b7","2018-04-18","build(examples): update dev deps"],["bb60cb9f","2018-04-18","build: update dev deps"],["b8bb801a","2018-04-17","docs: update dep graph"],["7e585e2b","2018-04-17","Publish"],["8f3a3d10","2018-04-17","feat(paths): add setInMany() and mutInMany(), add @thi.ng/api dependency"],["78b998cb","2018-04-17","docs: update dep graph"],["fbe15446","2018-04-17","Publish"],["2e32c3b9","2018-04-17","feat(examples): add instrumentation to router-basics demo"],["1a6ac54d","2018-04-17","feat(interceptors): add event handler instrumentation"],["5107dcad","2018-04-17","docs: update dep graph"],["e5185cf2","2018-04-17","Publish"],["d7ff997b","2018-04-17","fix(interceptors): filter out undefined sidefx vals"],["de89f00d","2018-04-17","fix(transducers): Provide argument types for compR() and deepTransform()"],["a9a7bfae","2018-04-16","docs: update dep graph"],["b523e9ef","2018-04-16","Publish"],["5ddb19c6","2018-04-16","feat(rstream-graph): add addNode()/removeNode()"],["8bcc2870","2018-04-16","feat(rstream): add StreamMerge/Sync.removeID() & removeAllIDs()"],["a379d12d","2018-04-16","feat(resolve-map): support relative parent refs, update tests/readme"],["e643e7fe","2018-04-16","docs: update dep graph"],["df039db1","2018-04-16","Publish"],["144f2684","2018-04-16","Merge branch 'feature/rm-refactor' into develop"],["6992e82b","2018-04-16","feat(resolve-map): resolve each ref only once, re-use resolved results"],["4c1bd85c","2018-04-16","feat(paths): add mutator() & mutIn()"],["b00b5a28","2018-04-16","docs: update dep graph"],["dbb96fe2","2018-04-16","Publish"],["56d919c0","2018-04-16","fix(rstream-graph): create null sub for ID renaming"],["f5aba033","2018-04-16","docs: update dep graph"],["17584b5d","2018-04-16","Publish"],["9a83d4ef","2018-04-16","fix(interceptors): update undo handling to support history cursors"],["b856fecc","2018-04-15","docs(associative): update readme"],["c7e760ea","2018-04-15","docs: update dep graph"],["3111409c","2018-04-15","Publish"],["df32a59e","2018-04-15","docs(rstream-gestures): update package"],["e6c75b4a","2018-04-15","refactor(rstream-log): update package structure & readme example"],["2164ddfd","2018-04-15","feat(rstream): add Subscription.transform()"],["7cf93fc5","2018-04-15","docs(rstream): update readme"],["b667c88c","2018-04-15","docs(examples): update readme"],["f39affc1","2018-04-15","docs: update main readme"],["2942d1c3","2018-04-15","docs: update dep graph"],["f2ae6d24","2018-04-15","Publish"],["1479cd1e","2018-04-15","Merge branch 'feature/rstream-graph' into develop"],["a0063992","2018-04-15","refactor(examples): simplify rstream-dataflow example"],["619b4b37","2018-04-15","feat(rstream-graph): initial import @thi.ng/rstream-graph"],["937e5025","2018-04-15","docs: update dep graph"],["e6d7882d","2018-04-15","Publish"],["9ae2e035","2018-04-15","build(examples): update project structure for router-basics/svg-waveform"],["a597e728","2018-04-15","feat(examples): add undo/redo feature to svg-waveform, update components"],["a1d9ae68","2018-04-15","refactor(interceptors): refactor undo handling"],["cf42260c","2018-04-15","feat(atom): update History.record(), add IHistory interface"],["3c92f7e6","2018-04-15","feat(interceptors): add undo/redo handlers/fx & snapshot() interceptor"],["a102eb7c","2018-04-15","feat(interceptors): add default FX_UNDO/REDO side fx"],["ba0c876d","2018-04-14","refactor(interceptors): also pass ctx to sidefx handlers"],["183af614","2018-04-14","feat(interceptors): update processQueue(), expose full ctx to handlers"],["d539b4f3","2018-04-14","docs: update dep graph"],["83be0dce","2018-04-14","Publish"],["010f32e9","2018-04-14","docs: update readme files"],["9eec054a","2018-04-14","Merge branch 'develop'"],["85f5fdd4","2018-04-14","Merge branch 'feature/rs-gestures' into develop"],["885fcf15","2018-04-14","build: update make-module script"],["3f8dbc9e","2018-04-14","refactor(examples): update rs-dataflow demo"],["de1ac7bb","2018-04-14","feat(rstream-gestures): initial import @thi.ng/rstream-gestures"],["4755212f","2018-04-14","docs: update readme's"],["7b510487","2018-04-14","build(examples): add html & webpack config"],["6198899d","2018-04-14","docs: update dep graph"],["0243b44d","2018-04-14","Publish"],["c6b3025c","2018-04-14","build: import depgraph script"],["9e98ce12","2018-04-14","refactor(examples): update svg-waveform demo"],["1b21710a","2018-04-13","feat(examples): add svg-waveform example"],["584223ca","2018-04-13","refactor(examples): rename interceptors in interceptor-basics,"],["86883e3c","2018-04-13","feat(interceptors): add ensureStateRange() & ensureParamRange() iceps"],["6da2d397","2018-04-13","docs: update dep graph"],["816950a8","2018-04-13","Publish"],["07628f67","2018-04-13","build: fix package clean tasks"],["d798cee3","2018-04-13","refactor(dgraph): regression update due to @thi.ng/associative changes"],["bfabe802","2018-04-13","feat(associative): add renameKeysMap"],["1f8af6c4","2018-04-13","refactor(associative): update EquivMap, update SortedSet, add docs"],["d1178acf","2018-04-13","perf(associative): update equiv() impls"],["76e5c853","2018-04-13","docs: update dep graph"],["f4b4067e","2018-04-13","Publish"],["26361437","2018-04-13","refactor(dgraph): update ArrayMap/Set refs"],["2f33389a","2018-04-13","docs(associative): update readme"],["87560270","2018-04-13","refactor(associative): rename EquivMap/Set => ArrayMap/Set, export interfaces"],["a7698563","2018-04-13","refactor(associative): add private impls for EquivMap/Set"],["cb4976fe","2018-04-12","feat(associative): add SortedSet, update SortedMap"],["ae0eae8e","2018-04-12","feat(associative): add SortedMap & tests, minor refactor EquivMap"],["82be16d4","2018-04-11","docs: update dep graph"],["3c1e2dd7","2018-04-11","Publish"],["52c75085","2018-04-11","feat(transducers): add run() for executing side effects only, update readme"],["5f94efa0","2018-04-10","docs: update dep graph"],["fa794a6e","2018-04-10","Publish"],["675847b8","2018-04-10","fix(dgraph): update corrupted deps"],["9b1c7bdb","2018-04-10","docs: update dep graph"],["5dd34261","2018-04-10","Publish"],["26d8ed85","2018-04-10","v0.1.0"],["efe606e1","2018-04-10","build(dgraph): update package desc"],["e7a5c93e","2018-04-10","build(associative): update package desc"],["207dd992","2018-04-10","docs: update package list main readme"],["371cd42f","2018-04-10","build(associative): update deps (dcons)"],["3e90117a","2018-04-10","Merge branch 'feature/dgraph' into develop"],["0dc9f646","2018-04-10","feat(associative): add EquivSet.first()"],["e086be6b","2018-04-10","feat(dgraph): re-import DGraph impl & tests, update readme"],["10c089a3","2018-04-10","feat(dcons): add IEmpty impl, minor refactoring"],["cc70dbce","2018-04-10","feat(associative): initial import @thi.ng/associative"],["fd27a946","2018-04-09","build: update lerna"],["69efee12","2018-04-09","docs(hdom): add authors.md"],["2357355a","2018-04-09","docs: update dep graph"],["c2cd9fbc","2018-04-09","Publish"],["2a91e302","2018-04-09","perf(hdom): intern imported checks, update normalizeTree(), add docs, fix tests"],["7e3070a2","2018-04-09","docs: update dep graph"],["d9aeed47","2018-04-09","Publish"],["b9d9a493","2018-04-09","fix(hiccup-svg): path(), update add null check for points()"],["acc9c13b","2018-04-09","refactor(examples): update router demo"],["5dfcd1ad","2018-04-08","docs: update dep graph"],["179efc44","2018-04-08","Publish"],["6f45ec6d","2018-04-08","v0.1.0"],["2458b15f","2018-04-08","docs(hiccup-svg): update readme"],["fcf1404e","2018-04-08","refactor(hiccup): remove obsolete deref check"],["4ed84eb5","2018-04-08","docs(hdom): update readme"],["a904599c","2018-04-08","docs(hdom): update/fix readme"],["d832c9d2","2018-04-08","docs(hdom): update readme & doc strings"],["3e7e0256","2018-04-08","Merge branch 'feature/hdom-context' into develop"],["905467c1","2018-04-08","refactor(examples): update cellular-automata & hdom-benchmark"],["0873832d","2018-04-08","refactor(hdom-components): update dropdown components"],["4a18e884","2018-04-08","refactor(examples): update webgl demo to use new canvas component"],["8b0d6015","2018-04-08","build: update main yarn.lock"],["7c88a3fc","2018-04-08","feat(hdom-components): update canvas handlers, add webgl2 version"],["e06e5042","2018-04-08","refactor(examples): update todo-list"],["6faa38a0","2018-04-08","refactor(examples): update webgl demo"],["1e798ce7","2018-04-08","docs: add hiccup-svg to main readme"],["7e0aeb68","2018-04-08","refactor(examples): update pointfree-svg"],["afccabdc","2018-04-08","feat(hiccup-svg): re-add svg fns as new @thi.ng/hiccup-svg package"],["86d1f0d9","2018-04-08","refactor(hdom-components): remove svg, update canvas (hdom context support)"],["a8a55a4f","2018-04-08","refactor(examples): major update router-basics (hdom context usage)"],["14b9cecc","2018-04-08","refactor(examples): update dashboard, hdom-basics & hdom-benchmark"],["70cfe06c","2018-04-08","feat(hdom): fix #13, add support for user context and pass to components"],["40d706b6","2018-04-07","feat(checks): add hasPerformance() check (performance.now)"],["d310345f","2018-04-07","feat(api): add bench() & timed() utils"],["4d79f763","2018-04-07","refactor(examples): add GestureEvent (rs-dflow)"],["c1c81bd0","2018-04-07","refactor(interceptors): update Event id type (string => PropertyKey)"],["37ba4d17","2018-04-05","refactor(examples): update rstream-dflow"],["a19f8a4d","2018-04-05","feat(examples): update rstream-dflow example"],["dccfc827","2018-04-05","docs(rstream): update readme"],["8ce73078","2018-04-05","refactor(examples): minor updates rstream-dflow"],["fce54223","2018-04-05","build(dgraph): import dgraph package stub to avoid travis build errors"],["8eb7e68c","2018-04-05","fix(examples): update GH links in html files"],["f9bfc9d7","2018-04-05","docs(hdom): update readme"],["56f4a26a","2018-04-05","docs: update dep graph"],["45c7daf4","2018-04-05","Publish"],["48310a68","2018-04-05","fix(rstream): correct wrong isString() import"],["9ab15442","2018-04-05","docs(examples): update doc strings"],["04b9c087","2018-04-05","docs(examples): update readme"],["23327874","2018-04-05","docs(examples): update rs-dflow example"],["ae27bd65","2018-04-05","refactor(examples): update rstream-dflow example"],["218150a9","2018-04-04","docs(examples): update readme, add dflow graph viz"],["72a96130","2018-04-04","feat(examples): add rstream-dataflow example"],["1eb8b12c","2018-04-04","docs: update dep graph"],["343956d3","2018-04-04","Publish"],["bffc4430","2018-04-04","fix(checks): add prototype check for isPlainObject(), add tests"],["9c91dc34","2018-04-03","fix(examples): minor update pointfree-svg example"],["9621f1b1","2018-04-03","docs: update dep graph"],["5276322a","2018-04-03","Publish"],["68727859","2018-04-03","Merge branch 'feature/pointfree-lang' into develop"],["ca5dfd3c","2018-04-03","docs(pointfree-lang): update readme"],["3310ec3d","2018-04-03","feat(pointfree-lang): implement dynamic var scoping & local var grammar"],["1c899a18","2018-04-03","refactor(pointfree-lang): rename grammar rule / nodetype MAP=>OBJ, add docs"],["5450e507","2018-04-03","fix(pointfree-lang): update grammar (parse order), add tests"],["769e84da","2018-04-03","feat(pointfree-lang): overhaul visitor quote/array & map handling, grammar"],["2101e926","2018-04-03","feat(pointfree): add math ops, update load/loadkey, update tests"],["26905f09","2018-04-02","refactor(examples): update pf svg example"],["ee684c7b","2018-04-02","feat(pointfree-lang): update grammar, aliases, ASTNode, NodeType"],["92d2d685","2018-04-01","refactor(pointfree): update/rename storeat => setat, update tests"],["68a8dba6","2018-04-01","feat(pointfree): add copy() word"],["42cc7786","2018-04-01","docs: update dep graph"],["996b5ff7","2018-04-01","Publish"],["4c7e9068","2018-04-01","docs: update all package readme's"],["cb7276e6","2018-04-01","chore: update make-module/example scripts"],["d4951f5e","2018-04-01","docs(examples): update all example readme's"],["c7521980","2018-04-01","build: add missing package descriptions, update yarn.lock"],["c2d22337","2018-04-01","Merge branch 'feature/examples-webpack' into develop"],["e2ac1852","2018-04-01","build: update dev dependencies for all packages & examples"],["bc264d39","2018-03-31","build(examples): update tsconfig for all examples"],["8273674d","2018-03-31","build(examples): update all examples to use webpack 4.4.*"],["1022ab67","2018-03-31","fix(examples): update stack comment for write-file"],["89ea6331","2018-03-31","fix(examples): update readme (pf-svg)"],["f3477690","2018-03-31","docs(pointfree-lang): update readme"],["7b5a36fd","2018-03-31","docs(examples): update example list"],["3f33b651","2018-03-31","refactor(examples): update pointfree-svg demo/readme"],["208b5c39","2018-03-31","fix(pointfree-lang): object literal grammar rule (allow initial WS)"],["910b7187","2018-03-31","feat(examples): add pointfree-svg demo"],["a0e0a0ca","2018-03-31","docs: update dep graph"],["6d836772","2018-03-31","Publish"],["659cce91","2018-03-31","fix(pointfree-lang): add ensureEnv, update re-exports, update readme"],["a0bf7810","2018-03-31","fix(pointfree): reexport ensureStack fns"],["b16c8500","2018-03-31","docs(pointfree-lang): fix readme link"],["fbb17957","2018-03-31","docs(pointfree-lang): fix grammar link"],["f2a56266","2018-03-31","docs: update main readme"],["430caf03","2018-03-31","docs: update dep graph"],["6f743ae1","2018-03-31","Publish"],["9e43405a","2018-03-31","docs: update pointfree readme's"],["32e2da0d","2018-03-31","docs: update dep graph"],["82008c38","2018-03-31","v0.1.0"],["d838610f","2018-03-31","Merge branch 'feature/pointfree-lang' into develop"],["0623df69","2018-03-31","build: add pegjs dev dependency"],["3dec35a8","2018-03-31","feat(pointfree-lang): initial import @thi.ng/pointfree-lang"],["5db90c53","2018-03-31","feat(pointfree): add caseq()"],["0da93da6","2018-03-29","docs: update dep graph"],["fdfbe425","2018-03-29","Publish"],["d47d0b36","2018-03-29","docs(pointfree): update readme"],["b096e436","2018-03-29","feat(pointfree): add more dataflow combinators, words & tests"],["c0a653b6","2018-03-29","docs(pointfree): update readme"],["9f866da4","2018-03-29","docs(pointfree): update readme"],["3dc30a8e","2018-03-29","feat(pointfree): add combinators, update controlflow words, remove execq"],["39b59677","2018-03-29","docs: update dep graph"],["6b5033f0","2018-03-29","Publish"],["6cbacec7","2018-03-29","feat(hdom-components): add svg line()"],["0baf1f8a","2018-03-29","docs(pointfree): update readme & package"],["fe1f3a3a","2018-03-29","test(pointfree): add tests"],["943b4f9c","2018-03-29","feat(pointfree): add new words, constructs, aliases, fix re-exports"],["221ece65","2018-03-29","build: update make-module/make-example scripts"],["6904d440","2018-03-28","docs: update dep graph"],["aa9439ef","2018-03-28","Publish"],["9b00a25f","2018-03-28","build: add benchmark dev dep"],["e35a2ca1","2018-03-28","build(paths): update package"],["e52b8693","2018-03-28","feat(pointfree): major update readme, package"],["0f0c382f","2018-03-28","feat(pointfree): add new words, rename words, remove mapnth, pushl2"],["10d5a347","2018-03-28","fix(pointfree): add 0-arity comp() (identity fn)"],["ba0bcc21","2018-03-27","refactor(pointfree): rename core words & change case"],["1c4cd2f3","2018-03-27","feat(pointfree): add rstack, update StackContext"],["50cc65fe","2018-03-26","build: update yarn scripts / add missing nyc dev dep"],["2b7e99b9","2018-03-26","fix(api): illegalState() creates IllegalStateError"],["1a01f9a0","2018-03-26","fix(pointfree): wordU(), add tests"],["3252554f","2018-03-26","feat(pointfree): further restructure, perf, add tests"],["a48361d6","2018-03-25","feat(pointfree): major refactor & restructure"],["d1564bb1","2018-03-25","docs(pointfree): update readme"],["79b4ce32","2018-03-25","feat(pointfree): update all words to return stack"],["f3f0bec1","2018-03-24","feat(pointfree): update word/wordU, add append(), tuple(), join()"],["06987133","2018-03-23","docs: update dep graph"],["c5bcdafa","2018-03-23","Publish"],["be9ba2fd","2018-03-23","Merge branch 'hotfix/pointfree'"],["f211c397","2018-03-23","fix(pointfree): fix readme/docs"],["51a6e500","2018-03-23","docs: update dep graph"],["0e4858c9","2018-03-23","Publish"],["15ffd34d","2018-03-23","test(pointfree): add tests"],["6cac0c7d","2018-03-23","feat(pointfree): support data vals in program, add collect(), update readme"],["f75486d4","2018-03-23","feat(pointfree): add unwrap, quatations, math/bitops, array/obj access"],["884a8bfa","2018-03-23","docs: update main readme/depgraph"],["e635dafd","2018-03-23","Merge branch 'feature/pointfree' into develop"],["4d4e5e1b","2018-03-23","v0.1.0"],["6aef8807","2018-03-23","build(pointfree): update package info"],["58f5716c","2018-03-23","feat(pointfree): add dropIf, neg, nop, update cond,condM, add docs/readme"],["25bbf05c","2018-03-22","feat(pointfree): initial import of refactored @thi.ng/pointfree package"],["92e4ff8f","2018-03-21","docs: update main readme"],["b153067c","2018-03-21","docs: update dep graph"],["fb42cb5a","2018-03-21","Publish"],["218c2304","2018-03-21","Merge branch 'feature/iwatch' into develop"],["ca099e57","2018-03-21","refactor(transducers): update error handling"],["8a3e72ee","2018-03-21","feat(rstream-log): update error handling, add @thi.ng/api dep"],["1ce7054f","2018-03-21","feat(rstream): update error handling, add @thi.ng/api dep"],["adc559ae","2018-03-21","refactor(router): update error handling"],["9316a6ca","2018-03-21","feat(iterators): update error handling, add @thi.ng/api dep"],["501d56f8","2018-03-21","feat(interceptors): update error handling, add @thi.ng/api dep"],["0cfc2270","2018-03-21","refactor(hiccup-css): update error handling"],["a3238abf","2018-03-21","feat(hiccup): update error handling, add @thi.ng/api dep"],["f5173f1d","2018-03-21","feat(hdom): update error handling, add @thi.ng/api dep"],["a046b285","2018-03-21","refactor(dcons): update error handling"],["5087ffe3","2018-03-21","refactor(cso): update error handling"],["0fc10388","2018-03-21","feat(bitstream): update error handling, add @thi.ng/atom dep"],["ea7b1752","2018-03-21","refactor(atom): update error handling"],["4d3785f9","2018-03-21","feat(api): add error types & ctor fns"],["d93940a4","2018-03-21","feat(atom): consider parent validators in History update fns"],["3b1d563a","2018-03-21","feat(atom): add CursorOpts and cursor validation, update ctor, add tests"],["bae1647c","2018-03-21","feat(atom): add optional validation predicate for Atom, add tests"],["47643f96","2018-03-21","test(api): add INotify tests"],["b3287808","2018-03-21","refactor(router): update INotify dummy impl"],["fbb19acd","2018-03-21","refactor(api): update mixins, IEnable / INotify return types"],["0d67e73e","2018-03-21","build: limit travis build branches"],["96bb0198","2018-03-21","docs: update dep graph"],["b2778585","2018-03-21","Publish"],["2a1264a2","2018-03-21","refactor(rstream-log): update Logger ctor arg handling"],["e58c5e01","2018-03-21","Merge branch 'feature/rstream-refactor' into develop"],["deb59a15","2018-03-21","docs(rstream): update readme, add dataflow example"],["276ede6a","2018-03-20","docs(rstream): update readme"],["907d5995","2018-03-20","feat(rstream): add IDeref impl for Subscription"],["1fee7d5c","2018-03-20","feat(rstream): add merge()/sync() ctor wrappers"],["eec56dec","2018-03-20","feat(rstream): add transduce(), update re-exports"],["42b343aa","2018-03-20","test(rstream): add StreamSync & Subscription tests"],["26f15b23","2018-03-20","refactor(rstream): simplify unsubscribe() logic"],["a1c58418","2018-03-20","docs(rstream): add Cache deprecation docstring"],["6b87bca4","2018-03-20","feat(rstream): Subscription stores last value and passes to new subs"],["ebe222c9","2018-03-20","refactor(rstream): update & StreamMerge/SyncOpts, minor fixes StreamSync"],["80264093","2018-03-20","feat(rstream): fix #6 update StreamMerge to support transduced input streams"],["db61b0bd","2018-03-20","test(rstream): add/update sidechain* tests"],["d18a1158","2018-03-20","feat(rstream): update Sidechain*.next(), add unsubscribe()"],["7dce160c","2018-03-20","minor(rstream): fromPromise()"],["41bb385f","2018-03-20","feat(rstream): add fromView(), update fromAtom() docs, update re-exports"],["01a751e2","2018-03-20","feat(rstream): update Subscription.unsubscribe()"],["2ad2f485","2018-03-20","fix(rstream): bisect() add downstream impl checks, add tests"],["6f5ec040","2018-03-20","test(rstream): remove obsolete fromPromise error test case"],["47b6a924","2018-03-20","refactor(rstream): simplify Subscription, update all impls"],["64c16255","2018-03-19","Merge branch 'develop' into feature/rstream-refactor"],["5bf5ce61","2018-03-19","docs: update dep graph"],["1c5d96f7","2018-03-19","Publish"],["ff802a45","2018-03-19","refactor(rstream): simplify StreamMerge source handling"],["f7029efd","2018-03-19","refactor(rstream): minor cleanup/perf StreamSync"],["791a993f","2018-03-19","feat(rstream): add StreamSync"],["c7364334","2018-03-19","refactor(rstream): add/update Stream ctor arities"],["abc195a4","2018-03-19","feat(transducers): add mapVals() xform"],["3bc8d54a","2018-03-19","refactor(transducers): update labeled(), mapIndexed(), partition()"],["bebd1186","2018-03-19","feat(transducers): add partitionSync() xform"],["627dd7a4","2018-03-19","docs: update dep graph"],["b316114f","2018-03-19","Publish"],["76c5e0a4","2018-03-19","fix(interceptors): InterceptorPredicate args"],["dbb046e8","2018-03-18","docs: update dep graph"],["a69b5141","2018-03-18","Publish"],["c0ec2745","2018-03-18","feat(atom): add optional support for eager views, update tests/readme"],["f295a475","2018-03-18","build(examples): update all @thi.ng deps to use \"latest\""],["4e91374b","2018-03-18","docs: update dep graph"],["6b92bf67","2018-03-18","Publish"],["eaeccf47","2018-03-18","fix(paths): fix setter fast paths"],["e022cdf0","2018-03-18","docs: update dep graph"],["8cee5b5f","2018-03-18","Publish"],["92f0e27e","2018-03-18","fix(paths): fix setIn fast paths for path length 3/4"],["2376e02f","2018-03-18","build: fix changelogs for atom/interceptors/paths"],["4c0212fb","2018-03-18","docs(resolve-map): fix link in readme"],["b6a8da58","2018-03-18","build(examples): update deps & imports for all examples"],["2c1a85bc","2018-03-17","docs: update dep graph"],["c3cac0c0","2018-03-17","Publish"],["1e7ef2b6","2018-03-17","build: fix atom deps in downstream packages"],["8281609c","2018-03-17","minor(atom): fix typo in package"],["a41a208e","2018-03-17","v1.0.0"],["9a1cc521","2018-03-17","docs: update dep graph"],["c0c3e64c","2018-03-17","v1.0.0"],["0d13982c","2018-03-17","v0.1.0"],["95f6b392","2018-03-17","Merge branch 'feature/lazymap' into develop"],["d34bd146","2018-03-17","build: update make-module script (deps)"],["e1cf4aba","2018-03-17","docs(interceptors): update readme"],["9a651cd9","2018-03-17","docs(atom): update readme"],["1273efbd","2018-03-17","refactor(atom): extract @thi.ng/paths & @thi.ng/interceptors functionality"],["763ea89f","2018-03-17","docs: update package list in main readme"],["195a6ffd","2018-03-17","feat(interceptors): add/extract @thi.ng/interceptors package from @thi.ng/atom"],["422c2c4e","2018-03-17","feat(resolve-map): add @thi.ng/resolve-map package"],["f9f6eb1e","2018-03-17","feat(paths): add/extract @thi.ng/paths from @thi.ng/atom"],["d3d66436","2018-03-16","refactor(examples): update router-basics"],["f1bc74d2","2018-03-16","docs: update readme files (add create-hdom-app instructions)"],["8596cd07","2018-03-16","docs: update dep graph"],["6383233e","2018-03-16","Publish"],["357c46e0","2018-03-16","feat(atom): add forwardSideFx() interceptor"],["e52e7e51","2018-03-16","feat(atom): add FX_FETCH & FX_DELAY sidefx impl, update docs"],["6378eb0b","2018-03-15","fix(examples): re-add html"],["633093ea","2018-03-15","refactor(examples): update router-basics (create-hdom-app tpl)"],["6deb4e33","2018-03-14","build(examples): update hdom deps"],["c0432cb4","2018-03-14","docs: update dep graph"],["fff77886","2018-03-14","Publish"],["3a0e97d2","2018-03-14","test(hdom): add tests, update package"],["25d0c309","2018-03-14","test(hiccup): add deref tests"],["14356895","2018-03-14","Merge branch 'feature/hdom-deref' into develop"],["c85b1f81","2018-03-14","refactor(examples): remove obsolete .deref() calls"],["93343d63","2018-03-14","feat(hiccup): support fn values in style objects"],["28b0b578","2018-03-14","refactor(hdom): disable deref() for attrib objects"],["de839e89","2018-03-14","refactor(hiccup): disable deref() for attrib objects"],["0fe6c44c","2018-03-14","feat(hdom): add auto deref() support"],["0d2c16fc","2018-03-14","feat(hiccup): add auto deref() support"],["2351240d","2018-03-14","minor(examples): typo"],["c5cee483","2018-03-12","minor(examples): readme"],["15acdb5c","2018-03-12","minor(examples): typos"],["ee118999","2018-03-12","docs(examples): update readme"],["8eb0a610","2018-03-12","docs(examples): add README for example dir"],["fc61aae6","2018-03-12","minor(examples): add filesize info"],["777b1b05","2018-03-11","refactor(examples): more stateless components, add docs"],["49008ccf","2018-03-11","docs(examples): update readme"],["eb73ae93","2018-03-11","refactor(examples): update router demo"],["5b412e7d","2018-03-11","docs: update dep graph"],["a9b09f16","2018-03-11","Publish"],["10ea19f5","2018-03-11","docs(atom): update readme & doc strings"],["0ca0bf3e","2018-03-11","fix(atom): ignore side fx with null values"],["5e8cbc98","2018-03-11","docs: update dep graph"],["e62dace5","2018-03-11","Publish"],["bd8c8b1e","2018-03-11","Merge branch 'feature/router' into develop"],["eac0e96f","2018-03-11","docs(router): update readme & package"],["71b19a43","2018-03-10","feat(examples): major update router example app"],["d8b8d978","2018-03-10","docs: add router package links to main readme"],["51b02e2b","2018-03-10","feat(examples): add router-basics demo"],["07b4e060","2018-03-10","feat(router): re-import router package (MBP2010), minor refactor & fixes"],["019943e2","2018-03-09","docs: update dep graph"],["95d6a4e2","2018-03-09","Publish"],["c7e69def","2018-03-09","refactor(examples): minor updates"],["3fae2496","2018-03-09","feat(atom): add/extract StatelessEventBus"],["667691ce","2018-03-09","feat(atom): update EventBus ctor, add deref()"],["59085e0c","2018-03-09","fix(atom): add interceptors to re-exports"],["9b3d91e5","2018-03-09","feat(atom): add IRelease impls"],["3bf9fbaa","2018-03-09","docs(atom): update all doc strings"],["e96cc991","2018-03-09","refactor(atom): minor update event bus, add/update docs"],["15ae0643","2018-03-09","docs: update dep graph"],["a26e25cf","2018-03-09","Publish"],["a48b7762","2018-03-08","refactor(examples): update async-effect"],["4d7613d8","2018-03-08","refactor(examples): update interceptor-basics"],["fb9b19c4","2018-03-08","docs(atom): minor update View docs"],["359c4f5a","2018-03-08","feat(atom): add valueSetter/Updater() interceptors"],["443875c8","2018-03-08","refactor(atom): update InterceptorFn handling"],["1fd43d7c","2018-03-08","feat(atom): add default handlers, add/rename event/fx const values, add checks"],["c5d5ed56","2018-03-08","build(examples): update all deps"],["89a0b20d","2018-03-08","docs: update dep graph"],["f018fb12","2018-03-08","Publish"],["cb9c808e","2018-03-08","Merge branch 'feature/atom-async-dispatch' into develop"],["a6beda9d","2018-03-08","refactor(examples): update async & interceptor demos"],["3303c3b4","2018-03-08","docs(atom): update readme"],["56866e07","2018-03-08","feat(atom): add async dispatch effect, update event bus & api types"],["9900e991","2018-03-08","feat(checks): add isPromise() & isPromiseLike()"],["fb4f3095","2018-03-08","docs: update dep graph"],["99a87e6a","2018-03-08","Publish"],["52fff093","2018-03-08","docs(examples): update async readme & html"],["c9794acb","2018-03-07","feat(examples): add async fx example"],["9e5239bc","2018-03-07","fix(atom): add EventBus to module re-exports, minor cleanup"],["5b21c147","2018-03-07","build(examples): update interceptor deps"],["7dcfce05","2018-03-07","refactor(examples): update interceptor example"],["85e04957","2018-03-07","docs: update dep graph"],["851efd23","2018-03-07","Publish"],["1adb703a","2018-03-07","refactor(examples): update interceptor example"],["1ab803aa","2018-03-07","refactor(atom): update InterceptorFn, ensureXXX(), update deps, add docs"],["eec7bc4c","2018-03-07","docs: update dep graph"],["b877a069","2018-03-07","Publish"],["fb74b8a7","2018-03-07","Merge branch 'feature/iceps' into develop"],["4958606b","2018-03-07","feat(examples): add interceptors example"],["a0d662bb","2018-03-07","build(atom): add @thi.ng/dcons dep"],["e01bf733","2018-03-07","feat(atom): re-add refactored EventBus & interceptor handling"],["be46af3f","2018-03-06","feat(examples): add svg viz to devcards demo"],["79245a35","2018-03-05","minor(examples): typos"],["f40143be","2018-03-05","fix(examples): add/update devcard links"],["8019df82","2018-03-05","build(examples): add missing html/webpack files, update deps"],["9becd43d","2018-03-05","Merge branch 'master' of github.com:thi-ng/umbrella"],["58e75591","2018-03-05","docs: update dep graph"],["f38885de","2018-03-05","Publish"],["df4e98fb","2018-03-05","Merge branch 'feature/ex-mstates' into develop"],["1041d90c","2018-03-05","feat(examples): add devcards example"],["a200beb8","2018-03-05","feat(hdom): add support for frame skipping, add docs"],["a7e61a4e","2018-03-05","feat(atom): update IAtom, add resetIn() & swapIn() impls"],["17a11710","2018-03-05","Merge branch 'feature/hcss-refactor' into develop"],["22bc29c9","2018-03-05","docs(hiccup-css): add doc strings for attrib fns"],["721583a7","2018-03-05","refactor(hiccup-css): internal restructure"],["34d699fc","2018-03-05","chore: update issue tpl instructions"],["dd09f0bf","2018-03-05","docs: update dep graph"],["203a3a6e","2018-03-05","Publish"],["2e3942ac","2018-03-05","docs(hiccup-css): add doc strings, update readme"],["105bbf4e","2018-03-05","perf(hiccup-css): no empty Set() creation, change type check order in css()"],["870da99d","2018-03-05","docs: update readme"],["0c23d2b6","2018-03-05","docs: update dep graph"],["1e08ce24","2018-03-05","v0.1.0"],["69036ad1","2018-03-05","minor(hiccup-css): update package desc"],["5d946cb0","2018-03-05","Merge branch 'develop'"],["d6f8b066","2018-03-05","Merge branch 'feature/hiccup-css' into develop"],["8a665313","2018-03-05","build(hiccup-dom): update ignore files"],["bafb533e","2018-03-05","docs(hiccup-css): update readme"],["24983d37","2018-03-05","test(hiccup-css): update tests"],["0f416efe","2018-03-05","feat(hiccup-css): add comment() indentation support"],["f3190fff","2018-03-05","fix(hiccup-css): fn & auto-prefix handling"],["787d0aba","2018-03-05","feat(hiccup-css): add more unit types, update px/ms"],["02bff871","2018-03-05","feat(hiccup-css): add support for iterators as arg type to css()"],["cbb9b7f0","2018-03-04","test(hiccup-css): add/update tests"],["a6231172","2018-03-04","refactor(hiccup-css): format @keyframe stops, rename perc() => percent()"],["e347c292","2018-03-04","fix(hiccup-css): @import query separator"],["57533c76","2018-03-04","feat(hiccup-css): update conditional handling, add formatCond()"],["428de3c7","2018-03-04","feat(hiccup-css): update fn handling, add iterator support, units, comment"],["bdc63496","2018-03-04","minor: fix typos"],["c20f2df6","2018-03-04","Create CONTRIBUTING.md"],["6de6b279","2018-03-03","perf(hiccup-dom): minor optimizations"],["ebbc4910","2018-03-03","feat(hiccup-css): add attrib fn, at-rules, quoted fns, decl value arrays"],["e687230c","2018-03-03","feat(hiccup-css): add default vendor prefixes"],["a53d2a5f","2018-03-03","feat(hiccup-css): add keyframes(), split module into separate src files"],["d837199d","2018-03-03","feat(hiccup-css): add CSSOpts, mediaQuery(), fn expansion"],["5247b8f4","2018-03-03","feat(hiccup-css): add/fix class handling, update Format"],["3a4cf1e6","2018-03-03","feat(hiccup-css): add package @thi.ng/hiccup-css"],["92fb7b07","2018-03-03","chore(examples): update links in html files"],["b6d350b3","2018-03-03","docs: update dep graph"],["6c628213","2018-03-03","docs(hdom): fix diagram link"],["db98e5e5","2018-03-03","chore: update make-example"],["2f5f0b2e","2018-03-03","build(examples): update all example deps"],["45291b3d","2018-03-03","Publish"],["9099607d","2018-03-03","docs: update readme's"],["752a78bb","2018-03-03","feat(hdom-components): rename package hiccup-dom-component => hdom-components"],["79e1b097","2018-03-03","docs(hdom): update readme"],["f1c53150","2018-03-03","refactor(hdom): rename package hiccup-dom => hdom"],["ae47c4db","2018-03-03","docs: update dep graph"],["e405ebdf","2018-03-03","Publish"],["8c180bc6","2018-03-03","refactor(transducers): extract compR() into its own file, update refs, update readme"],["2f5abce3","2018-03-02","refactor(transducers): update swizzler() arg types"],["488462e1","2018-03-02","refactor(transducers): update permutations()/permutationsN(), add tests"],["91938ede","2018-03-02","feat(transducers): add permutations()/permutationsN() generators"],["aa042602","2018-03-02","docs: update dep graph"],["3d8a6d3c","2018-03-02","Publish"],["2316d4d1","2018-03-02","test(transducers): add flatten() tests"],["3d8aa324","2018-03-02","fix(transducers): flattenWith()"],["befaceb0","2018-03-01","docs(atom): update readme example"],["3dcc3cb8","2018-03-01","docs(atom): update example"],["dd665920","2018-03-01","feat(examples): add login-form demo to illustrate state handling"],["118cf92f","2018-03-01","docs: update dep graph"],["1f61f49d","2018-03-01","Publish"],["ae7c7f5d","2018-03-01","docs(atom): update readme, add View examples"],["3e55a058","2018-03-01","fix(atom): re-export api.ts"],["341255c9","2018-03-01","refactor(atom): include `path` in IView"],["0206f339","2018-03-01","docs: update dep graph"],["5308cab5","2018-03-01","Publish"],["a0ce6e76","2018-03-01","refactor(atom): update Path type references"],["9ad83b27","2018-03-01","feat(atom): add IView, IViewable, impl for Atom, Cursor, History"],["1fa829d6","2018-03-01","test(atom): add/update tests"],["8c0c621c","2018-03-01","feat(atom): add View type to create derrived views/value subscriptions"],["55c6a7d5","2018-03-01","perf(atom): add optimized setter() for path len < 5, fix toPath()"],["ed23376d","2018-03-01","perf(atom): add optimized getters for path len < 5"],["ff21d9f4","2018-02-28","docs: update dep graph"],["6779def4","2018-02-28","Publish"],["a86b6775","2018-02-28","docs(hiccup-dom): fix readme link"],["ca17389c","2018-02-28","feat(hiccup-dom): add support for function attribs, add docs"],["050a5656","2018-02-28","docs(hiccup-dom): update initial readme example"],["c7e2f816","2018-02-27","Merge branch 'master' of github.com:thi-ng/umbrella"],["eafc5dd6","2018-02-27","build(examples): update deps"],["4a8feffc","2018-02-27","docs(hiccup-dom): fix #7, update readme"],["61e87665","2018-02-27","docs(hiccup-dom): update readme"],["9593fd13","2018-02-27","docs: update dep graph"],["b8a6e1af","2018-02-27","Publish"],["70720a37","2018-02-27","refactor(examples): minor updates"],["8a070ff2","2018-02-27","feat(hiccup-dom): start(), add optional spans arg"],["9b2c1606","2018-02-27","minor(hiccup-dom): update arg types"],["f5b66753","2018-02-27","feat(hiccup-dom): fix #11, update normalizeTree/normalizeElement"],["6e0dfa1d","2018-02-27","feat(diff): update diffArray, generic types"],["621868b4","2018-02-26","docs: update dep graph"],["9ff8c0af","2018-02-26","Publish"],["45d63858","2018-02-26","refactor(hiccup): sort void tags"],["9824844a","2018-02-26","feat(transducers): add keys()/vals() iterators, refactor pairs()"],["061c9088","2018-02-26","Merge pull request #12 from jarvismartin/minor-fix"],["f6143eb7","2018-02-25","Merge branch 'master' of github.com:thi-ng/umbrella into minor-fix"],["c34271f7","2018-02-24","docs: update dep graph"],["1b16d920","2018-02-24","Publish"],["44f33dfc","2018-02-24","feat(hiccup): add support for more SVG tags (66 total)"],["214fe4d0","2018-02-23","feat(hiccup-dom-components): add gradient, group, path SVG funcs"],["8180e149","2018-02-23","spelling fix"],["68d9f838","2018-02-23","Merge branch 'master' of github.com:thi-ng/umbrella"],["ca68a978","2018-02-23","minor grammar fix"],["b3891d52","2018-02-23","refactor(examples): simplify json-components"],["1834f812","2018-02-23","docs: update dep graph"],["8a620583","2018-02-23","Publish"],["2a11ff6f","2018-02-23","refactor(transducers): add TransformSubSpec, fix test, minor update docs"],["223669b1","2018-02-23","test(transducers): add tests"],["f0fdfa10","2018-02-23","feat(transducers): add deepTransform & mapDeep xform"],["65f794f6","2018-02-19","build: add .gitignore gen for make-example script"],["f7c6e0c9","2018-02-19","Merge pull request #10 from jarvismartin/example-gitignores"],["955eecc4","2018-02-19","add .gitignore files to examples"],["e1f87d6b","2018-02-19","fix(examples): update packages & readme's (fix #9), deps in make-example"],["c2123e58","2018-02-19","Merge pull request #9 from jarvismartin/examples-work-on-debian"],["31a4710a","2018-02-19","build(examples): update CA deps (transducers)"],["9b664d25","2018-02-19","refactor(examples): simplify CA transducers, update rule format/handling"],["2c2030d2","2018-02-19","docs: update dep graph"],["afa74728","2018-02-19","Publish"],["193058d5","2018-02-19","feat(transducers): add lookup1d/2d/3d helpers, update re-exports"],["813b2cac","2018-02-19","make examples work on Debian systems"],["77c95322","2018-02-19","refactor(examples): update webgl demo"],["73dd1dc5","2018-02-19","docs: update dep graph"],["9c8e877a","2018-02-19","build(examples): update CA deps"],["7f8c6cd0","2018-02-19","Publish"],["3627087b","2018-02-19","docs: add hiccup-dom-components to main readme"],["ac831234","2018-02-19","build(hiccup-dom-components): add missing deps"],["9fe096a3","2018-02-19","build: update yarn.lock"],["2394396e","2018-02-19","feat(examples): add CA presets, refactor rule handling"],["511c4980","2018-02-19","feat(hiccup-dom-components): initial import"],["df93af6d","2018-02-18","feat(examples): add randomize buttons (CA)"],["fde83d59","2018-02-18","build(examples): update example deps"],["b8c03743","2018-02-18","docs: update dep graph"],["06830ce6","2018-02-18","Publish"],["69b3c6a4","2018-02-18","docs: update readme files"],["074f94ff","2018-02-18","build: update deps"],["5a728cb9","2018-02-18","refactor(rstream-log): update Logger ctor due to changes in StreamMerge"],["4942e2ea","2018-02-18","feat(rstream): fix #8, support infinite StreamMerge's, update ctor"],["ca1caae5","2018-02-18","refactor(rstream): don't throw in unsubscribe() if no parent"],["5c106cfa","2018-02-18","docs(examples): add more CA config links"],["d6d3310d","2018-02-18","feat(examples): add cellular automata example"],["d023bd5f","2018-02-18","chore(transducers): update re-exports, readme"],["ab8a8558","2018-02-18","feat(transducers): add convolve2d xform & types"],["d7b1d0df","2018-02-18","feat(transducers): add movingMedian() xform"],["48f8bb85","2018-02-18","fix(transducers): update imports `step()`"],["63a49530","2018-02-18","refactor(transducers): add/update range2d/range3d arity handling"],["e71a4c90","2018-02-17","docs(atom): update readme"],["2e34f389","2018-02-17","refactor(atom): update history reset/swap, record before applying val"],["b593a9b9","2018-02-17","feat(atom): add deleteIn()"],["fbc819ed","2018-02-17","fix(atom): empty path handling getter/setter"],["7d50c1ca","2018-02-17","refactor(examples): simplify todo atom handling"],["b5ee8e45","2018-02-17","refactor(atom): use @thi.ng/api/equiv as default History predicate"],["398c32af","2018-02-17","refactor(atom): don't mutate getter/setter path args, update updateIn"],["6f6e7e5b","2018-02-17","feat(atom): add getIn/setIn/updateIn"],["d38f47e0","2018-02-16","test(transducers): add range2d tests"],["722042b1","2018-02-16","feat(transducers): add range2d / range3d generators"],["47d5df09","2018-02-15","chore: update issue tpl"],["c9ec713f","2018-02-15","Create issue_template.md"],["4d1de860","2018-02-08","docs: update dep graph"],["3fc88b25","2018-02-08","Publish"],["445c8575","2018-02-08","refactor(transducers): re-use even/odd from @thi.ng/checks"],["68f8fc23","2018-02-08","feat(checks): add new predicates, refactor existing"],["080c2ee5","2018-02-07","fix(csp): fix #5, more example fixes (rfn calls)"],["a10a487c","2018-02-07","fix(csp): fix #5, example in readme"],["972a23e1","2018-02-05","style: update const/let assignments"],["623bc492","2018-02-05","refactor(examples): update webgl demo"],["5281d9a8","2018-02-05","feat(examples): add webgl example"],["eb12a165","2018-02-04","build: update upload-docs script"],["3ee6755f","2018-02-04","fix(examples): minor fixes index.html"],["855d8039","2018-02-04","feat(transducers): add page() xform, update readme"],["596ed7a2","2018-02-04","docs: update dep graph"],["17e447f6","2018-02-04","Publish"],["1f4f4b8c","2018-02-04","fix(hiccup-dom): support parent DOM ID as arg start()"],["d8fea714","2018-02-03","docs: update dep graph"],["3daf7962","2018-02-03","Publish"],["4edf45fc","2018-02-03","fix(hiccup-dom): fix #3, update start() to be cancellable, add docs"],["ae34f077","2018-02-03","docs(hiccup-dom): fix readme link"],["b6d95fbe","2018-02-03","feat(examples): add json demo theme support, update docs"],["83cd1a21","2018-02-03","refactor(examples): minor update json-components"],["edfaa6bd","2018-02-03","build(examples): update deps"],["07da7cca","2018-02-03","docs: update dep graph"],["c3b54f98","2018-02-03","Publish"],["b524145b","2018-02-03","feat(examples): add reactive json editor component"],["10c119b2","2018-02-03","refactor(hiccup-dom): minor update ILifeCycle"],["944cbb3b","2018-02-03","fix(hiccup-dom): add NO_SPANS config"],["d8fa4cae","2018-02-03","fix(examples): update index.html"],["d5460b70","2018-02-03","docs(hiccup-dom): update readme"],["5d8478e1","2018-02-03","fix(examples): add missing files"],["3156e888","2018-02-03","fix(examples): update deps"],["2e4e51c5","2018-02-03","feat(examples): add json component demo"],["f30579ce","2018-02-03","Merge branch 'master' of github.com:thi-ng/umbrella"],["adb04f07","2018-02-03","merge with #2"],["c09bb89d","2018-02-03","docs(hiccup-dom): add svg example links"],["aa48d3be","2018-02-03","feat(examples): add svg particles demo"],["1b007e69","2018-02-03","Merge pull request #2 from forresto/patch-1"],["7ae6af3b","2018-02-02","Is c 3 here?"],["96004efe","2018-02-03","docs(atom): fix readme example"],["8ebc6242","2018-02-03","docs(atom): update readme"],["ad62c56f","2018-02-03","build(examples): update deps"],["5aed12b6","2018-02-03","docs: update dep graph"],["99a943ac","2018-02-03","Publish"],["8106d16f","2018-02-02","build: update main package build commands, update make-example script, readme"],["309c7d7c","2018-02-02","build(examples): update example build commands"],["29267799","2018-02-02","refactor(examples): update event attribs"],["7cc5c93a","2018-02-02","refactor(hiccup-dom): update event attrib naming convention, update readme"],["7ae706eb","2018-02-02","feat(hiccup): skip fn exec for event attribs, update tests, readme"],["ab7154a8","2018-02-02","docs(hiccup-dom): update readme"],["38699b96","2018-02-02","docs(hiccup-dom): add diagram"],["62af1537","2018-02-02","docs: update dep graph"],["ec0132c6","2018-02-02","Publish"],["d134d5b7","2018-02-02","refactor(hiccup-dom): add interfaces (still unused)"],["324d2fa2","2018-02-02","docs(examples): add benchmark docs"],["448e8396","2018-02-02","perf(diff): add fail fasts"],["98485760","2018-02-02","refactor(checks): isPlainObject()"],["110a9deb","2018-02-02","fix(api): update compare() & equiv()"],["0f57ff90","2018-02-02","docs(atom): update readme, add history example"],["10d9ecbf","2018-02-02","docs(hiccup-dom): fix example link"],["17b43036","2018-02-02","docs(hiccup-dom): update readme"],["d573bc53","2018-02-02","docs: update hiccup* readme files"],["7cfca0d8","2018-02-02","docs: update main readme"],["e4f8fe16","2018-02-02","docs(hiccup-dom): update readme"],["c2fed170","2018-02-02","feat(examples): add hdom-basics example"],["5e6eb832","2018-02-02","chore: add make-example script"],["e69774df","2018-02-02","fix(examples): benchmark"],["e939586a","2018-02-02","feat(examples): add hdom benchmark"],["0a41be9e","2018-02-01","docs: fix readme"],["afb869b0","2018-02-01","docs: add/update readme files"],["d52630c6","2018-02-01","docs: update dep graph"],["10a4f910","2018-02-01","Publish"],["12590847","2018-02-01","docs: update dep graph"],["24ea4ca9","2018-02-01","docs: update readme files"],["25c9f785","2018-02-01","feat(atom,hiccup-dom): add example projects (todo list & dashboard)"],["1f6bb589","2018-02-01","fix(hiccup-dom): boolean attribs"],["8218814f","2018-02-01","fix(atom): truncate redo stack in record(), swap() return type"],["c5b6e0fa","2018-02-01","feat(atom): add History.canUndo/Redo()"],["36cc9561","2018-02-01","fix(atom): cursor swap() return type"],["094e4869","2018-02-01","docs(hiccup-dom): fix links in readme"],["d373cab1","2018-02-01","docs: update main readme"],["00ad5d84","2018-02-01","docs: update dep graph"],["794b1fd5","2018-02-01","Publish"],["326d3c31","2018-02-01","build: update .npmignore"],["3101698d","2018-02-01","feat(hiccup-dom): add start(), update readme"],["beebe435","2018-02-01","chore: update keywords for all packages"],["5d7c10a3","2018-02-01","test(rstream): fix tests (TS 2.7.*)"],["4cc4bbc0","2018-02-01","build: cleanup/update deps"],["30ffd009","2018-02-01","feat(hiccup-dom): re-import package (MBP2010)"],["4d0d437b","2018-02-01","feat(diff): re-import diff package (MBP2010)"],["0439d24b","2018-02-01","refactor(hiccup): update/add deps, restructure/split into sub-modules"],["febe39f1","2018-02-01","fix(transducers): update comp() for typescript 2.7.*"],["a580f722","2018-02-01","build: update deps (typescript & typedoc)"],["ea638bef","2018-02-01","feat(rstream): add Cache subscription class"],["1354e298","2018-02-01","fix(api): fix equiv string handling, update tests"],["878520e6","2018-02-01","feat(api): update equiv() null handling, add tests"],["03c1d97a","2018-01-31","docs: update dep graph"],["5a3c0cce","2018-01-31","Publish"],["59d2a8a1","2018-01-31","docs(rstream): add undo/redo example to readme"],["54cd5261","2018-01-31","fix(rstream): subscription unhandled error handling"],["4c703cd4","2018-01-31","docs: update dep graph"],["92a923cf","2018-01-31","Publish"],["365e0d2b","2018-01-31","build: update main package commands"],["d58cf70d","2018-01-31","feat(rstream): add changed predicate for fromAtom(), add tests"],["dd155dfd","2018-01-31","docs(atom): add docs for getter/setter"],["55383621","2018-01-31","feat(atom): add full IAtom impl for History, update tests"],["4753afb8","2018-01-31","refactor(transducers): use Predicate2"],["79989e52","2018-01-31","refactor(dcons): use Predicate"],["42bbb864","2018-01-31","refactor(iterators): use Predicate/Predicate2"],["fbf8453c","2018-01-31","feat(api): add Predicate2 & StatefulPredicate2 types"],["b180917c","2018-01-31","docs: update dep graph"],["2746e8b3","2018-01-31","Publish"],["911ff183","2018-01-31","test(atom): add/update tests"],["e1b57dea","2018-01-31","feat(atom): add IReset/ISwap impls for History"],["282d9896","2018-01-31","fix(atom): cursor ctor arg checks"],["74ecdf18","2018-01-31","refactor(atom): extract IReset, ISwap from IAtom"],["035c51a3","2018-01-31","feat(atom): add History, add/update tests"],["2c88537e","2018-01-30","fix: links in readme"],["bbbc869c","2018-01-30","deploy: add upload-docs script"],["dee5f53c","2018-01-30","docs: update readme"],["da037723","2018-01-30","docs: update dep graph"],["95c728e0","2018-01-30","Publish"],["7f345bcc","2018-01-30","chore: update make-module"],["22b02a2d","2018-01-29","build: add main package commands, update readme"],["768f2ea7","2018-01-29","chore: update ignore files"],["0b5ca037","2018-01-29","build: add nyc coverage dev deps & commands"],["dc0958b7","2018-01-29","chore: update ignore files"],["c863018c","2018-01-29","test(iterator): add/update tests"],["f6530225","2018-01-29","docs: update dep graph"],["a508b05e","2018-01-29","Publish"],["4c242c93","2018-01-29","test(rstream): remove sidechainPartition interval test due to unpredictable timing"],["382aa05e","2018-01-29","fix(rstream): fatal recursion w/ error handling"],["1a0004f7","2018-01-29","test(rstream): increase timeout for travis"],["7bdc5617","2018-01-29","docs(iterators): update readme"],["651d07c0","2018-01-29","refactor(iterators): remove default exports"],["1e9dc852","2018-01-29","docs: add links for badges"],["925645ae","2018-01-29","docs: add travis badge"],["2d42787c","2018-01-29","build: update travis.yml"],["dfbd7efe","2018-01-29","docs(transducers): update padLast docs"],["e6477679","2018-01-29","test: add travis.yml, update main package / readme"],["9c2db625","2018-01-29","chore: update make-module script"],["6a125e83","2018-01-29","test: add test stubs, fix existing"],["b952a357","2018-01-29","build: update/fix all tsconfig files"],["85b280bf","2018-01-29","build: update commands in all packages"],["94333dfd","2018-01-29","test(atom): add/update tests"],["17d5c999","2018-01-29","docs: update dep graph"],["83b6e1a1","2018-01-29","Publish"],["5dce8a2f","2018-01-29","feat(atom): add nested path getter / setter compilers"],["1ae5f635","2018-01-29","docs: update dep graph"],["1ef8b45d","2018-01-29","Publish"],["b526376c","2018-01-29","docs: update readme"],["71c40ad0","2018-01-29","docs: update readme"],["ccd8e820","2018-01-29","test(rstream): update tests (fromPromise())"],["822b297f","2018-01-29","fix(rstream): fix #1 update fromPromise(), add test"],["33b3e16c","2018-01-29","chore: update package cmds & make-module script"],["1abd3cd1","2018-01-29","chore: add license files"],["0abfc62d","2018-01-29","docs(all) update dep graph"],["435c771f","2018-01-29","Publish"],["cca801b7","2018-01-29","fix(atom): cursor IWatch impls (replace stubs)"],["318e62ba","2018-01-29","docs: update main readme"],["5ca9b983","2018-01-29","chore: update make-module script"],["e45f3bd7","2018-01-29","chore(all): update depgraph commit msg format"],["d774e324","2018-01-29","perf(transducers): avoid result object cloning in struct() xform"],["ac12051f","2018-01-29","update dep graph"],["28771016","2018-01-29","Publish"],["1bc6ee6f","2018-01-29","build(rstream-csp): minor fix package & readme"],["ca3994ad","2018-01-29","feat(rstream): add atom dep, add fromAtom() & docs"],["04c3d592","2018-01-29","feat(atom): add Cursor, update interfaces, types, readme"],["52c25a84","2018-01-28","build(all): add tslint workspace dev dependency"],["fefc2835","2018-01-28","feat(atom): re-import atom package from MBP2010, update main readme"],["bddd5ce7","2018-01-28","feat(api): update IWatch & mixin, boolean returns"],["55ba0e13","2018-01-28","feat(rstream): add fromPromises(), add docs"],["2247f72f","2018-01-28","feat(rstream): add trace() error handler"],["ababaa1c","2018-01-28","docs(all): update readme"],["68e38136","2018-01-28","update dep graph"],["a87badef","2018-01-28","Publish"],["f83bd18e","2018-01-28","docs(rstream-csp): fix readme example"],["a6e49b34","2018-01-28","build(all): fix depgraph command in main package"],["d376f872","2018-01-28","update dep graph"],["8b53d6e1","2018-01-28","Publish"],["079a052c","2018-01-28","docs(all): update main readme, add dep graph"],["03ad992a","2018-01-28","chore(all): update ignore files"],["eb49e575","2018-01-28","test(csp): update test examples"],["13f0bd12","2018-01-28","test(hiccup): refactor all tests"],["c677539f","2018-01-28","build(all): update lerna config, main package, add make-module script"],["fcd01ba6","2018-01-28","build(rstream-log): update deps"],["28eee5f3","2018-01-28","build(transducers): update deps"],["174aaba7","2018-01-28","docs(transducers): update readme & doc comments"],["c2211223","2018-01-28","docs(rstream): update readme & doc comments"],["e37f6a13","2018-01-28","feat(rstream-csp): add new package, remove CSP dep from rstream"],["c74353b1","2018-01-28","feat(api): add StatefulPredicate"],["7b21aa64","2018-01-27","feat(transducers): add noop() xform, update readme"],["44db970b","2018-01-27","fix(transducers): scan() complete handling"],["b7c62341","2018-01-27","docs(transducers): update readme, add docs"],["45d6bc66","2018-01-27","feat(transducers): update re-exports, extract throttleTime() into own file"],["8e5204d2","2018-01-27","fix(transducers): add \"complete\" step handling in scan()"],["e1a282cb","2018-01-27","feat(transducers): update throttle(), refactor take/dropNth"],["0b3c7860","2018-01-27","feat(transducers): add labeled() xform"],["931b67f7","2018-01-27","feat(transducers): add multiplexObj()"],["63344e45","2018-01-27","feat(transducers): add every(), some() rfns"],["e555ff55","2018-01-27","feat(transducers): update re-exports, minor update reductions()"],["4b8d037a","2018-01-27","feat(transducers): update frequencies() & groupByMap()"],["e268e356","2018-01-27","refactor(transducers): rename join() => str() rfn"],["beb2cee8","2018-01-27","feat(transducers): add multiplex() xform & docs"],["1f32fc0c","2018-01-27","feat(transducers): update step() to support multiple results"],["58f14775","2018-01-27","refactor(transducers): udate cat() to accept iterables, not just arrays"],["e50fa261","2018-01-27","feat(transducers): add utf8Encode()/utf8Decode() xforms"],["57ceecee","2018-01-26","Publish"],["76c67349","2018-01-26","fix(rstream-log): imports"],["eb31ec6a","2018-01-26","build(rstream): 0.5.1 publish"],["22f1b6af","2018-01-26","build(all): fix repo links in all packages"],["c776df18","2018-01-26","build(all): fix pub script aliases"],["32fc705a","2018-01-26","Publish"],["de4e8192","2018-01-26","refactor(rstream): allow extra props in ISubscriber"],["fdc08897","2018-01-26","test(rstream): update promise tests"],["4bb9f918","2018-01-26","fix(rstream): Resolver error/rejection handling"],["23e38f79","2018-01-26","fix(rstream): only handle done() in IDLE or ACTIVE states, else ignore"],["b4f87853","2018-01-26","test(rstream): add/update tests"],["3d2f8b91","2018-01-26","fix(rstream): fromPromise() error handling"],["a0647fed","2018-01-26","refactor(rstream): update/fix Subscription.error() handling"],["3172eb6d","2018-01-26","test(rstream): add transducer test"],["9cf95541","2018-01-26","refactor(rstream): change SidechainToggle ctor arg order, add tests"],["d36a9ff8","2018-01-26","feat(rstream): add fromIterableSync()"],["f1956922","2018-01-26","feat(rstream): Stream calls done() w/ last unsub"],["0039ef38","2018-01-26","test(rstream): add/update tests"],["ec985b33","2018-01-26","feat(rstream): make Stream source arg optional"],["d3cbda2a","2018-01-26","test(rstream): add/update tests"],["91e8cad5","2018-01-26","feat(rstream): update StreamMerge"],["887c29bb","2018-01-26","refactor(rstream): add Subscription.ensureState()"],["7d066773","2018-01-26","test(rstream): add tests for fromIterable()"],["8019422f","2018-01-26","feat(rstream): add DEBUG flag to toggle tracing"],["ad548627","2018-01-25","feat(rstream): allow partial ISubscriber's for subscribe()"],["55c3b041","2018-01-25","fix(rstream-log): update module re-exports"],["5c85ab9b","2018-01-25","fix(rstream): update fromPromise() cancellation"],["0f601d5c","2018-01-25","fix(rstream): Stream.cancel()"],["19f27b94","2018-01-25","refactor(rstream): update ISubscriber.error() impls"],["0acf4e22","2018-01-25","Publish"],["f6ca3f33","2018-01-25","feat(rstream): add sidechainToggle(), minor update sidechainPartition()"],["2557c3b3","2018-01-25","Publish"],["4048bec4","2018-01-25","feat(rstream-log): add support for body formatter (formatString()), add type aliases"],["bc26d097","2018-01-25","feat(rstream-log): add node check for writeFile()"],["8304c825","2018-01-25","feat(rstream-log): add ILogger"],["eef65b9e","2018-01-25","fix(rstream): don't throw resolve() error, only warning msg"],["4e5a2ee1","2018-01-25","feat(rstream): add fromRAF() fallback for node, add docs"],["592a2423","2018-01-25","fix(rstream): subscription generics if transducer is used"],["898be349","2018-01-25","Publish"],["007f361f","2018-01-25","docs(transducers): add/update docs"],["a2c3bc42","2018-01-25","refactor(transducers): update reverse(), add deps"],["0c116c1c","2018-01-25","refactor(transducers): simplify concat(), add docs"],["b3ce275b","2018-01-24","fix(transducers): include 1st val in benchmark()"],["75bb161c","2018-01-24","fix(transducers): base64 imports"],["e290d759","2018-01-24","fix(all): project links in readme files"],["dc145a55","2018-01-24","fix(main): readme"],["358d5abf","2018-01-24","Publish"],["00f9c12b","2018-01-24","update packages (npm publishConfig)"],["04ff6e9c","2018-01-24","feat(all): initial re-import as monorepo, update readme files, cleanup imports"]] \ No newline at end of file diff --git a/examples/hdom-vscroller/src/index.ts b/examples/hdom-vscroller/src/index.ts new file mode 100644 index 0000000000..57e238fe4d --- /dev/null +++ b/examples/hdom-vscroller/src/index.ts @@ -0,0 +1,114 @@ +import { start } from "@thi.ng/hdom"; +import { map, mapIndexed } from "@thi.ng/transducers"; +import _commits from "./commits.json"; +import _logo from "./logo-64.png"; +import _packages from "./packages.json"; +import { virtualScroller } from "./vscroller"; + +type Commit = [string, string, string]; +type Package = [string, string]; + +const LOGO = _logo; +const REPO_BASE = "https://github.com/thi-ng/umbrella/"; +const COMMITS: Commit[] = _commits; +const PACKAGES: Package[] = _packages; + +let query = ""; +let filtered = COMMITS; +let commitsOffset = 0; +let commitsTop = 0; +let pkgOffset = 0; +let pkgTop = 0; + + +const filterCommit = + (q: string) => + (x: Commit) => + x[2].toLowerCase().indexOf(q) >= 0 || + x[1].indexOf(q) >= 0; + +const setQuery = + (e) => { + try { + query = e.target.value; + filtered = COMMITS.filter(filterCommit(query)); + commitsOffset = 0; + commitsTop = 0; + } catch (e) { } + }; + +const queryFilter = + (_, query, items) => + ["div.pv2.ph3.bg-black.white", + "Filter: ", + ["input", + { type: "text", oninput: setQuery, value: query }], + ` (${items.length})` + ]; + +const repoLink = + (_, sha, body) => + ["a.link.blue", + { href: `${REPO_BASE}commit/${sha}` }, + body]; + +const packageLink = + (_, name) => + ["a.link.blue", + { href: `${REPO_BASE}tree/master/packages/${name.substr(8)}` }, + name]; + +const commit = + (i: number, [sha, date, msg]: Commit) => + [`div.f7.pv2.bg-${i & 1 ? "light-gray" : "transparent"}`, + ["div.dib.w-30.w-20-m.w-10-l.ph3", date], + ["div.dib.w-70.w-80-m.w-90-l.ph3.overflow-x-hidden.nowrap", [repoLink, sha, msg]] + ]; + +const pkgSummary = + ([name, desc]: Package) => + ["div.flex.items-center.lh-copy.pa3.ph0-l.bb.b--black-10", + { style: { height: "96px" } }, + ["img.w2.h2", { src: LOGO }], + ["div.pl3.flex-auto.f7", + ["h3.ma0", [packageLink, name]], + desc + ] + ]; + +const app = () => + ["div.sans-serif.pa2", + [queryFilter, query, filtered], + virtualScroller({ + onscroll: (_top, _offset) => { + commitsTop = _top; + commitsOffset = _offset; + }, + start: commitsOffset, + top: commitsTop, + numVisible: 10, + numItems: filtered.length, + itemHeight: 31, + items: mapIndexed(commit, 0, filtered) + }), + ["h3.ph2", "Packages"], + virtualScroller({ + onscroll: (_top, _offset) => { + pkgTop = _top; + pkgOffset = _offset; + }, + start: pkgOffset, + top: pkgTop, + numVisible: 2, + numItems: PACKAGES.length, + itemHeight: 96, + items: map(pkgSummary, PACKAGES) + }) + ]; + +const cancel = start(app) + +if (process.env.NODE_ENV !== "production") { + const hot = (module).hot; + hot && hot.dispose(cancel); +} diff --git a/examples/hdom-vscroller/src/logo-64.png b/examples/hdom-vscroller/src/logo-64.png new file mode 100644 index 0000000000000000000000000000000000000000..71a767d8c9b93a0ec2e4a7765fe33b6241a5e1a9 GIT binary patch literal 5029 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 + /** + * Max number of items visible + * Container height will be computed as: `numVisible * itemHeight` + */ + numVisible: number; + /** + * Total number of items. + */ + numItems: number; + /** + * Height (in pixels) of single item. + */ + itemHeight: number; + /** + * Item components. + */ + items: Iterable; +} + +export const virtualScroller = + ({ start, top, onscroll, numVisible, numItems, itemHeight, items }: VScrollOpts) => + ["div.overflow-y-scroll", + { + onscroll: (e) => { + const top = e.target.scrollTop; + const offset = Math.min( + Math.floor(top / itemHeight), + numItems - numVisible + ); + onscroll(top, offset); + }, + scrollTop: top, + style: { + height: `${numVisible * itemHeight}px`, + } + }, + ["div", + { + style: { + height: `${numItems * itemHeight}px`, + "padding-top": `${Math.min(start, numItems - numVisible) * itemHeight}px`, + } + }, + iterator(comp(drop(start), take(numVisible + 1)), items) + ] + ]; diff --git a/examples/hdom-vscroller/tsconfig.json b/examples/hdom-vscroller/tsconfig.json new file mode 100644 index 0000000000..50a1cade93 --- /dev/null +++ b/examples/hdom-vscroller/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": ".", + "module": "es6", + "target": "es6", + "sourceMap": true + }, + "include": [ + "./src/**/*.ts" + ] +} \ No newline at end of file From 190701e17dfd06bc51c620791974473b3dd9aa4a Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 10 Feb 2019 20:14:48 +0000 Subject: [PATCH 08/43] feat(checks): add isPrimitive() --- packages/checks/src/index.ts | 1 + packages/checks/src/is-primitive.ts | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 packages/checks/src/is-primitive.ts diff --git a/packages/checks/src/index.ts b/packages/checks/src/index.ts index 9ede4710c9..d952c8af1f 100644 --- a/packages/checks/src/index.ts +++ b/packages/checks/src/index.ts @@ -35,6 +35,7 @@ export * from "./is-object"; export * from "./is-odd"; export * from "./is-plain-object"; export * from "./is-positive"; +export * from "./is-primitive"; export * from "./is-promise"; export * from "./is-promiselike"; export * from "./is-regexp"; diff --git a/packages/checks/src/is-primitive.ts b/packages/checks/src/is-primitive.ts new file mode 100644 index 0000000000..9107b6e5cc --- /dev/null +++ b/packages/checks/src/is-primitive.ts @@ -0,0 +1,5 @@ +export const isPrimitive = + (x: any): x is (string | number) => { + const t = typeof x; + return t === "string" || t === "number"; + }; From 314f01867908ed09c3ecaf824005056eda7b56ea Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 10 Feb 2019 21:26:40 +0000 Subject: [PATCH 09/43] docs(hdom): update __skip attrib docs --- packages/hdom/README.md | 15 ++++++++++----- packages/hdom/src/api.ts | 6 ++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/hdom/README.md b/packages/hdom/README.md index 5b1e185052..3b9b9de335 100644 --- a/packages/hdom/README.md +++ b/packages/hdom/README.md @@ -1199,11 +1199,16 @@ serialized output. #### __skip -If `true`, the element will not be diffed and simply skipped. IMPORTANT: -This attribute is only intended for cases when a component / tree branch -should NOT be updated, but MUST NOT be enabled when that component is -first introduced / included in the tree. Doing so will result in -undefined future update behavior. +If true, the element will not be diffed and simply skipped. This +attribute is only intended for cases when a component / tree branch +should not be updated, but MUST NEVER be enabled when that component is +first included in the tree. Doing so will result in undefined future +behavior. + +Note, skipped elements and their children are being normalized, but are +ignored during diffing. Therefore, if this attribute is enabled the +element should either have no children OR the children are the same +(type) as when the attribute is disabled (i.e. when `__skip` is falsy). ### Benchmarks diff --git a/packages/hdom/src/api.ts b/packages/hdom/src/api.ts index 05a1f643d4..489692d591 100644 --- a/packages/hdom/src/api.ts +++ b/packages/hdom/src/api.ts @@ -56,6 +56,12 @@ export interface HDOMBehaviorAttribs { * updated, but MUST NEVER be enabled when that component is first * included in the tree. Doing so will result in undefined future * behavior. + * + * Note, skipped elements and their children are being normalized, + * but are ignored during diffing. Therefore, if this attribute is + * enabled the element should either have no children OR the + * children are the same (type) as when the attribute is disabled + * (i.e. when `__skip` is falsy). */ __skip?: boolean; /** From 7e875d4a030b08c183c43ad1ab54a8dd9843f358 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 10 Feb 2019 22:29:28 +0000 Subject: [PATCH 10/43] Publish - @thi.ng/associative@1.0.4 - @thi.ng/atom@2.0.3 - @thi.ng/bencode@0.1.1 - @thi.ng/cache@1.0.4 - @thi.ng/checks@2.1.0 - @thi.ng/color@0.1.4 - @thi.ng/csp@1.0.4 - @thi.ng/dcons@2.0.4 - @thi.ng/dgraph@1.0.4 - @thi.ng/dot@1.0.3 - @thi.ng/fsm@1.0.4 - @thi.ng/geom-accel@1.1.1 - @thi.ng/geom-api@0.1.1 - @thi.ng/geom-arc@0.1.1 - @thi.ng/geom-clip@0.0.3 - @thi.ng/geom-closest-point@0.1.1 - @thi.ng/geom-hull@0.0.3 - @thi.ng/geom-isec@0.1.1 - @thi.ng/geom-isoline@0.1.1 - @thi.ng/geom-poly-utils@0.1.1 - @thi.ng/geom-resample@0.1.1 - @thi.ng/geom-splines@0.1.1 - @thi.ng/geom-subdiv-curve@0.1.1 - @thi.ng/geom-tessellate@0.1.1 - @thi.ng/geom-voronoi@0.1.1 - @thi.ng/geom@1.2.1 - @thi.ng/hdom-canvas@1.1.3 - @thi.ng/hdom-components@3.0.4 - @thi.ng/hdom-mock@1.0.3 - @thi.ng/hdom@7.1.0 - @thi.ng/hiccup-carbon-icons@1.0.3 - @thi.ng/hiccup-css@1.0.4 - @thi.ng/hiccup-markdown@1.0.4 - @thi.ng/hiccup-svg@3.1.3 - @thi.ng/hiccup@3.0.3 - @thi.ng/iges@1.0.4 - @thi.ng/interceptors@2.0.3 - @thi.ng/iterators@5.0.4 - @thi.ng/malloc@2.0.1 - @thi.ng/matrices@0.1.4 - @thi.ng/paths@2.0.3 - @thi.ng/pointfree-lang@1.0.3 - @thi.ng/pointfree@1.0.3 - @thi.ng/poisson@0.2.1 - @thi.ng/range-coder@1.0.4 - @thi.ng/resolve-map@4.0.3 - @thi.ng/router@1.0.3 - @thi.ng/rstream-csp@1.0.4 - @thi.ng/rstream-dot@1.0.4 - @thi.ng/rstream-gestures@1.0.4 - @thi.ng/rstream-graph@3.0.4 - @thi.ng/rstream-log@2.0.4 - @thi.ng/rstream-query@1.0.4 - @thi.ng/rstream@2.0.4 - @thi.ng/sax@1.0.4 - @thi.ng/transducers-binary@0.1.1 - @thi.ng/transducers-fsm@1.0.4 - @thi.ng/transducers-hdom@2.0.4 - @thi.ng/transducers-stats@1.0.4 - @thi.ng/transducers@4.0.1 - @thi.ng/vector-pools@0.2.1 - @thi.ng/vectors@2.2.1 --- packages/associative/CHANGELOG.md | 8 +++++ packages/associative/package.json | 8 ++--- packages/atom/CHANGELOG.md | 8 +++++ packages/atom/package.json | 6 ++-- packages/bencode/CHANGELOG.md | 8 +++++ packages/bencode/package.json | 8 ++--- packages/cache/CHANGELOG.md | 8 +++++ packages/cache/package.json | 6 ++-- packages/checks/CHANGELOG.md | 11 +++++++ packages/checks/package.json | 2 +- packages/color/CHANGELOG.md | 8 +++++ packages/color/package.json | 6 ++-- packages/csp/CHANGELOG.md | 8 +++++ packages/csp/package.json | 8 ++--- packages/dcons/CHANGELOG.md | 8 +++++ packages/dcons/package.json | 6 ++-- packages/dgraph/CHANGELOG.md | 8 +++++ packages/dgraph/package.json | 6 ++-- packages/dot/CHANGELOG.md | 8 +++++ packages/dot/package.json | 4 +-- packages/fsm/CHANGELOG.md | 8 +++++ packages/fsm/package.json | 4 +-- packages/geom-accel/CHANGELOG.md | 8 +++++ packages/geom-accel/package.json | 8 ++--- packages/geom-api/CHANGELOG.md | 8 +++++ packages/geom-api/package.json | 4 +-- packages/geom-arc/CHANGELOG.md | 8 +++++ packages/geom-arc/package.json | 10 +++---- packages/geom-clip/CHANGELOG.md | 8 +++++ packages/geom-clip/package.json | 8 ++--- packages/geom-closest-point/CHANGELOG.md | 8 +++++ packages/geom-closest-point/package.json | 4 +-- packages/geom-hull/CHANGELOG.md | 8 +++++ packages/geom-hull/package.json | 4 +-- packages/geom-isec/CHANGELOG.md | 8 +++++ packages/geom-isec/package.json | 8 ++--- packages/geom-isoline/CHANGELOG.md | 11 +++++++ packages/geom-isoline/package.json | 6 ++-- packages/geom-poly-utils/CHANGELOG.md | 8 +++++ packages/geom-poly-utils/package.json | 6 ++-- packages/geom-resample/CHANGELOG.md | 8 +++++ packages/geom-resample/package.json | 10 +++---- packages/geom-splines/CHANGELOG.md | 8 +++++ packages/geom-splines/package.json | 12 ++++---- packages/geom-subdiv-curve/CHANGELOG.md | 8 +++++ packages/geom-subdiv-curve/package.json | 8 ++--- packages/geom-tessellate/CHANGELOG.md | 8 +++++ packages/geom-tessellate/package.json | 14 ++++----- packages/geom-voronoi/CHANGELOG.md | 8 +++++ packages/geom-voronoi/package.json | 12 ++++---- packages/geom/CHANGELOG.md | 8 +++++ packages/geom/package.json | 36 +++++++++++------------ packages/hdom-canvas/CHANGELOG.md | 8 +++++ packages/hdom-canvas/package.json | 8 ++--- packages/hdom-components/CHANGELOG.md | 8 +++++ packages/hdom-components/package.json | 8 ++--- packages/hdom-mock/CHANGELOG.md | 8 +++++ packages/hdom-mock/package.json | 6 ++-- packages/hdom/CHANGELOG.md | 16 ++++++++++ packages/hdom/package.json | 8 ++--- packages/hiccup-carbon-icons/CHANGELOG.md | 8 +++++ packages/hiccup-carbon-icons/package.json | 4 +-- packages/hiccup-css/CHANGELOG.md | 8 +++++ packages/hiccup-css/package.json | 6 ++-- packages/hiccup-markdown/CHANGELOG.md | 8 +++++ packages/hiccup-markdown/package.json | 10 +++---- packages/hiccup-svg/CHANGELOG.md | 8 +++++ packages/hiccup-svg/package.json | 8 ++--- packages/hiccup/CHANGELOG.md | 8 +++++ packages/hiccup/package.json | 6 ++-- packages/iges/CHANGELOG.md | 8 +++++ packages/iges/package.json | 4 +-- packages/interceptors/CHANGELOG.md | 8 +++++ packages/interceptors/package.json | 8 ++--- packages/iterators/CHANGELOG.md | 8 +++++ packages/iterators/package.json | 4 +-- packages/malloc/CHANGELOG.md | 8 +++++ packages/malloc/package.json | 4 +-- packages/matrices/CHANGELOG.md | 8 +++++ packages/matrices/package.json | 6 ++-- packages/paths/CHANGELOG.md | 8 +++++ packages/paths/package.json | 4 +-- packages/pointfree-lang/CHANGELOG.md | 8 +++++ packages/pointfree-lang/package.json | 4 +-- packages/pointfree/CHANGELOG.md | 8 +++++ packages/pointfree/package.json | 4 +-- packages/poisson/CHANGELOG.md | 8 +++++ packages/poisson/package.json | 8 ++--- packages/range-coder/CHANGELOG.md | 8 +++++ packages/range-coder/package.json | 4 +-- packages/resolve-map/CHANGELOG.md | 8 +++++ packages/resolve-map/package.json | 6 ++-- packages/router/CHANGELOG.md | 8 +++++ packages/router/package.json | 4 +-- packages/rstream-csp/CHANGELOG.md | 8 +++++ packages/rstream-csp/package.json | 6 ++-- packages/rstream-dot/CHANGELOG.md | 8 +++++ packages/rstream-dot/package.json | 4 +-- packages/rstream-gestures/CHANGELOG.md | 8 +++++ packages/rstream-gestures/package.json | 6 ++-- packages/rstream-graph/CHANGELOG.md | 8 +++++ packages/rstream-graph/package.json | 12 ++++---- packages/rstream-log/CHANGELOG.md | 8 +++++ packages/rstream-log/package.json | 8 ++--- packages/rstream-query/CHANGELOG.md | 8 +++++ packages/rstream-query/package.json | 12 ++++---- packages/rstream/CHANGELOG.md | 8 +++++ packages/rstream/package.json | 12 ++++---- packages/sax/CHANGELOG.md | 8 +++++ packages/sax/package.json | 6 ++-- packages/transducers-binary/CHANGELOG.md | 8 +++++ packages/transducers-binary/package.json | 4 +-- packages/transducers-fsm/CHANGELOG.md | 8 +++++ packages/transducers-fsm/package.json | 4 +-- packages/transducers-hdom/CHANGELOG.md | 8 +++++ packages/transducers-hdom/package.json | 8 ++--- packages/transducers-stats/CHANGELOG.md | 8 +++++ packages/transducers-stats/package.json | 8 ++--- packages/transducers/CHANGELOG.md | 8 +++++ packages/transducers/package.json | 4 +-- packages/vector-pools/CHANGELOG.md | 8 +++++ packages/vector-pools/package.json | 6 ++-- packages/vectors/CHANGELOG.md | 8 +++++ packages/vectors/package.json | 6 ++-- 124 files changed, 732 insertions(+), 222 deletions(-) diff --git a/packages/associative/CHANGELOG.md b/packages/associative/CHANGELOG.md index 434588c1ad..65254203f9 100644 --- a/packages/associative/CHANGELOG.md +++ b/packages/associative/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@1.0.3...@thi.ng/associative@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/associative + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@1.0.2...@thi.ng/associative@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/associative diff --git a/packages/associative/package.json b/packages/associative/package.json index c143010cec..c6a1a7ba94 100644 --- a/packages/associative/package.json +++ b/packages/associative/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/associative", - "version": "1.0.3", + "version": "1.0.4", "description": "Alternative Set & Map data type implementations with customizable equality semantics & supporting operations", "module": "./index.js", "main": "./lib/index.js", @@ -33,12 +33,12 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/compare": "^1.0.2", - "@thi.ng/dcons": "^2.0.3", + "@thi.ng/dcons": "^2.0.4", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "data structures", diff --git a/packages/atom/CHANGELOG.md b/packages/atom/CHANGELOG.md index e7f3735f51..5ca4c86668 100644 --- a/packages/atom/CHANGELOG.md +++ b/packages/atom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/atom@2.0.2...@thi.ng/atom@2.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/atom + + + + + ## [2.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/atom@2.0.1...@thi.ng/atom@2.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/atom diff --git a/packages/atom/package.json b/packages/atom/package.json index cfe39114b0..0c85087f14 100644 --- a/packages/atom/package.json +++ b/packages/atom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/atom", - "version": "2.0.2", + "version": "2.0.3", "description": "Mutable wrappers for nested immutable values w/ optional undo/redo history", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/paths": "^2.0.2" + "@thi.ng/paths": "^2.0.3" }, "keywords": [ "derived views", diff --git a/packages/bencode/CHANGELOG.md b/packages/bencode/CHANGELOG.md index 1e83c485d8..3cae5a1625 100644 --- a/packages/bencode/CHANGELOG.md +++ b/packages/bencode/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/bencode@0.1.0...@thi.ng/bencode@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/bencode + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/bencode/package.json b/packages/bencode/package.json index 3954451a7e..5fe1a242b1 100644 --- a/packages/bencode/package.json +++ b/packages/bencode/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/bencode", - "version": "0.1.0", + "version": "0.1.1", "description": "TODO", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/defmulti": "^1.0.2", - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/transducers-binary": "^0.1.0" + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/transducers-binary": "^0.1.1" }, "keywords": [ "bencode", diff --git a/packages/cache/CHANGELOG.md b/packages/cache/CHANGELOG.md index e81f290719..85259f87eb 100644 --- a/packages/cache/CHANGELOG.md +++ b/packages/cache/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@1.0.3...@thi.ng/cache@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/cache + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@1.0.2...@thi.ng/cache@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/cache diff --git a/packages/cache/package.json b/packages/cache/package.json index 788ee09614..c683215b45 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/cache", - "version": "1.0.3", + "version": "1.0.4", "description": "In-memory cache implementations with ES6 Map-like API and different eviction strategies", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/dcons": "^2.0.3", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/dcons": "^2.0.4", + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "cache", diff --git a/packages/checks/CHANGELOG.md b/packages/checks/CHANGELOG.md index 8eb71fe072..af5b941d70 100644 --- a/packages/checks/CHANGELOG.md +++ b/packages/checks/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.1.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/checks@2.0.2...@thi.ng/checks@2.1.0) (2019-02-10) + + +### Features + +* **checks:** add isPrimitive() ([190701e](https://github.com/thi-ng/umbrella/commit/190701e)) + + + + + ## [2.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/checks@2.0.1...@thi.ng/checks@2.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/checks diff --git a/packages/checks/package.json b/packages/checks/package.json index 8f76b478eb..6a87e6d10c 100644 --- a/packages/checks/package.json +++ b/packages/checks/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/checks", - "version": "2.0.2", + "version": "2.1.0", "description": "Single-function sub-modules for type, feature & value checks", "module": "./index.js", "main": "./lib/index.js", diff --git a/packages/color/CHANGELOG.md b/packages/color/CHANGELOG.md index d896ee8a70..4443f7947a 100644 --- a/packages/color/CHANGELOG.md +++ b/packages/color/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/color@0.1.3...@thi.ng/color@0.1.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/color + + + + + ## [0.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/color@0.1.2...@thi.ng/color@0.1.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/color diff --git a/packages/color/package.json b/packages/color/package.json index ff8d05b334..642eff4e78 100644 --- a/packages/color/package.json +++ b/packages/color/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/color", - "version": "0.1.3", + "version": "0.1.4", "description": "TODO", "module": "./index.js", "main": "./lib/index.js", @@ -38,8 +38,8 @@ "@thi.ng/errors": "^1.0.2", "@thi.ng/math": "^1.1.0", "@thi.ng/strings": "^1.0.3", - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "alpha", diff --git a/packages/csp/CHANGELOG.md b/packages/csp/CHANGELOG.md index e43d61dec7..a8059cdd59 100644 --- a/packages/csp/CHANGELOG.md +++ b/packages/csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@1.0.3...@thi.ng/csp@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/csp + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@1.0.2...@thi.ng/csp@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/csp diff --git a/packages/csp/package.json b/packages/csp/package.json index 359fda90b6..8b4df24493 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/csp", - "version": "1.0.3", + "version": "1.0.4", "description": "ES6 promise based CSP implementation", "module": "./index.js", "main": "./lib/index.js", @@ -37,10 +37,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", - "@thi.ng/dcons": "^2.0.3", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/dcons": "^2.0.4", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "async", diff --git a/packages/dcons/CHANGELOG.md b/packages/dcons/CHANGELOG.md index e092f9826f..a6f56a0f5c 100644 --- a/packages/dcons/CHANGELOG.md +++ b/packages/dcons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@2.0.3...@thi.ng/dcons@2.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/dcons + + + + + ## [2.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@2.0.2...@thi.ng/dcons@2.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/dcons diff --git a/packages/dcons/package.json b/packages/dcons/package.json index bf2895e66b..d053798f7f 100644 --- a/packages/dcons/package.json +++ b/packages/dcons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dcons", - "version": "2.0.3", + "version": "2.0.4", "description": "Comprehensive doubly linked list structure w/ iterator support", "module": "./index.js", "main": "./lib/index.js", @@ -33,11 +33,11 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/compare": "^1.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "datastructure", diff --git a/packages/dgraph/CHANGELOG.md b/packages/dgraph/CHANGELOG.md index 4983508e0e..db27de994a 100644 --- a/packages/dgraph/CHANGELOG.md +++ b/packages/dgraph/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@1.0.3...@thi.ng/dgraph@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/dgraph + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@1.0.2...@thi.ng/dgraph@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/dgraph diff --git a/packages/dgraph/package.json b/packages/dgraph/package.json index c90f1b1352..fced63b071 100644 --- a/packages/dgraph/package.json +++ b/packages/dgraph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dgraph", - "version": "1.0.3", + "version": "1.0.4", "description": "Type-agnostic directed acyclic graph (DAG) & graph operations", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/associative": "^1.0.3", + "@thi.ng/associative": "^1.0.4", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "data structure", diff --git a/packages/dot/CHANGELOG.md b/packages/dot/CHANGELOG.md index 717babcffb..1e02d36b26 100644 --- a/packages/dot/CHANGELOG.md +++ b/packages/dot/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/dot@1.0.2...@thi.ng/dot@1.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/dot + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/dot@1.0.1...@thi.ng/dot@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/dot diff --git a/packages/dot/package.json b/packages/dot/package.json index d34779d9c8..56090ce57a 100644 --- a/packages/dot/package.json +++ b/packages/dot/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dot", - "version": "1.0.2", + "version": "1.0.3", "description": "Graphviz DOM abstraction as vanilla JS objects & serialization to DOT format", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2" + "@thi.ng/checks": "^2.1.0" }, "keywords": [ "ES6", diff --git a/packages/fsm/CHANGELOG.md b/packages/fsm/CHANGELOG.md index 59bad37e92..b1d7424555 100644 --- a/packages/fsm/CHANGELOG.md +++ b/packages/fsm/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/fsm@1.0.3...@thi.ng/fsm@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/fsm + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/fsm@1.0.2...@thi.ng/fsm@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/fsm diff --git a/packages/fsm/package.json b/packages/fsm/package.json index 646b423d88..acb305fed1 100644 --- a/packages/fsm/package.json +++ b/packages/fsm/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/fsm", - "version": "1.0.3", + "version": "1.0.4", "description": "Composable primitives for building declarative, transducer based Finite-State machines & parsers for arbitrary data streams", "module": "./index.js", "main": "./lib/index.js", @@ -35,7 +35,7 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "ES6", diff --git a/packages/geom-accel/CHANGELOG.md b/packages/geom-accel/CHANGELOG.md index f3e757b872..b9747832c6 100644 --- a/packages/geom-accel/CHANGELOG.md +++ b/packages/geom-accel/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-accel@1.1.0...@thi.ng/geom-accel@1.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-accel + + + + + # [1.1.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-accel@1.0.2...@thi.ng/geom-accel@1.1.0) (2019-02-05) diff --git a/packages/geom-accel/package.json b/packages/geom-accel/package.json index 6131451590..b9b802f40f 100644 --- a/packages/geom-accel/package.json +++ b/packages/geom-accel/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-accel", - "version": "1.1.0", + "version": "1.1.1", "description": "nD spatial indexing data structures", "module": "./index.js", "main": "./lib/index.js", @@ -33,11 +33,11 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/geom-api": "^0.1.0", + "@thi.ng/geom-api": "^0.1.1", "@thi.ng/heaps": "^1.0.2", "@thi.ng/math": "^1.1.0", - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-api/CHANGELOG.md b/packages/geom-api/CHANGELOG.md index a7b7818a01..6084d96874 100644 --- a/packages/geom-api/CHANGELOG.md +++ b/packages/geom-api/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-api@0.1.0...@thi.ng/geom-api@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-api + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-api/package.json b/packages/geom-api/package.json index dc4f9c046b..6af6fbed2c 100644 --- a/packages/geom-api/package.json +++ b/packages/geom-api/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-api", - "version": "0.1.0", + "version": "0.1.1", "description": "Shared type & interface declarations for @thi.ng/geom packages", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "ES6", diff --git a/packages/geom-arc/CHANGELOG.md b/packages/geom-arc/CHANGELOG.md index 3347bae0ac..8ef6589326 100644 --- a/packages/geom-arc/CHANGELOG.md +++ b/packages/geom-arc/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-arc@0.1.0...@thi.ng/geom-arc@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-arc + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-arc/package.json b/packages/geom-arc/package.json index 061086de9c..60cbbae06e 100644 --- a/packages/geom-arc/package.json +++ b/packages/geom-arc/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-arc", - "version": "0.1.0", + "version": "0.1.1", "description": "2D circular / elliptic arc operations", "module": "./index.js", "main": "./lib/index.js", @@ -32,11 +32,11 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", - "@thi.ng/geom-api": "^0.1.0", - "@thi.ng/geom-resample": "^0.1.0", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/geom-api": "^0.1.1", + "@thi.ng/geom-resample": "^0.1.1", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-clip/CHANGELOG.md b/packages/geom-clip/CHANGELOG.md index 4a08b3fc9f..b9d872b025 100644 --- a/packages/geom-clip/CHANGELOG.md +++ b/packages/geom-clip/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-clip@0.0.2...@thi.ng/geom-clip@0.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-clip + + + + + ## 0.0.2 (2019-02-05) **Note:** Version bump only for package @thi.ng/geom-clip diff --git a/packages/geom-clip/package.json b/packages/geom-clip/package.json index 2ba5afb89a..5bd320d956 100644 --- a/packages/geom-clip/package.json +++ b/packages/geom-clip/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-clip", - "version": "0.0.2", + "version": "0.0.3", "description": "2D line & convex polygon clipping (Liang-Barsky / Sutherland-Hodgeman)", "module": "./index.js", "main": "./lib/index.js", @@ -32,10 +32,10 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/geom-isec": "^0.1.0", - "@thi.ng/geom-poly-utils": "^0.1.0", + "@thi.ng/geom-isec": "^0.1.1", + "@thi.ng/geom-poly-utils": "^0.1.1", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-closest-point/CHANGELOG.md b/packages/geom-closest-point/CHANGELOG.md index 1d69a9ae8e..4686de8cd9 100644 --- a/packages/geom-closest-point/CHANGELOG.md +++ b/packages/geom-closest-point/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-closest-point@0.1.0...@thi.ng/geom-closest-point@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-closest-point + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-closest-point/package.json b/packages/geom-closest-point/package.json index e7157e85eb..ed923dfd63 100644 --- a/packages/geom-closest-point/package.json +++ b/packages/geom-closest-point/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-closest-point", - "version": "0.1.0", + "version": "0.1.1", "description": "Closest point / proximity helpers", "module": "./index.js", "main": "./lib/index.js", @@ -32,7 +32,7 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "ES6", diff --git a/packages/geom-hull/CHANGELOG.md b/packages/geom-hull/CHANGELOG.md index 637a1b771d..c231fce41b 100644 --- a/packages/geom-hull/CHANGELOG.md +++ b/packages/geom-hull/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-hull@0.0.2...@thi.ng/geom-hull@0.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-hull + + + + + ## 0.0.2 (2019-02-05) **Note:** Version bump only for package @thi.ng/geom-hull diff --git a/packages/geom-hull/package.json b/packages/geom-hull/package.json index 86f6493689..1b9d9c376f 100644 --- a/packages/geom-hull/package.json +++ b/packages/geom-hull/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-hull", - "version": "0.0.2", + "version": "0.0.3", "description": "Fast 2D convex hull (Graham Scan)", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-isec/CHANGELOG.md b/packages/geom-isec/CHANGELOG.md index 8376e61a34..b51d9d36dc 100644 --- a/packages/geom-isec/CHANGELOG.md +++ b/packages/geom-isec/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-isec@0.1.0...@thi.ng/geom-isec@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-isec + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-isec/package.json b/packages/geom-isec/package.json index 86fafd4acf..af0b03f9b7 100644 --- a/packages/geom-isec/package.json +++ b/packages/geom-isec/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-isec", - "version": "0.1.0", + "version": "0.1.1", "description": "2D/3D shape intersection checks", "module": "./index.js", "main": "./lib/index.js", @@ -32,10 +32,10 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/geom-api": "^0.1.0", - "@thi.ng/geom-closest-point": "^0.1.0", + "@thi.ng/geom-api": "^0.1.1", + "@thi.ng/geom-closest-point": "^0.1.1", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-isoline/CHANGELOG.md b/packages/geom-isoline/CHANGELOG.md index 7d59a28c29..5b57bd244c 100644 --- a/packages/geom-isoline/CHANGELOG.md +++ b/packages/geom-isoline/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-isoline@0.1.0...@thi.ng/geom-isoline@0.1.1) (2019-02-10) + + +### Performance Improvements + +* **geom-isoline:** minor optimizations ([d990c3c](https://github.com/thi-ng/umbrella/commit/d990c3c)) + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-isoline/package.json b/packages/geom-isoline/package.json index 91e16e01b3..5c66551520 100644 --- a/packages/geom-isoline/package.json +++ b/packages/geom-isoline/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-isoline", - "version": "0.1.0", + "version": "0.1.1", "description": "Fast 2D contour line extraction / generation", "module": "./index.js", "main": "./lib/index.js", @@ -32,8 +32,8 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-poly-utils/CHANGELOG.md b/packages/geom-poly-utils/CHANGELOG.md index ac5616423c..12e2587a12 100644 --- a/packages/geom-poly-utils/CHANGELOG.md +++ b/packages/geom-poly-utils/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-poly-utils@0.1.0...@thi.ng/geom-poly-utils@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-poly-utils + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-poly-utils/package.json b/packages/geom-poly-utils/package.json index eb6737afa2..263f287320 100644 --- a/packages/geom-poly-utils/package.json +++ b/packages/geom-poly-utils/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-poly-utils", - "version": "0.1.0", + "version": "0.1.1", "description": "Polygon / triangle analysis & processing utilities", "module": "./index.js", "main": "./lib/index.js", @@ -33,9 +33,9 @@ }, "dependencies": { "@thi.ng/errors": "^1.0.2", - "@thi.ng/geom-api": "^0.1.0", + "@thi.ng/geom-api": "^0.1.1", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-resample/CHANGELOG.md b/packages/geom-resample/CHANGELOG.md index 12ae1dddb6..3ee49641d0 100644 --- a/packages/geom-resample/CHANGELOG.md +++ b/packages/geom-resample/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-resample@0.1.0...@thi.ng/geom-resample@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-resample + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-resample/package.json b/packages/geom-resample/package.json index 2aa1d3e279..ea6cd6bf18 100644 --- a/packages/geom-resample/package.json +++ b/packages/geom-resample/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-resample", - "version": "0.1.0", + "version": "0.1.1", "description": "Customizable nD polyline interpolation, re-sampling, splitting & nearest point computation", "module": "./index.js", "main": "./lib/index.js", @@ -32,11 +32,11 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", - "@thi.ng/geom-api": "^0.1.0", - "@thi.ng/geom-closest-point": "^0.1.0", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/geom-api": "^0.1.1", + "@thi.ng/geom-closest-point": "^0.1.1", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-splines/CHANGELOG.md b/packages/geom-splines/CHANGELOG.md index e4031d03ac..8589f7ec4f 100644 --- a/packages/geom-splines/CHANGELOG.md +++ b/packages/geom-splines/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-splines@0.1.0...@thi.ng/geom-splines@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-splines + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-splines/package.json b/packages/geom-splines/package.json index 53b77b1d34..09c97bff46 100644 --- a/packages/geom-splines/package.json +++ b/packages/geom-splines/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-splines", - "version": "0.1.0", + "version": "0.1.1", "description": "nD cubic & quadratic curve analysis, conversion, interpolation, splitting", "module": "./index.js", "main": "./lib/index.js", @@ -32,12 +32,12 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", - "@thi.ng/geom-api": "^0.1.0", - "@thi.ng/geom-arc": "^0.1.0", - "@thi.ng/geom-resample": "^0.1.0", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/geom-api": "^0.1.1", + "@thi.ng/geom-arc": "^0.1.1", + "@thi.ng/geom-resample": "^0.1.1", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-subdiv-curve/CHANGELOG.md b/packages/geom-subdiv-curve/CHANGELOG.md index 7228378a3e..029f6b38f4 100644 --- a/packages/geom-subdiv-curve/CHANGELOG.md +++ b/packages/geom-subdiv-curve/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-subdiv-curve@0.1.0...@thi.ng/geom-subdiv-curve@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-subdiv-curve + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-subdiv-curve/package.json b/packages/geom-subdiv-curve/package.json index c1fb573d26..6b1efe63a0 100644 --- a/packages/geom-subdiv-curve/package.json +++ b/packages/geom-subdiv-curve/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-subdiv-curve", - "version": "0.1.0", + "version": "0.1.1", "description": "Freely customizable, iterative subdivision curves for open / closed input geometries", "module": "./index.js", "main": "./lib/index.js", @@ -32,9 +32,9 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/geom-api": "^0.1.0", - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/geom-api": "^0.1.1", + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-tessellate/CHANGELOG.md b/packages/geom-tessellate/CHANGELOG.md index 94f296ba84..d083261e7c 100644 --- a/packages/geom-tessellate/CHANGELOG.md +++ b/packages/geom-tessellate/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-tessellate@0.1.0...@thi.ng/geom-tessellate@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-tessellate + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-tessellate/package.json b/packages/geom-tessellate/package.json index 1b59ad67f8..b32108fdb6 100644 --- a/packages/geom-tessellate/package.json +++ b/packages/geom-tessellate/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-tessellate", - "version": "0.1.0", + "version": "0.1.1", "description": "2D/3D polygon tessellators", "module": "./index.js", "main": "./lib/index.js", @@ -32,12 +32,12 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", - "@thi.ng/geom-api": "^0.1.0", - "@thi.ng/geom-isec": "^0.1.0", - "@thi.ng/geom-poly-utils": "^0.1.0", - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/checks": "^2.1.0", + "@thi.ng/geom-api": "^0.1.1", + "@thi.ng/geom-isec": "^0.1.1", + "@thi.ng/geom-poly-utils": "^0.1.1", + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom-voronoi/CHANGELOG.md b/packages/geom-voronoi/CHANGELOG.md index b1d8c9b33a..5abd8c7739 100644 --- a/packages/geom-voronoi/CHANGELOG.md +++ b/packages/geom-voronoi/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-voronoi@0.1.0...@thi.ng/geom-voronoi@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom-voronoi + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/geom-voronoi/package.json b/packages/geom-voronoi/package.json index 9f7ff206e9..e31928650e 100644 --- a/packages/geom-voronoi/package.json +++ b/packages/geom-voronoi/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-voronoi", - "version": "0.1.0", + "version": "0.1.1", "description": "Fast, incremental 2D Delaunay & Voronoi mesh implementation", "module": "./index.js", "main": "./lib/index.js", @@ -33,13 +33,13 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", - "@thi.ng/geom-clip": "^0.0.2", - "@thi.ng/geom-isec": "^0.1.0", - "@thi.ng/geom-poly-utils": "^0.1.0", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/geom-clip": "^0.0.3", + "@thi.ng/geom-isec": "^0.1.1", + "@thi.ng/geom-poly-utils": "^0.1.1", "@thi.ng/math": "^1.1.0", "@thi.ng/quad-edge": "^0.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/geom/CHANGELOG.md b/packages/geom/CHANGELOG.md index 2f3dd8b2db..076244a3c9 100644 --- a/packages/geom/CHANGELOG.md +++ b/packages/geom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom@1.2.0...@thi.ng/geom@1.2.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/geom + + + + + # [1.2.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom@1.1.1...@thi.ng/geom@1.2.0) (2019-02-05) diff --git a/packages/geom/package.json b/packages/geom/package.json index a6fb839383..a8aed2ee31 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom", - "version": "1.2.0", + "version": "1.2.1", "description": "TODO", "module": "./index.js", "main": "./lib/index.js", @@ -33,29 +33,29 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/compose": "^1.0.2", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/geom-api": "^0.1.0", - "@thi.ng/geom-arc": "^0.1.0", - "@thi.ng/geom-clip": "^0.0.2", - "@thi.ng/geom-closest-point": "^0.1.0", - "@thi.ng/geom-hull": "^0.0.2", - "@thi.ng/geom-isec": "^0.1.0", - "@thi.ng/geom-poly-utils": "^0.1.0", - "@thi.ng/geom-resample": "^0.1.0", - "@thi.ng/geom-splines": "^0.1.0", - "@thi.ng/geom-subdiv-curve": "^0.1.0", - "@thi.ng/geom-tessellate": "^0.1.0", - "@thi.ng/hiccup": "^3.0.2", - "@thi.ng/hiccup-svg": "^3.1.2", + "@thi.ng/geom-api": "^0.1.1", + "@thi.ng/geom-arc": "^0.1.1", + "@thi.ng/geom-clip": "^0.0.3", + "@thi.ng/geom-closest-point": "^0.1.1", + "@thi.ng/geom-hull": "^0.0.3", + "@thi.ng/geom-isec": "^0.1.1", + "@thi.ng/geom-poly-utils": "^0.1.1", + "@thi.ng/geom-resample": "^0.1.1", + "@thi.ng/geom-splines": "^0.1.1", + "@thi.ng/geom-subdiv-curve": "^0.1.1", + "@thi.ng/geom-tessellate": "^0.1.1", + "@thi.ng/hiccup": "^3.0.3", + "@thi.ng/hiccup-svg": "^3.1.3", "@thi.ng/math": "^1.1.0", - "@thi.ng/matrices": "^0.1.3", + "@thi.ng/matrices": "^0.1.4", "@thi.ng/random": "^1.0.2", - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/hdom-canvas/CHANGELOG.md b/packages/hdom-canvas/CHANGELOG.md index fb4141a2f8..d7eccbb705 100644 --- a/packages/hdom-canvas/CHANGELOG.md +++ b/packages/hdom-canvas/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@1.1.2...@thi.ng/hdom-canvas@1.1.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/hdom-canvas + + + + + ## [1.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@1.1.1...@thi.ng/hdom-canvas@1.1.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/hdom-canvas diff --git a/packages/hdom-canvas/package.json b/packages/hdom-canvas/package.json index 563768ae61..9f9eee81b5 100644 --- a/packages/hdom-canvas/package.json +++ b/packages/hdom-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-canvas", - "version": "1.1.2", + "version": "1.1.3", "description": "Declarative canvas scenegraph & visualization for @thi.ng/hdom", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", - "@thi.ng/color": "^0.1.3", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/color": "^0.1.4", "@thi.ng/diff": "^3.0.2", - "@thi.ng/hdom": "^7.0.2" + "@thi.ng/hdom": "^7.1.0" }, "keywords": [ "ES6", diff --git a/packages/hdom-components/CHANGELOG.md b/packages/hdom-components/CHANGELOG.md index 48a526ee3d..cfaca1faf4 100644 --- a/packages/hdom-components/CHANGELOG.md +++ b/packages/hdom-components/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@3.0.3...@thi.ng/hdom-components@3.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/hdom-components + + + + + ## [3.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@3.0.2...@thi.ng/hdom-components@3.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/hdom-components diff --git a/packages/hdom-components/package.json b/packages/hdom-components/package.json index 2376386a18..58e302054f 100644 --- a/packages/hdom-components/package.json +++ b/packages/hdom-components/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-components", - "version": "3.0.3", + "version": "3.0.4", "description": "Raw, skinnable UI & SVG components for @thi.ng/hdom", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/math": "^1.1.0", - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/transducers-stats": "^1.0.3", + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/transducers-stats": "^1.0.4", "@types/webgl2": "^0.0.4" }, "keywords": [ diff --git a/packages/hdom-mock/CHANGELOG.md b/packages/hdom-mock/CHANGELOG.md index b8f28249e8..202966d536 100644 --- a/packages/hdom-mock/CHANGELOG.md +++ b/packages/hdom-mock/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-mock@1.0.2...@thi.ng/hdom-mock@1.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/hdom-mock + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-mock@1.0.1...@thi.ng/hdom-mock@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/hdom-mock diff --git a/packages/hdom-mock/package.json b/packages/hdom-mock/package.json index 9c63d25460..0afa03ed6b 100644 --- a/packages/hdom-mock/package.json +++ b/packages/hdom-mock/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-mock", - "version": "1.0.2", + "version": "1.0.3", "description": "Mock base implementation for @thi.ng/hdom API", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", - "@thi.ng/hdom": "^7.0.2" + "@thi.ng/checks": "^2.1.0", + "@thi.ng/hdom": "^7.1.0" }, "keywords": [ "ES6", diff --git a/packages/hdom/CHANGELOG.md b/packages/hdom/CHANGELOG.md index 04fd873468..c911ab5438 100644 --- a/packages/hdom/CHANGELOG.md +++ b/packages/hdom/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [7.1.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@7.0.2...@thi.ng/hdom@7.1.0) (2019-02-10) + + +### Bug Fixes + +* **hdom:** fix [#72](https://github.com/thi-ng/umbrella/issues/72), update normalizeElement() ([3ed4ea1](https://github.com/thi-ng/umbrella/commit/3ed4ea1)) + + +### Features + +* **hdom:** add scrollTop/Left property support in setAttrib() ([895da65](https://github.com/thi-ng/umbrella/commit/895da65)) + + + + + ## [7.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom@7.0.1...@thi.ng/hdom@7.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/hdom diff --git a/packages/hdom/package.json b/packages/hdom/package.json index 0773ccbb30..26b10cff67 100644 --- a/packages/hdom/package.json +++ b/packages/hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom", - "version": "7.0.2", + "version": "7.1.0", "description": "Lightweight vanilla ES6 UI component trees with customizable branch-local behaviors", "module": "./index.js", "main": "./lib/index.js", @@ -24,7 +24,7 @@ "pub": "yarn build && yarn publish --access public" }, "devDependencies": { - "@thi.ng/atom": "^2.0.2", + "@thi.ng/atom": "^2.0.3", "@types/mocha": "^5.2.5", "@types/node": "^10.12.15", "mocha": "^5.2.0", @@ -34,11 +34,11 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/diff": "^3.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/hiccup": "^3.0.2" + "@thi.ng/hiccup": "^3.0.3" }, "keywords": [ "browser", diff --git a/packages/hiccup-carbon-icons/CHANGELOG.md b/packages/hiccup-carbon-icons/CHANGELOG.md index f41a070354..4301a1838d 100644 --- a/packages/hiccup-carbon-icons/CHANGELOG.md +++ b/packages/hiccup-carbon-icons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-carbon-icons@1.0.2...@thi.ng/hiccup-carbon-icons@1.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/hiccup-carbon-icons + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-carbon-icons@1.0.1...@thi.ng/hiccup-carbon-icons@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/hiccup-carbon-icons diff --git a/packages/hiccup-carbon-icons/package.json b/packages/hiccup-carbon-icons/package.json index 8c495e878f..b4ab41c86d 100644 --- a/packages/hiccup-carbon-icons/package.json +++ b/packages/hiccup-carbon-icons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-carbon-icons", - "version": "1.0.2", + "version": "1.0.3", "description": "TODO", "module": "./index.js", "main": "./lib/index.js", @@ -24,7 +24,7 @@ "pub": "yarn build && yarn publish --access public" }, "devDependencies": { - "@thi.ng/hiccup": "^3.0.2", + "@thi.ng/hiccup": "^3.0.3", "@types/mocha": "^5.2.5", "@types/node": "^10.12.15", "mocha": "^5.2.0", diff --git a/packages/hiccup-css/CHANGELOG.md b/packages/hiccup-css/CHANGELOG.md index 2e44e4b4b2..551b468c4b 100644 --- a/packages/hiccup-css/CHANGELOG.md +++ b/packages/hiccup-css/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@1.0.3...@thi.ng/hiccup-css@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/hiccup-css + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@1.0.2...@thi.ng/hiccup-css@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/hiccup-css diff --git a/packages/hiccup-css/package.json b/packages/hiccup-css/package.json index 4e0ce82fc8..5081310e50 100644 --- a/packages/hiccup-css/package.json +++ b/packages/hiccup-css/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-css", - "version": "1.0.3", + "version": "1.0.4", "description": "CSS from nested JS data structures", "module": "./index.js", "main": "./lib/index.js", @@ -33,9 +33,9 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "clojure", diff --git a/packages/hiccup-markdown/CHANGELOG.md b/packages/hiccup-markdown/CHANGELOG.md index 4db68ce1d8..3c4afd9254 100644 --- a/packages/hiccup-markdown/CHANGELOG.md +++ b/packages/hiccup-markdown/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-markdown@1.0.3...@thi.ng/hiccup-markdown@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/hiccup-markdown + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-markdown@1.0.2...@thi.ng/hiccup-markdown@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/hiccup-markdown diff --git a/packages/hiccup-markdown/package.json b/packages/hiccup-markdown/package.json index ff0c384ef3..e4a790e6cf 100644 --- a/packages/hiccup-markdown/package.json +++ b/packages/hiccup-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-markdown", - "version": "1.0.3", + "version": "1.0.4", "description": "Markdown serialization of hiccup DOM trees", "module": "./index.js", "main": "./lib/index.js", @@ -32,13 +32,13 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/fsm": "^1.0.3", - "@thi.ng/hiccup": "^3.0.2", + "@thi.ng/fsm": "^1.0.4", + "@thi.ng/hiccup": "^3.0.3", "@thi.ng/strings": "^1.0.3", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "ES6", diff --git a/packages/hiccup-svg/CHANGELOG.md b/packages/hiccup-svg/CHANGELOG.md index db6b6a4af8..804c6dd641 100644 --- a/packages/hiccup-svg/CHANGELOG.md +++ b/packages/hiccup-svg/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-svg@3.1.2...@thi.ng/hiccup-svg@3.1.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/hiccup-svg + + + + + ## [3.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-svg@3.1.1...@thi.ng/hiccup-svg@3.1.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/hiccup-svg diff --git a/packages/hiccup-svg/package.json b/packages/hiccup-svg/package.json index 93c13a68a5..2861239109 100644 --- a/packages/hiccup-svg/package.json +++ b/packages/hiccup-svg/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-svg", - "version": "3.1.2", + "version": "3.1.3", "description": "SVG element functions for @thi.ng/hiccup & @thi.ng/hdom", "module": "./index.js", "main": "./lib/index.js", @@ -32,9 +32,9 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", - "@thi.ng/color": "^0.1.3", - "@thi.ng/hiccup": "^3.0.2" + "@thi.ng/checks": "^2.1.0", + "@thi.ng/color": "^0.1.4", + "@thi.ng/hiccup": "^3.0.3" }, "keywords": [ "components", diff --git a/packages/hiccup/CHANGELOG.md b/packages/hiccup/CHANGELOG.md index 1db7ab7b18..41a6f1a03f 100644 --- a/packages/hiccup/CHANGELOG.md +++ b/packages/hiccup/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup@3.0.2...@thi.ng/hiccup@3.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/hiccup + + + + + ## [3.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup@3.0.1...@thi.ng/hiccup@3.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/hiccup diff --git a/packages/hiccup/package.json b/packages/hiccup/package.json index 897c0c16c8..7f6c197d35 100644 --- a/packages/hiccup/package.json +++ b/packages/hiccup/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup", - "version": "3.0.2", + "version": "3.0.3", "description": "HTML/SVG/XML serialization of nested data structures, iterables & closures", "module": "./index.js", "main": "./lib/index.js", @@ -24,7 +24,7 @@ "pub": "yarn build && yarn publish --access public" }, "devDependencies": { - "@thi.ng/atom": "^2.0.2", + "@thi.ng/atom": "^2.0.3", "@types/mocha": "^5.2.5", "@types/node": "^10.12.15", "mocha": "^5.2.0", @@ -33,7 +33,7 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2" }, "keywords": [ diff --git a/packages/iges/CHANGELOG.md b/packages/iges/CHANGELOG.md index dd17051cab..4752f6e8cb 100644 --- a/packages/iges/CHANGELOG.md +++ b/packages/iges/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@1.0.3...@thi.ng/iges@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/iges + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@1.0.2...@thi.ng/iges@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/iges diff --git a/packages/iges/package.json b/packages/iges/package.json index 8eaf357b11..b05a3ede2b 100644 --- a/packages/iges/package.json +++ b/packages/iges/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iges", - "version": "1.0.3", + "version": "1.0.4", "description": "IGES 5.3 serializer for (currently only) polygonal geometry, both open & closed", "module": "./index.js", "main": "./lib/index.js", @@ -35,7 +35,7 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/strings": "^1.0.3", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "CAD", diff --git a/packages/interceptors/CHANGELOG.md b/packages/interceptors/CHANGELOG.md index f9e546105f..1e462056fe 100644 --- a/packages/interceptors/CHANGELOG.md +++ b/packages/interceptors/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/interceptors@2.0.2...@thi.ng/interceptors@2.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/interceptors + + + + + ## [2.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/interceptors@2.0.1...@thi.ng/interceptors@2.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/interceptors diff --git a/packages/interceptors/package.json b/packages/interceptors/package.json index 5c4621feec..a49f6834d4 100644 --- a/packages/interceptors/package.json +++ b/packages/interceptors/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/interceptors", - "version": "2.0.2", + "version": "2.0.3", "description": "Interceptor based event bus, side effect & immutable state handling", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/atom": "^2.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/atom": "^2.0.3", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", - "@thi.ng/paths": "^2.0.2" + "@thi.ng/paths": "^2.0.3" }, "keywords": [ "ES6", diff --git a/packages/iterators/CHANGELOG.md b/packages/iterators/CHANGELOG.md index 888eac1166..bc7f3e5d13 100644 --- a/packages/iterators/CHANGELOG.md +++ b/packages/iterators/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@5.0.3...@thi.ng/iterators@5.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/iterators + + + + + ## [5.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@5.0.2...@thi.ng/iterators@5.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/iterators diff --git a/packages/iterators/package.json b/packages/iterators/package.json index 0477044f07..70df5ceff0 100644 --- a/packages/iterators/package.json +++ b/packages/iterators/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iterators", - "version": "5.0.3", + "version": "5.0.4", "description": "clojure.core inspired, composable ES6 iterators & generators", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/dcons": "^2.0.3", + "@thi.ng/dcons": "^2.0.4", "@thi.ng/errors": "^1.0.2" }, "keywords": [ diff --git a/packages/malloc/CHANGELOG.md b/packages/malloc/CHANGELOG.md index e833a5c534..ad90b061df 100644 --- a/packages/malloc/CHANGELOG.md +++ b/packages/malloc/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/malloc@2.0.0...@thi.ng/malloc@2.0.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/malloc + + + + + # [2.0.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/malloc@1.0.1...@thi.ng/malloc@2.0.0) (2019-02-05) diff --git a/packages/malloc/package.json b/packages/malloc/package.json index 9e23c2bab2..a9f24eb7b6 100644 --- a/packages/malloc/package.json +++ b/packages/malloc/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/malloc", - "version": "2.0.0", + "version": "2.0.1", "description": "ArrayBuffer based malloc() impl for hybrid JS/WASM use cases, based on thi.ng/tinyalloc", "module": "./index.js", "main": "./lib/index.js", @@ -34,7 +34,7 @@ "dependencies": { "@thi.ng/api": "^5.0.2", "@thi.ng/binary": "^1.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2" }, "keywords": [ diff --git a/packages/matrices/CHANGELOG.md b/packages/matrices/CHANGELOG.md index 913c853714..7fd59464c4 100644 --- a/packages/matrices/CHANGELOG.md +++ b/packages/matrices/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/matrices@0.1.3...@thi.ng/matrices@0.1.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/matrices + + + + + ## [0.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/matrices@0.1.2...@thi.ng/matrices@0.1.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/matrices diff --git a/packages/matrices/package.json b/packages/matrices/package.json index c0779719ad..c8b25092bb 100644 --- a/packages/matrices/package.json +++ b/packages/matrices/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/matrices", - "version": "0.1.3", + "version": "0.1.4", "description": "Matrix & quaternion operations for 2D/3D geometry processing", "module": "./index.js", "main": "./lib/index.js", @@ -33,9 +33,9 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2D", diff --git a/packages/paths/CHANGELOG.md b/packages/paths/CHANGELOG.md index 858010759e..80b7aaaead 100644 --- a/packages/paths/CHANGELOG.md +++ b/packages/paths/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/paths@2.0.2...@thi.ng/paths@2.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/paths + + + + + ## [2.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/paths@2.0.1...@thi.ng/paths@2.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/paths diff --git a/packages/paths/package.json b/packages/paths/package.json index c69e5c0471..7855732bf8 100644 --- a/packages/paths/package.json +++ b/packages/paths/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/paths", - "version": "2.0.2", + "version": "2.0.3", "description": "immutable, optimized path-based object property / array accessors", "module": "./index.js", "main": "./lib/index.js", @@ -32,7 +32,7 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2" }, "keywords": [ diff --git a/packages/pointfree-lang/CHANGELOG.md b/packages/pointfree-lang/CHANGELOG.md index 10cfd68253..3d116e8d2b 100644 --- a/packages/pointfree-lang/CHANGELOG.md +++ b/packages/pointfree-lang/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree-lang@1.0.2...@thi.ng/pointfree-lang@1.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/pointfree-lang + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree-lang@1.0.1...@thi.ng/pointfree-lang@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/pointfree-lang diff --git a/packages/pointfree-lang/package.json b/packages/pointfree-lang/package.json index 8476afc9d3..3a0d0c7963 100644 --- a/packages/pointfree-lang/package.json +++ b/packages/pointfree-lang/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/pointfree-lang", - "version": "1.0.2", + "version": "1.0.3", "description": "Forth style syntax layer/compiler for the @thi.ng/pointfree DSL", "module": "./index.js", "main": "./lib/index.js", @@ -36,7 +36,7 @@ "dependencies": { "@thi.ng/api": "^5.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/pointfree": "^1.0.2" + "@thi.ng/pointfree": "^1.0.3" }, "keywords": [ "concatenative", diff --git a/packages/pointfree/CHANGELOG.md b/packages/pointfree/CHANGELOG.md index 7ad897310a..4497dbafd1 100644 --- a/packages/pointfree/CHANGELOG.md +++ b/packages/pointfree/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree@1.0.2...@thi.ng/pointfree@1.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/pointfree + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree@1.0.1...@thi.ng/pointfree@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/pointfree diff --git a/packages/pointfree/package.json b/packages/pointfree/package.json index bf0c60284f..3b6ae4dab8 100644 --- a/packages/pointfree/package.json +++ b/packages/pointfree/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/pointfree", - "version": "1.0.2", + "version": "1.0.3", "description": "Pointfree functional composition / Forth style stack execution engine", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/compose": "^1.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2" diff --git a/packages/poisson/CHANGELOG.md b/packages/poisson/CHANGELOG.md index a379a23a56..5abb8f98f4 100644 --- a/packages/poisson/CHANGELOG.md +++ b/packages/poisson/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/poisson@0.2.0...@thi.ng/poisson@0.2.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/poisson + + + + + # [0.2.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/poisson@0.1.2...@thi.ng/poisson@0.2.0) (2019-02-05) diff --git a/packages/poisson/package.json b/packages/poisson/package.json index 5f59bb1c3c..5f3b69be2c 100644 --- a/packages/poisson/package.json +++ b/packages/poisson/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/poisson", - "version": "0.2.0", + "version": "0.2.1", "description": "nD Poisson-disc sampling w/ support for spatial density functions and custom PRNGs", "module": "./index.js", "main": "./lib/index.js", @@ -32,10 +32,10 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", - "@thi.ng/geom-api": "^0.1.0", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/geom-api": "^0.1.1", "@thi.ng/random": "^1.0.2", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "2d", diff --git a/packages/range-coder/CHANGELOG.md b/packages/range-coder/CHANGELOG.md index 399baf03b2..ccd04e9b35 100644 --- a/packages/range-coder/CHANGELOG.md +++ b/packages/range-coder/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@1.0.3...@thi.ng/range-coder@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/range-coder + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@1.0.2...@thi.ng/range-coder@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/range-coder diff --git a/packages/range-coder/package.json b/packages/range-coder/package.json index 9b42703331..1a10bdc567 100644 --- a/packages/range-coder/package.json +++ b/packages/range-coder/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/range-coder", - "version": "1.0.3", + "version": "1.0.4", "description": "Binary data range encoder / decoder", "module": "./index.js", "main": "./lib/index.js", @@ -24,7 +24,7 @@ "pub": "yarn build && yarn publish --access public" }, "devDependencies": { - "@thi.ng/transducers": "^4.0.0", + "@thi.ng/transducers": "^4.0.1", "@types/mocha": "^5.2.5", "@types/node": "^10.12.15", "mocha": "^5.2.0", diff --git a/packages/resolve-map/CHANGELOG.md b/packages/resolve-map/CHANGELOG.md index 7295b268e5..8c37dfc990 100644 --- a/packages/resolve-map/CHANGELOG.md +++ b/packages/resolve-map/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/resolve-map@4.0.2...@thi.ng/resolve-map@4.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/resolve-map + + + + + ## [4.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/resolve-map@4.0.1...@thi.ng/resolve-map@4.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/resolve-map diff --git a/packages/resolve-map/package.json b/packages/resolve-map/package.json index 1343c34d5c..04539b8bb0 100644 --- a/packages/resolve-map/package.json +++ b/packages/resolve-map/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/resolve-map", - "version": "4.0.2", + "version": "4.0.3", "description": "DAG resolution of vanilla objects & arrays with internally linked values", "module": "./index.js", "main": "./lib/index.js", @@ -32,9 +32,9 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", - "@thi.ng/paths": "^2.0.2" + "@thi.ng/paths": "^2.0.3" }, "keywords": [ "configuration", diff --git a/packages/router/CHANGELOG.md b/packages/router/CHANGELOG.md index 5800608d25..58c42a4f21 100644 --- a/packages/router/CHANGELOG.md +++ b/packages/router/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/router@1.0.2...@thi.ng/router@1.0.3) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/router + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/router@1.0.1...@thi.ng/router@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/router diff --git a/packages/router/package.json b/packages/router/package.json index 900e4a50ad..bd05fef14d 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/router", - "version": "1.0.2", + "version": "1.0.3", "description": "Generic router for browser & non-browser based applications", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2" }, diff --git a/packages/rstream-csp/CHANGELOG.md b/packages/rstream-csp/CHANGELOG.md index 1428d964a8..3d0037ae37 100644 --- a/packages/rstream-csp/CHANGELOG.md +++ b/packages/rstream-csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@1.0.3...@thi.ng/rstream-csp@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/rstream-csp + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@1.0.2...@thi.ng/rstream-csp@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/rstream-csp diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 79d18e49fd..6f2c918e2d 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-csp", - "version": "1.0.3", + "version": "1.0.4", "description": "@thi.ng/csp bridge module for @thi.ng/rstream", "module": "./index.js", "main": "./lib/index.js", @@ -32,8 +32,8 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/csp": "^1.0.3", - "@thi.ng/rstream": "^2.0.3" + "@thi.ng/csp": "^1.0.4", + "@thi.ng/rstream": "^2.0.4" }, "keywords": [ "bridge", diff --git a/packages/rstream-dot/CHANGELOG.md b/packages/rstream-dot/CHANGELOG.md index 5be53ee0bc..4971e41921 100644 --- a/packages/rstream-dot/CHANGELOG.md +++ b/packages/rstream-dot/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@1.0.3...@thi.ng/rstream-dot@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/rstream-dot + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@1.0.2...@thi.ng/rstream-dot@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/rstream-dot diff --git a/packages/rstream-dot/package.json b/packages/rstream-dot/package.json index 8e16e2d151..c30bf976c4 100644 --- a/packages/rstream-dot/package.json +++ b/packages/rstream-dot/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-dot", - "version": "1.0.3", + "version": "1.0.4", "description": "Graphviz DOT conversion of @thi.ng/rstream dataflow graph topologies", "module": "./index.js", "main": "./lib/index.js", @@ -32,7 +32,7 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/rstream": "^2.0.3" + "@thi.ng/rstream": "^2.0.4" }, "keywords": [ "conversion", diff --git a/packages/rstream-gestures/CHANGELOG.md b/packages/rstream-gestures/CHANGELOG.md index 16dd58594f..953aad7e3e 100644 --- a/packages/rstream-gestures/CHANGELOG.md +++ b/packages/rstream-gestures/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@1.0.3...@thi.ng/rstream-gestures@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/rstream-gestures + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@1.0.2...@thi.ng/rstream-gestures@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/rstream-gestures diff --git a/packages/rstream-gestures/package.json b/packages/rstream-gestures/package.json index 9656aaf6a0..58cfcd7afd 100644 --- a/packages/rstream-gestures/package.json +++ b/packages/rstream-gestures/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-gestures", - "version": "1.0.3", + "version": "1.0.4", "description": "Unified mouse, mouse wheel & single-touch event stream abstraction", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/rstream": "^2.0.3", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/rstream": "^2.0.4", + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "dataflow", diff --git a/packages/rstream-graph/CHANGELOG.md b/packages/rstream-graph/CHANGELOG.md index 140199259c..fb45f5c744 100644 --- a/packages/rstream-graph/CHANGELOG.md +++ b/packages/rstream-graph/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@3.0.3...@thi.ng/rstream-graph@3.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/rstream-graph + + + + + ## [3.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@3.0.2...@thi.ng/rstream-graph@3.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/rstream-graph diff --git a/packages/rstream-graph/package.json b/packages/rstream-graph/package.json index 8acd6fde68..028d3dce2b 100644 --- a/packages/rstream-graph/package.json +++ b/packages/rstream-graph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-graph", - "version": "3.0.3", + "version": "3.0.4", "description": "Declarative dataflow graph construction for @thi.ng/rstream", "module": "./index.js", "main": "./lib/index.js", @@ -33,12 +33,12 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", - "@thi.ng/paths": "^2.0.2", - "@thi.ng/resolve-map": "^4.0.2", - "@thi.ng/rstream": "^2.0.3", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/paths": "^2.0.3", + "@thi.ng/resolve-map": "^4.0.3", + "@thi.ng/rstream": "^2.0.4", + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "compute", diff --git a/packages/rstream-log/CHANGELOG.md b/packages/rstream-log/CHANGELOG.md index 19fca79623..181f5ce841 100644 --- a/packages/rstream-log/CHANGELOG.md +++ b/packages/rstream-log/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@2.0.3...@thi.ng/rstream-log@2.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/rstream-log + + + + + ## [2.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@2.0.2...@thi.ng/rstream-log@2.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/rstream-log diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index eb5c1a9f83..fcd51e4bd5 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-log", - "version": "2.0.3", + "version": "2.0.4", "description": "Structured, multilevel & hierarchical loggers based on @thi.ng/rstream", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", - "@thi.ng/rstream": "^2.0.3", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/rstream": "^2.0.4", + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "ES6", diff --git a/packages/rstream-query/CHANGELOG.md b/packages/rstream-query/CHANGELOG.md index a5fd6d905f..f569c6ab8d 100644 --- a/packages/rstream-query/CHANGELOG.md +++ b/packages/rstream-query/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@1.0.3...@thi.ng/rstream-query@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/rstream-query + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@1.0.2...@thi.ng/rstream-query@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/rstream-query diff --git a/packages/rstream-query/package.json b/packages/rstream-query/package.json index c2835ff4e2..f41854491a 100644 --- a/packages/rstream-query/package.json +++ b/packages/rstream-query/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-query", - "version": "1.0.3", + "version": "1.0.4", "description": "@thi.ng/rstream based triple store & reactive query engine", "module": "./index.js", "main": "./lib/index.js", @@ -33,13 +33,13 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/associative": "^1.0.3", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/associative": "^1.0.4", + "@thi.ng/checks": "^2.1.0", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/rstream": "^2.0.3", - "@thi.ng/rstream-dot": "^1.0.3", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/rstream": "^2.0.4", + "@thi.ng/rstream-dot": "^1.0.4", + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "dataflow", diff --git a/packages/rstream/CHANGELOG.md b/packages/rstream/CHANGELOG.md index 7d9e7f1201..96f32eaaaf 100644 --- a/packages/rstream/CHANGELOG.md +++ b/packages/rstream/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@2.0.3...@thi.ng/rstream@2.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/rstream + + + + + ## [2.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@2.0.2...@thi.ng/rstream@2.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/rstream diff --git a/packages/rstream/package.json b/packages/rstream/package.json index e81b3bebb5..a0dff60f02 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream", - "version": "2.0.3", + "version": "2.0.4", "description": "Reactive multi-tap streams, dataflow & transformation pipeline constructs", "module": "./index.js", "main": "./lib/index.js", @@ -33,12 +33,12 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/associative": "^1.0.3", - "@thi.ng/atom": "^2.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/associative": "^1.0.4", + "@thi.ng/atom": "^2.0.3", + "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", - "@thi.ng/paths": "^2.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/paths": "^2.0.3", + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "datastructure", diff --git a/packages/sax/CHANGELOG.md b/packages/sax/CHANGELOG.md index 52319c7441..214e0bc157 100644 --- a/packages/sax/CHANGELOG.md +++ b/packages/sax/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@1.0.3...@thi.ng/sax@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/sax + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@1.0.2...@thi.ng/sax@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/sax diff --git a/packages/sax/package.json b/packages/sax/package.json index f2d702c0bb..d4b7873e7f 100644 --- a/packages/sax/package.json +++ b/packages/sax/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/sax", - "version": "1.0.3", + "version": "1.0.4", "description": "Transducer-based, SAX-like, non-validating, speedy & tiny XML parser", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/transducers": "^4.0.0", - "@thi.ng/transducers-fsm": "^1.0.3" + "@thi.ng/transducers": "^4.0.1", + "@thi.ng/transducers-fsm": "^1.0.4" }, "keywords": [ "ES6", diff --git a/packages/transducers-binary/CHANGELOG.md b/packages/transducers-binary/CHANGELOG.md index a82fc17903..79c48288f1 100644 --- a/packages/transducers-binary/CHANGELOG.md +++ b/packages/transducers-binary/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-binary@0.1.0...@thi.ng/transducers-binary@0.1.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/transducers-binary + + + + + # 0.1.0 (2019-02-05) diff --git a/packages/transducers-binary/package.json b/packages/transducers-binary/package.json index 849ec5529f..cff3b38638 100644 --- a/packages/transducers-binary/package.json +++ b/packages/transducers-binary/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-binary", - "version": "0.1.0", + "version": "0.1.1", "description": "TODO", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/strings": "^1.0.3", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "base64", diff --git a/packages/transducers-fsm/CHANGELOG.md b/packages/transducers-fsm/CHANGELOG.md index 647193537e..98a4d8a0dd 100644 --- a/packages/transducers-fsm/CHANGELOG.md +++ b/packages/transducers-fsm/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@1.0.3...@thi.ng/transducers-fsm@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/transducers-fsm + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@1.0.2...@thi.ng/transducers-fsm@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/transducers-fsm diff --git a/packages/transducers-fsm/package.json b/packages/transducers-fsm/package.json index 192515030f..5bf3d6ba55 100644 --- a/packages/transducers-fsm/package.json +++ b/packages/transducers-fsm/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-fsm", - "version": "1.0.3", + "version": "1.0.4", "description": "Transducer-based Finite State Machine transformer", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "ES6", diff --git a/packages/transducers-hdom/CHANGELOG.md b/packages/transducers-hdom/CHANGELOG.md index cc88740393..6d4c29196b 100644 --- a/packages/transducers-hdom/CHANGELOG.md +++ b/packages/transducers-hdom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@2.0.3...@thi.ng/transducers-hdom@2.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/transducers-hdom + + + + + ## [2.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@2.0.2...@thi.ng/transducers-hdom@2.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/transducers-hdom diff --git a/packages/transducers-hdom/package.json b/packages/transducers-hdom/package.json index 1e197208db..4b748a510a 100644 --- a/packages/transducers-hdom/package.json +++ b/packages/transducers-hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-hdom", - "version": "2.0.3", + "version": "2.0.4", "description": "Transducer based UI updater for @thi.ng/hdom", "module": "./index.js", "main": "./lib/index.js", @@ -32,9 +32,9 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/hdom": "^7.0.2", - "@thi.ng/hiccup": "^3.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/hdom": "^7.1.0", + "@thi.ng/hiccup": "^3.0.3", + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "diff", diff --git a/packages/transducers-stats/CHANGELOG.md b/packages/transducers-stats/CHANGELOG.md index 5af97d3f1f..ec820d92d8 100644 --- a/packages/transducers-stats/CHANGELOG.md +++ b/packages/transducers-stats/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@1.0.3...@thi.ng/transducers-stats@1.0.4) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/transducers-stats + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@1.0.2...@thi.ng/transducers-stats@1.0.3) (2019-02-05) **Note:** Version bump only for package @thi.ng/transducers-stats diff --git a/packages/transducers-stats/package.json b/packages/transducers-stats/package.json index 5a1c542525..15b629d2d1 100644 --- a/packages/transducers-stats/package.json +++ b/packages/transducers-stats/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-stats", - "version": "1.0.3", + "version": "1.0.4", "description": "Transducers for statistical / technical analysis", "module": "./index.js", "main": "./lib/index.js", @@ -32,10 +32,10 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/checks": "^2.0.2", - "@thi.ng/dcons": "^2.0.3", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/dcons": "^2.0.4", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "ES6", diff --git a/packages/transducers/CHANGELOG.md b/packages/transducers/CHANGELOG.md index 35b56abac7..ac27efd5a3 100644 --- a/packages/transducers/CHANGELOG.md +++ b/packages/transducers/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.0.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@4.0.0...@thi.ng/transducers@4.0.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/transducers + + + + + # [4.0.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@3.0.2...@thi.ng/transducers@4.0.0) (2019-02-05) diff --git a/packages/transducers/package.json b/packages/transducers/package.json index 16d667712c..1293f85add 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers", - "version": "4.0.0", + "version": "4.0.1", "description": "Lightweight transducer implementations for ES6 / TypeScript", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/compare": "^1.0.2", "@thi.ng/compose": "^1.0.2", "@thi.ng/equiv": "^1.0.2", diff --git a/packages/vector-pools/CHANGELOG.md b/packages/vector-pools/CHANGELOG.md index ea360bcc41..36189f8b44 100644 --- a/packages/vector-pools/CHANGELOG.md +++ b/packages/vector-pools/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/vector-pools@0.2.0...@thi.ng/vector-pools@0.2.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/vector-pools + + + + + # [0.2.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/vector-pools@0.1.2...@thi.ng/vector-pools@0.2.0) (2019-02-05) diff --git a/packages/vector-pools/package.json b/packages/vector-pools/package.json index 89446b5be5..5f522f6c4f 100644 --- a/packages/vector-pools/package.json +++ b/packages/vector-pools/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/vector-pools", - "version": "0.2.0", + "version": "0.2.1", "description": "TODO", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/malloc": "^2.0.0", - "@thi.ng/vectors": "^2.2.0" + "@thi.ng/malloc": "^2.0.1", + "@thi.ng/vectors": "^2.2.1" }, "keywords": [ "ES6", diff --git a/packages/vectors/CHANGELOG.md b/packages/vectors/CHANGELOG.md index 084f7d3511..25b808764d 100644 --- a/packages/vectors/CHANGELOG.md +++ b/packages/vectors/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/vectors@2.2.0...@thi.ng/vectors@2.2.1) (2019-02-10) + +**Note:** Version bump only for package @thi.ng/vectors + + + + + # [2.2.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/vectors@2.1.1...@thi.ng/vectors@2.2.0) (2019-02-05) diff --git a/packages/vectors/package.json b/packages/vectors/package.json index 2a89d58ce0..d5c848e7f5 100644 --- a/packages/vectors/package.json +++ b/packages/vectors/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/vectors", - "version": "2.2.0", + "version": "2.2.1", "description": "Optimized 2d/3d/4d and arbitrary length vector operations", "module": "./index.js", "main": "./lib/index.js", @@ -33,13 +33,13 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/checks": "^2.0.2", + "@thi.ng/checks": "^2.1.0", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", "@thi.ng/math": "^1.1.0", "@thi.ng/memoize": "^1.0.2", "@thi.ng/random": "^1.0.2", - "@thi.ng/transducers": "^4.0.0" + "@thi.ng/transducers": "^4.0.1" }, "keywords": [ "2D", From 763d7b967d2970f1e46a26ea9dee6daa4994022f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Mon, 11 Feb 2019 13:32:03 +0000 Subject: [PATCH 11/43] perf(geom-isoline): flatten LUTs, manual destructure --- packages/geom-isoline/src/index.ts | 64 ++++++++++++++++-------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/packages/geom-isoline/src/index.ts b/packages/geom-isoline/src/index.ts index 5e49507adf..7f35d4d2a7 100644 --- a/packages/geom-isoline/src/index.ts +++ b/packages/geom-isoline/src/index.ts @@ -1,17 +1,21 @@ import { range2d } from "@thi.ng/transducers"; import { ReadonlyVec, Vec } from "@thi.ng/vectors"; +// flattened [to,clear] tuples +// all positive values are given as times 2 const EDGE_INDEX = [ - [-1, -1], [2, 0], [1, 0], [1, 0], - [0, 0], [-1, -1], [0, 0], [0, 0], - [3, 0], [2, 0], [-1, -1], [1, 0], - [3, 0], [2, 0], [3, 0], [-1, -1] + -1, -1, 4, 0, 2, 0, 2, 0, + 0, 0, -1, -1, 0, 0, 0, 0, + 6, 0, 4, 0, -1, -1, 2, 0, + 6, 0, 4, 0, 6, 0, -1, -1 ]; -const NEXT_EDGES = [[-1, 0], [0, 1], [1, 0], [0, -1]]; +// flattened coord offsets [x,y] tuples +const NEXT_EDGES = [0, -1, 1, 0, 0, 1, -1, 0]; -const S5 = [[2, 4], [0, 1], [0, 13], [2, 7]]; -const S10 = [[3, 2], [1, 8], [3, 11], [1, 14]]; +// flattened [to,clear] tuples (all values times 2) +const S5 = [4, 8, 0, 2, 0, 26, 4, 14]; +const S10 = [6, 4, 2, 16, 6, 22, 2, 28]; export const setBorder = (src: Vec, w: number, h: number, val: number) => { @@ -36,10 +40,10 @@ const encodeCrossings = for (let y = 0, i = 0; y < h1; y++) { for (let x = 0; x < w1; i++ , x++) { out[i] = - (src[i] < iso ? 8 : 0) | - (src[i + 1] < iso ? 4 : 0) | - (src[i + 1 + w] < iso ? 2 : 0) | - (src[i + w] < iso ? 1 : 0); + (src[i] < iso ? 16 : 0) | + (src[i + 1] < iso ? 8 : 0) | + (src[i + 1 + w] < iso ? 4 : 0) | + (src[i + w] < iso ? 2 : 0); } i++; } @@ -81,11 +85,11 @@ const contourVertex = ( switch (to) { case 0: return [x + mix(src, w, x, y, x + 1, y, iso), y]; - case 1: - return [x + 1, y + mix(src, w, x + 1, y, x + 1, y + 1, iso)]; case 2: + return [x + 1, y + mix(src, w, x + 1, y, x + 1, y + 1, iso)]; + case 4: return [x + mix(src, w, x, y + 1, x + 1, y + 1, iso), y + 1]; - case 3: + case 6: return [x, y + mix(src, w, x, y, x, y + 1, iso)]; default: } @@ -103,6 +107,7 @@ export function* isolines(src: ReadonlyVec, w: number, h: number, iso: number) { const h1 = h - 1; const cells = range2d(h, w); let next: boolean = true; + let idx: number; while (true) { from = to; if (next) { @@ -116,20 +121,21 @@ export function* isolines(src: ReadonlyVec, w: number, h: number, iso: number) { continue; } const i = y * w + x; - const id = coded[i]; - if (id === 5) { - [to, clear] = S5[ - (cellValue(src, w, i) > iso ? 0 : 2) + - (from === 3 ? 0 : 1) - ]; - } else if (id === 10) { - [to, clear] = S10[ - cellValue(src, w, i) > iso ? - (from === 0 ? 0 : 1) : - (from === 2 ? 2 : 3) - ]; + const id = coded[i]; // * 2 + if (id === 10) { + idx = (cellValue(src, w, i) > iso ? 0 : 4) + + (from === 6 ? 0 : 2); + to = S5[idx]; + clear = S5[idx + 1]; + } else if (id === 20) { + idx = cellValue(src, w, i) > iso ? + (from === 0 ? 0 : 2) : + (from === 4 ? 4 : 6); + to = S10[idx]; + clear = S10[idx + 1]; } else { - [to, clear] = EDGE_INDEX[id]; + to = EDGE_INDEX[id]; + clear = EDGE_INDEX[id + 1]; } if (curr.length > 0 && from === -1 && to > -1) { yield curr; @@ -140,8 +146,8 @@ export function* isolines(src: ReadonlyVec, w: number, h: number, iso: number) { } if (to >= 0) { curr.push(contourVertex(src, w, x, y, to, iso)); - y += NEXT_EDGES[to][0]; - x += NEXT_EDGES[to][1]; + x += NEXT_EDGES[to]; + y += NEXT_EDGES[to + 1]; } else { next = true; } From 827588a2119a95d91dd67e84a86243cced383e8d Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Mon, 11 Feb 2019 13:37:20 +0000 Subject: [PATCH 12/43] Publish - @thi.ng/geom-isoline@0.1.2 --- packages/geom-isoline/CHANGELOG.md | 11 +++++++++++ packages/geom-isoline/package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/geom-isoline/CHANGELOG.md b/packages/geom-isoline/CHANGELOG.md index 5b57bd244c..a01c515907 100644 --- a/packages/geom-isoline/CHANGELOG.md +++ b/packages/geom-isoline/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-isoline@0.1.1...@thi.ng/geom-isoline@0.1.2) (2019-02-11) + + +### Performance Improvements + +* **geom-isoline:** flatten LUTs, manual destructure ([763d7b9](https://github.com/thi-ng/umbrella/commit/763d7b9)) + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-isoline@0.1.0...@thi.ng/geom-isoline@0.1.1) (2019-02-10) diff --git a/packages/geom-isoline/package.json b/packages/geom-isoline/package.json index 5c66551520..9939932ecc 100644 --- a/packages/geom-isoline/package.json +++ b/packages/geom-isoline/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-isoline", - "version": "0.1.1", + "version": "0.1.2", "description": "Fast 2D contour line extraction / generation", "module": "./index.js", "main": "./lib/index.js", From 7cf98efc392fc5dc6b9d28c7c2dfa5c7429f48a2 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 02:52:44 +0000 Subject: [PATCH 13/43] feat(transducers-binary): add utf8Length() --- packages/transducers-binary/src/utf8.ts | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/transducers-binary/src/utf8.ts b/packages/transducers-binary/src/utf8.ts index 26534f462e..60a6d9603f 100644 --- a/packages/transducers-binary/src/utf8.ts +++ b/packages/transducers-binary/src/utf8.ts @@ -153,3 +153,29 @@ const codePoint = (x) => x < 0x10000 ? String.fromCharCode(x) : (x -= 0x10000, String.fromCharCode(0xd800 | (x >> 10), 0xdc00 | (x & 0x3ff))); + +export const utf8Length = + (str: string) => { + const n = str.length; + let len = 0; + for (let i = 0; i < n; ++i) { + let u = str.charCodeAt(i); + if (u >= 0xd800 && u <= 0xdfff) { + u = 0x10000 + ((u & 0x3ff) << 10) | (str.charCodeAt(++i) & 0x3ff); + } + if (u <= 0x7f) { + len++; + } else if (u <= 0x7ff) { + len += 2; + } else if (u <= 0xffff) { + len += 3; + } else if (u <= 0x1fffff) { + len += 4; + } else if (u <= 0x3ffffff) { + len += 5; + } else { + len += 6; + } + } + return len; + }; From aeb05f8f959508c75a9b592ac9ac722226ac3d4e Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 02:57:47 +0000 Subject: [PATCH 14/43] feat(fsm): update / split until() BREAKING CHANGE: make until() array based, add untilStr() - rename existing `until()` => `untilStr()` --- packages/fsm/src/until.ts | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/fsm/src/until.ts b/packages/fsm/src/until.ts index 5f1588c632..399bac6f25 100644 --- a/packages/fsm/src/until.ts +++ b/packages/fsm/src/until.ts @@ -7,10 +7,12 @@ import { result } from "./result"; * recorded so far (excluding the matched terminator string) and returns * `Match.FULL` result. Else `Match.PARTIAL`. * + * @see until + * * @param str * @param callback */ -export const until = ( +export const untilStr = ( str: string, callback?: LitCallback ): Matcher => @@ -23,3 +25,38 @@ export const until = ( RES_PARTIAL; }; }; + +/** + * Generic array version of `untilStr()`. + * + * @see untilStr + * + * @param str + * @param callback + */ +export const until = ( + str: T[], + callback?: LitCallback +): Matcher => + () => { + let buf: T[] = []; + return (ctx, x) => { + buf.push(x); + return endsWith(buf, str) ? + result(callback && callback(ctx, buf.slice(0, buf.length - str.length))) : + RES_PARTIAL; + }; + }; + +const endsWith = + (src: any[], needle: any[]) => { + let i = src.length; + let j = needle.length; + if (i < j) return false; + for (; --i, --j >= 0;) { + if (src[i] !== needle[j]) { + return false; + } + } + return true; + }; From e8cd24227d859700716b61fbafe1680ef998b3a0 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 02:58:29 +0000 Subject: [PATCH 15/43] refactor(hiccup-markdown): update fsm until() usage --- packages/hiccup-markdown/src/parse.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/hiccup-markdown/src/parse.ts b/packages/hiccup-markdown/src/parse.ts index 937537c9e8..359288c269 100644 --- a/packages/hiccup-markdown/src/parse.ts +++ b/packages/hiccup-markdown/src/parse.ts @@ -6,7 +6,7 @@ import { ResultBody, seq, str, - until, + untilStr, whitespace } from "@thi.ng/fsm"; import { peek } from "@thi.ng/transducers"; @@ -217,9 +217,9 @@ const matchLink = (result: (href, body) => any[]) => seq( [ - until(LINK_LABEL_END, (ctx, body) => (ctx.title = body, null)), + untilStr(LINK_LABEL_END, (ctx, body) => (ctx.title = body, null)), str(LINK_HREF), - until(LINK_HREF_END, (ctx, body) => (ctx.href = body, null)), + untilStr(LINK_HREF_END, (ctx, body) => (ctx.href = body, null)), ], pop((ctx) => result(ctx.href, ctx.title)) ); @@ -343,10 +343,10 @@ export const parse = (tags?: Partial) => { ), [State.START_CODEBLOCK]: - until(NL, (ctx, lang) => (ctx.lang = lang, [State.CODEBLOCK])), + untilStr(NL, (ctx, lang) => (ctx.lang = lang, [State.CODEBLOCK])), [State.CODEBLOCK]: - until(CODEBLOCK_END, collectCodeBlock(tags.codeblock)), + untilStr(CODEBLOCK_END, collectCodeBlock(tags.codeblock)), [State.LI]: matchPara(State.LI, State.END_LI), @@ -367,16 +367,16 @@ export const parse = (tags?: Partial) => { matchLink(tags.img), [State.STRONG]: - until(STRONG, collectInline(tags.strong)), + untilStr(STRONG, collectInline(tags.strong)), [State.STRIKE]: - until(STRIKE, collectInline(tags.strike)), + untilStr(STRIKE, collectInline(tags.strike)), [State.EMPHASIS]: - until(EM, collectInline(tags.em)), + untilStr(EM, collectInline(tags.em)), [State.CODE]: - until(CODE, collectInline(tags.code)), + untilStr(CODE, collectInline(tags.code)), [State.TABLE]: alts( From c1bbc6f631af584c5ec91f9e5f90e0f83b9a7b77 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 03:00:13 +0000 Subject: [PATCH 16/43] feat(bencode): add decode(), fix string length handling - add decode() w/ opt utf8 string decoding - use utf8Length() for string encoding --- packages/bencode/package.json | 3 +- packages/bencode/src/index.ts | 159 +++++++++++++++++++++++++++++++++- 2 files changed, 157 insertions(+), 5 deletions(-) diff --git a/packages/bencode/package.json b/packages/bencode/package.json index 5fe1a242b1..5ba528123b 100644 --- a/packages/bencode/package.json +++ b/packages/bencode/package.json @@ -35,6 +35,7 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", "@thi.ng/defmulti": "^1.0.2", + "@thi.ng/errors": "^1.0.2", "@thi.ng/transducers": "^4.0.1", "@thi.ng/transducers-binary": "^0.1.1" }, @@ -52,4 +53,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/bencode/src/index.ts b/packages/bencode/src/index.ts index ea990295e1..aa2b5c8b45 100644 --- a/packages/bencode/src/index.ts +++ b/packages/bencode/src/index.ts @@ -1,19 +1,23 @@ import { assert } from "@thi.ng/api"; import { + isArray, isArrayLike, isBoolean, isNumber, isPlainObject, - isString, + isString } from "@thi.ng/checks"; import { defmulti } from "@thi.ng/defmulti"; -import { mapcat } from "@thi.ng/transducers"; +import { illegalState } from "@thi.ng/errors"; +import { mapcat, peek } from "@thi.ng/transducers"; import { BinStructItem, bytes, str, u8, - u8array + u8array, + utf8Decode, + utf8Length } from "@thi.ng/transducers-binary"; const enum Type { @@ -25,6 +29,19 @@ const enum Type { LIST }; +const enum Lit { + MINUS = 0x2d, + DOT = 0x2e, + ZERO = 0x30, + NINE = 0x39, + COLON = 0x3a, + DICT = 0x64, + END = 0x65, + FLOAT = 0x66, + INT = 0x69, + LIST = 0x6c, +} + const FLOAT_RE = /^[0-9.-]+$/; export const encode = (x: any, cap = 1024) => @@ -66,7 +83,7 @@ encodeBin.addAll({ [Type.STR]: (x: string) => - [str(x.length + ":" + x)], + [str(utf8Length(x) + ":" + x)], [Type.LIST]: (x: Iterable) => @@ -81,3 +98,137 @@ encodeBin.addAll({ u8(0x65) ] }); + +export const decode = + (buf: Iterable, utf8 = true) => { + const iter = buf[Symbol.iterator](); + const stack = []; + let i: IteratorResult; + let x: any; + while (!(i = iter.next()).done) { + x = i.value; + switch (x) { + case Lit.DICT: + ensureNotKey(stack, "dict"); + stack.push({ type: Type.DICT, val: {} }); + break; + case Lit.LIST: + ensureNotKey(stack, "list"); + stack.push({ type: Type.LIST, val: [] }); + break; + case Lit.INT: + x = collect(stack, readInt(iter, 0)); + if (x !== undefined) { + return x; + } + break; + case Lit.FLOAT: + x = collect(stack, readFloat(iter)); + if (x !== undefined) { + return x; + } + break; + case Lit.END: + x = stack.pop(); + if (x) { + const parent = peek(stack); + if (parent) { + if (parent.type === Type.LIST) { + parent.val.push(x.val); + } else if (parent.type === Type.DICT) { + parent.val[parent.key] = x.val; + parent.key = null; + } + } else { + return x.val; + } + } else { + illegalState("unmatched end literal"); + } + break; + default: + if (x >= Lit.ZERO && x <= Lit.NINE) { + x = readBytes(iter, readInt(iter, x - Lit.ZERO, Lit.COLON)); + x = collect(stack, x, utf8); + if (x !== undefined) { + return x; + } + } else { + illegalState(`unexpected value type: 0x${i.value.toString(16)}`); + } + } + } + return peek(stack).val; + }; + +const ensureNotKey = + (stack: any[], type: string) => { + const x = peek(stack); + assert( + !x || x.type !== Type.DICT || x.key, + type + " not supported as dict key" + ); + }; + +const collect = + (stack: any[], x: any, utf8 = false) => { + const parent = peek(stack); + if (!parent) return x; + if (parent.type === Type.LIST) { + parent.val.push(x); + } else { + if (!parent.key) { + parent.key = isArray(x) ? utf8Decode(x) : x; + } else { + parent.val[parent.key] = utf8 ? utf8Decode(x) : x; + parent.key = null; + } + } + }; + +const readInt = + (iter: Iterator, acc: number, end = Lit.END) => { + let i: IteratorResult; + let x: number; + while (!(i = iter.next()).done) { + x = i.value; + if (x >= Lit.ZERO && x <= Lit.NINE) { + acc = acc * 10 + x - Lit.ZERO; + } else if (x === end) { + return acc; + } else { + illegalState(`expected digit, got 0x${x.toString(16)}`); + } + } + illegalState(`incomplete int`); + }; + +const readFloat = + (iter: Iterator) => { + let i: IteratorResult; + let x: number; + let acc = ""; + while (!(i = iter.next()).done) { + x = i.value; + if ((x >= Lit.ZERO && x <= Lit.NINE) || x === Lit.DOT || x === Lit.MINUS) { + acc += String.fromCharCode(x); + } else if (x === Lit.END) { + return parseFloat(acc); + } else { + illegalState(`expected digit or dot, got 0x${x.toString(16)}`); + } + } + illegalState(`incomplete float`); + }; + +const readBytes = + (iter: Iterator, len: number) => { + let i: IteratorResult; + let buf: number[] = []; + while (--len >= 0 && !(i = iter.next()).done) { + buf.push(i.value); + } + return len < 0 ? + buf : + illegalState(`expected string, reached EOF`); + }; From 361ba37309c276412257c3b84c8377ff4be1378c Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:37:04 +0000 Subject: [PATCH 17/43] feat(arrays): extract as new package --- packages/arrays/.npmignore | 12 ++ packages/arrays/LICENSE | 201 +++++++++++++++++++++++++ packages/arrays/README.md | 65 ++++++++ packages/arrays/package.json | 55 +++++++ packages/arrays/src/binary-search.ts | 41 +++++ packages/arrays/src/ends-with.ts | 10 ++ packages/arrays/src/ensure-array.ts | 18 +++ packages/arrays/src/ensure-iterable.ts | 9 ++ packages/arrays/src/fuzzy-match.ts | 44 ++++++ packages/arrays/src/index.ts | 9 ++ packages/arrays/src/peek.ts | 7 + packages/arrays/src/shuffle.ts | 17 +++ packages/arrays/src/starts-with.ts | 10 ++ packages/arrays/src/swizzle.ts | 55 +++++++ packages/arrays/test/index.ts | 6 + packages/arrays/test/tsconfig.json | 11 ++ packages/arrays/tsconfig.json | 11 ++ 17 files changed, 581 insertions(+) create mode 100644 packages/arrays/.npmignore create mode 100644 packages/arrays/LICENSE create mode 100644 packages/arrays/README.md create mode 100644 packages/arrays/package.json create mode 100644 packages/arrays/src/binary-search.ts create mode 100644 packages/arrays/src/ends-with.ts create mode 100644 packages/arrays/src/ensure-array.ts create mode 100644 packages/arrays/src/ensure-iterable.ts create mode 100644 packages/arrays/src/fuzzy-match.ts create mode 100644 packages/arrays/src/index.ts create mode 100644 packages/arrays/src/peek.ts create mode 100644 packages/arrays/src/shuffle.ts create mode 100644 packages/arrays/src/starts-with.ts create mode 100644 packages/arrays/src/swizzle.ts create mode 100644 packages/arrays/test/index.ts create mode 100644 packages/arrays/test/tsconfig.json create mode 100644 packages/arrays/tsconfig.json diff --git a/packages/arrays/.npmignore b/packages/arrays/.npmignore new file mode 100644 index 0000000000..74ea62d1fa --- /dev/null +++ b/packages/arrays/.npmignore @@ -0,0 +1,12 @@ +.meta +.nyc_output +*.html +*.tgz +build +coverage +dev +doc +export +src* +test +tsconfig.json diff --git a/packages/arrays/LICENSE b/packages/arrays/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/packages/arrays/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/arrays/README.md b/packages/arrays/README.md new file mode 100644 index 0000000000..1a1b2c16bc --- /dev/null +++ b/packages/arrays/README.md @@ -0,0 +1,65 @@ +# @thi.ng/arrays + +[![npm (scoped)](https://img.shields.io/npm/v/@thi.ng/arrays.svg)](https://www.npmjs.com/package/@thi.ng/arrays) +![npm downloads](https://img.shields.io/npm/dm/@thi.ng/arrays.svg) +[![Twitter Follow](https://img.shields.io/twitter/follow/thing_umbrella.svg?style=flat-square&label=twitter)](https://twitter.com/thing_umbrella) + +This project is part of the +[@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo. + + + +- [About](#about) +- [Installation](#installation) +- [Dependencies](#dependencies) +- [Usage examples](#usage-examples) +- [API](#api) +- [Authors](#authors) +- [License](#license) + + + +## About + +Array & ArrayLike utilities. + +## Installation + +```bash +yarn add @thi.ng/arrays +``` + +## Dependencies + +- [@thi.ng/api](https://github.com/thi-ng/umbrella/tree/master/packages/api) +- [@thi.ng/checks](https://github.com/thi-ng/umbrella/tree/master/packages/checks) +- [@thi.ng/compare](https://github.com/thi-ng/umbrella/tree/master/packages/compare) +- [@thi.ng/equiv](https://github.com/thi-ng/umbrella/tree/master/packages/equiv) +- [@thi.ng/errors](https://github.com/thi-ng/umbrella/tree/master/packages/errors) +- [@thi.ng/random](https://github.com/thi-ng/umbrella/tree/master/packages/random) + +## Usage examples + +```ts +import * as a from "@thi.ng/arrays"; +``` + +## API + +- [binarySearch()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/binary-search.ts) +- [endsWith()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/ends-with.ts) +- [ensureArray()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/ensure-array.ts) +- [ensureIterable()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/ensure-iterable.ts) +- [fuzzyMatch()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/fuzzy-match.ts) +- [peek()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/peek.ts) +- [shuffle()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/shuffle.ts) (w/ custom PRNG support) +- [startsWith()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/starts-with.ts) +- [swizzle()](https://github.com/thi-ng/umbrella/tree/master/packages/arrays/src/swizzle.ts) + +## Authors + +- Karsten Schmidt + +## License + +© 2018 Karsten Schmidt // Apache Software License 2.0 diff --git a/packages/arrays/package.json b/packages/arrays/package.json new file mode 100644 index 0000000000..3954409541 --- /dev/null +++ b/packages/arrays/package.json @@ -0,0 +1,55 @@ +{ + "name": "@thi.ng/arrays", + "version": "0.0.1", + "description": "Array / Arraylike utilities", + "module": "./index.js", + "main": "./lib/index.js", + "umd:main": "./lib/index.umd.js", + "typings": "./index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/thi-ng/umbrella.git" + }, + "homepage": "https://github.com/thi-ng/umbrella/tree/master/packages/arrays", + "author": "Karsten Schmidt ", + "license": "Apache-2.0", + "scripts": { + "build": "yarn clean && yarn build:es6 && yarn build:bundle", + "build:es6": "tsc --declaration", + "build:bundle": "../../scripts/bundle-module", + "test": "rimraf build && tsc -p test/tsconfig.json && nyc mocha build/test/*.js", + "clean": "rimraf *.js *.d.ts .nyc_output build coverage doc lib", + "cover": "yarn test && nyc report --reporter=lcov", + "doc": "node_modules/.bin/typedoc --mode modules --out doc src", + "pub": "yarn build && yarn publish --access public" + }, + "devDependencies": { + "@types/mocha": "^5.2.5", + "@types/node": "^10.12.15", + "mocha": "^5.2.0", + "nyc": "^13.1.0", + "typedoc": "^0.14.0", + "typescript": "^3.2.2" + }, + "dependencies": { + "@thi.ng/api": "^5.0.1", + "@thi.ng/checks": "^2.1.0", + "@thi.ng/compare": "^1.0.2", + "@thi.ng/equiv": "^1.0.2", + "@thi.ng/errors": "^1.0.2", + "@thi.ng/random": "^1.0.2" + }, + "keywords": [ + "arrays", + "binary search", + "ES6", + "fuzzy search", + "shuffle", + "swizzle", + "typescript" + ], + "publishConfig": { + "access": "public" + }, + "sideEffects": false +} \ No newline at end of file diff --git a/packages/arrays/src/binary-search.ts b/packages/arrays/src/binary-search.ts new file mode 100644 index 0000000000..5c94498386 --- /dev/null +++ b/packages/arrays/src/binary-search.ts @@ -0,0 +1,41 @@ +import { Comparator, Fn } from "@thi.ng/api"; +import { compare } from "@thi.ng/compare"; + +/** + * Returns the supposed index of `x` in pre-sorted array-like collection + * `buf`. If `x` can't be found, returns `-index-1`. + * + * The optional `key` function is used to obtain the actual sort value + * of `x` and each array item (default: identity). + * + * The optional `cmp` comparator (default: thi.ng/compare) is then used + * to identify the index of `x`. The sort order of `buf` MUST be + * compatible with that of `cmp`. + * + * @param x + * @param buf + * @param key + * @param cmp + */ +export const binarySearch = ( + x: A, + buf: ArrayLike, + key: Fn = (x) => x, + cmp: Comparator = compare, +) => { + const kx = key(x); + let low = 0; + let high = buf.length - 1; + while (low <= high) { + const mid = (low + high) >>> 1; + const c = cmp(key(buf[mid]), kx); + if (c < 0) { + low = mid + 1; + } else if (c > 0) { + high = mid - 1; + } else { + return mid; + } + } + return -low - 1; +}; diff --git a/packages/arrays/src/ends-with.ts b/packages/arrays/src/ends-with.ts new file mode 100644 index 0000000000..7c60368fc2 --- /dev/null +++ b/packages/arrays/src/ends-with.ts @@ -0,0 +1,10 @@ +import { equiv as _eq } from "@thi.ng/equiv"; + +export const endsWith = + (buf: ArrayLike, needle: ArrayLike, equiv = _eq) => { + let i = buf.length; + let j = needle.length; + if (i < j) return false; + while (--i, --j >= 0 && equiv(buf[i], needle[j])) { } + return j < 0; + }; diff --git a/packages/arrays/src/ensure-array.ts b/packages/arrays/src/ensure-array.ts new file mode 100644 index 0000000000..0de070f414 --- /dev/null +++ b/packages/arrays/src/ensure-array.ts @@ -0,0 +1,18 @@ +import { isArray, isArrayLike } from "@thi.ng/checks"; +import { ensureIterable } from "./ensure-iterable"; + +/** + * Helper function to avoid unnecessary copying if `x` is already an + * array. First checks if `x` is an array and if so returns it. Else + * attempts to obtain an iterator from `x` and if successful collects it + * as array and returns it. Throws error if `x` isn't iterable. + * + * @param x + */ +export const ensureArray = + (x: any): any[] => + isArray(x) ? x : [...ensureIterable(x)]; + +export const ensureArrayLike = + (x: any): ArrayLike => + isArrayLike(x) ? x : [...ensureIterable(x)]; diff --git a/packages/arrays/src/ensure-iterable.ts b/packages/arrays/src/ensure-iterable.ts new file mode 100644 index 0000000000..dd9acf06c5 --- /dev/null +++ b/packages/arrays/src/ensure-iterable.ts @@ -0,0 +1,9 @@ +import { illegalArgs } from "@thi.ng/errors"; + +export const ensureIterable = + (x: any): IterableIterator => { + if (!(x != null && x[Symbol.iterator])) { + illegalArgs(`value is not iterable: ${x}`); + } + return x; + }; diff --git a/packages/arrays/src/fuzzy-match.ts b/packages/arrays/src/fuzzy-match.ts new file mode 100644 index 0000000000..1ef5a598be --- /dev/null +++ b/packages/arrays/src/fuzzy-match.ts @@ -0,0 +1,44 @@ +import { Predicate2 } from "@thi.ng/api"; +import { equiv as _eq } from "@thi.ng/equiv"; + +/** + * Performs a fuzzy search of `query` in `domain` and returns `true` if + * successful. + * + * The optional `equiv` predicate can be used to customize + * item equality checking. Uses @thi.ng/equiv by default. + * + * Adapted and generalized from: + * https://github.com/bevacqua/fufuzzyzzysearch (MIT) + * + * @see thi.ng/transducers/xform/filterFuzzy + * + * @param query + * @param domain + * @param equiv + */ +export const fuzzyMatch = ( + query: ArrayLike, + domain: ArrayLike, + equiv: Predicate2 = _eq +) => { + const nd = domain.length; + const nq = query.length; + if (nq > nd) { + return false; + } + if (nq === nd) { + return equiv(query, domain); + } + next: + for (let i = 0, j = 0; i < nq; i++) { + const q = query[i]; + while (j < nd) { + if (equiv(domain[j++], q)) { + continue next; + } + } + return false; + } + return true; +}; diff --git a/packages/arrays/src/index.ts b/packages/arrays/src/index.ts new file mode 100644 index 0000000000..b1edbe0ed5 --- /dev/null +++ b/packages/arrays/src/index.ts @@ -0,0 +1,9 @@ +export * from "./binary-search"; +export * from "./ends-with"; +export * from "./ensure-array"; +export * from "./ensure-iterable"; +export * from "./fuzzy-match"; +export * from "./peek"; +export * from "./shuffle"; +export * from "./starts-with"; +export * from "./swizzle"; diff --git a/packages/arrays/src/peek.ts b/packages/arrays/src/peek.ts new file mode 100644 index 0000000000..05376f68d2 --- /dev/null +++ b/packages/arrays/src/peek.ts @@ -0,0 +1,7 @@ +/** + * Returns last element of given array or `undefined` if array is empty. + * + * @param x + */ +export const peek = + (x: ArrayLike) => x[x.length - 1]; diff --git a/packages/arrays/src/shuffle.ts b/packages/arrays/src/shuffle.ts new file mode 100644 index 0000000000..8e96af68cd --- /dev/null +++ b/packages/arrays/src/shuffle.ts @@ -0,0 +1,17 @@ +import { IRandom, SYSTEM } from "@thi.ng/random"; + +export const shuffle = + (buf: any[], n = buf.length, rnd: IRandom = SYSTEM) => { + const l = buf.length; + if (l > 1) { + n = Math.min(n, l); + while (--n >= 0) { + const a = rnd.float(l) | 0; + const b = rnd.float(l) | 0; + const t = buf[a]; + buf[a] = buf[b]; + buf[b] = t; + } + } + return buf; + }; diff --git a/packages/arrays/src/starts-with.ts b/packages/arrays/src/starts-with.ts new file mode 100644 index 0000000000..589f8192de --- /dev/null +++ b/packages/arrays/src/starts-with.ts @@ -0,0 +1,10 @@ +import { equiv as _eq } from "@thi.ng/equiv"; + +export const startsWith = + (buf: ArrayLike, needle: ArrayLike, equiv = _eq) => { + let i = buf.length; + let j = needle.length; + if (i < j) return false; + while (-j >= 0 && equiv(buf[j], needle[j])) { } + return j < 0; + }; diff --git a/packages/arrays/src/swizzle.ts b/packages/arrays/src/swizzle.ts new file mode 100644 index 0000000000..4c51c97cdf --- /dev/null +++ b/packages/arrays/src/swizzle.ts @@ -0,0 +1,55 @@ +import { Fn } from "@thi.ng/api"; + +/** + * Returns optimized function to immutably select, repeat, reshape and / + * or reorder array / object values in the specified index order. Fast + * paths for up to 8 indices are provided, before a loop based approach + * is used. + * + * ``` + * swizzle([0, 0, 0])([1, 2, 3, 4]) // [ 1, 1, 1 ] + * swizzle([1, 1, 3, 3])([1, 2, 3, 4]) // [ 2, 2, 4, 4 ] + * swizzle([2, 0])([1, 2, 3]) // [ 3, 1 ] + * ``` + * + * Objects can be used as input to the generated function, but the + * result will always be in array form. + * + * ``` + * swizzle(["a", "c", "b"])({a: 1, b: 2, c: 3}) // [ 1, 3, 2 ] + * ``` + * + * @param order indices + */ +export const swizzle = + (order: string | PropertyKey[]): Fn => { + const [a, b, c, d, e, f, g, h] = order; + switch (order.length) { + case 0: + return () => []; + case 1: + return (x) => [x[a]]; + case 2: + return (x) => [x[a], x[b]]; + case 3: + return (x) => [x[a], x[b], x[c]]; + case 4: + return (x) => [x[a], x[b], x[c], x[d]]; + case 5: + return (x) => [x[a], x[b], x[c], x[d], x[e]]; + case 6: + return (x) => [x[a], x[b], x[c], x[d], x[e], x[f]]; + case 7: + return (x) => [x[a], x[b], x[c], x[d], x[e], x[f], x[g]]; + case 8: + return (x) => [x[a], x[b], x[c], x[d], x[e], x[f], x[g], x[h]]; + default: + return (x) => { + const res = []; + for (let i = order.length; --i >= 0;) { + res[i] = x[order[i]]; + } + return res; + }; + } + }; diff --git a/packages/arrays/test/index.ts b/packages/arrays/test/index.ts new file mode 100644 index 0000000000..e74dbb435e --- /dev/null +++ b/packages/arrays/test/index.ts @@ -0,0 +1,6 @@ +// import * as assert from "assert"; +// import * as a from "../src/index"; + +describe("arrays", () => { + it("tests pending"); +}); diff --git a/packages/arrays/test/tsconfig.json b/packages/arrays/test/tsconfig.json new file mode 100644 index 0000000000..f6e63560dd --- /dev/null +++ b/packages/arrays/test/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../build", + "module": "commonjs" + }, + "include": [ + "./**/*.ts", + "../src/**/*.ts" + ] +} diff --git a/packages/arrays/tsconfig.json b/packages/arrays/tsconfig.json new file mode 100644 index 0000000000..893b9979c5 --- /dev/null +++ b/packages/arrays/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": ".", + "module": "es6", + "target": "es6" + }, + "include": [ + "./src/**/*.ts" + ] +} From 83cb816ad6857927a4f10a3b543ca4d1c1bc5244 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:50:54 +0000 Subject: [PATCH 18/43] refactor(transducers): remove obsolete fns, update to use @thi.ng/arrays BREAKING CHANGE: migrate various support fns to @thi.ng/arrays - remove/migrate functions: - binarySearch() - ensureArray() / ensureIterable() - fuzzyMatch() - peek() - shuffleN() - swizzler() - add support for IRandom in: - randomID() - choices() - weightedRandom() - sample() - update deps / readme --- packages/transducers/README.md | 35 ++++++++---- packages/transducers/package.json | 12 ++++- .../transducers/src/func/binary-search.ts | 36 ------------- packages/transducers/src/func/ensure-array.ts | 18 ------- .../transducers/src/func/ensure-iterable.ts | 9 ---- packages/transducers/src/func/fuzzy-match.ts | 42 --------------- packages/transducers/src/func/peek.ts | 7 --- packages/transducers/src/func/random-id.ts | 6 ++- packages/transducers/src/func/shuffle.ts | 12 ----- packages/transducers/src/func/swizzler.ts | 54 ------------------- .../transducers/src/func/weighted-random.ts | 13 +++-- packages/transducers/src/index.ts | 6 --- packages/transducers/src/iter/choices.ts | 12 +++-- packages/transducers/src/iter/concat.ts | 2 +- packages/transducers/src/iter/permutations.ts | 2 +- packages/transducers/src/iter/reverse.ts | 2 +- packages/transducers/src/iter/wrap.ts | 2 +- .../transducers/src/xform/filter-fuzzy.ts | 4 +- packages/transducers/src/xform/sample.ts | 25 +++++---- .../transducers/src/xform/stream-shuffle.ts | 6 +-- packages/transducers/src/xform/stream-sort.ts | 7 ++- packages/transducers/src/xform/swizzle.ts | 8 +-- packages/transducers/test/permutations.ts | 2 +- 23 files changed, 88 insertions(+), 234 deletions(-) delete mode 100644 packages/transducers/src/func/binary-search.ts delete mode 100644 packages/transducers/src/func/ensure-array.ts delete mode 100644 packages/transducers/src/func/ensure-iterable.ts delete mode 100644 packages/transducers/src/func/fuzzy-match.ts delete mode 100644 packages/transducers/src/func/peek.ts delete mode 100644 packages/transducers/src/func/shuffle.ts delete mode 100644 packages/transducers/src/func/swizzler.ts diff --git a/packages/transducers/README.md b/packages/transducers/README.md index d686b3a97a..190446be2b 100644 --- a/packages/transducers/README.md +++ b/packages/transducers/README.md @@ -10,6 +10,7 @@ This project is part of the - [About](#about) + - [5.0.0 release](#500-release) - [Related packages](#related-packages) - [Installation](#installation) - [Dependencies](#dependencies) @@ -32,7 +33,7 @@ This project is part of the - [Types](#types) - [IReducible](#ireducible) - [Transducer](#transducer) - - [Transformations](#transformations) + - [Composition & execution](#composition--execution) - [Transducers](#transducers) - [Generators / Iterators](#generators--iterators) - [Reducers](#reducers) @@ -43,7 +44,7 @@ This project is part of the ## About -This library provides altogether 130+ transducers, reducers, sequence +This library provides altogether ~120 transducers, reducers, sequence generators (iterators) and other supporting functions for composing data transformation pipelines. @@ -53,13 +54,27 @@ though the implementation does heavily differ (also in contrast to some other JS based implementations) and dozens of less common, but generally highly useful operators have been added. See full list below. -Furthermore, since v2.0.0 most transducers & reducers provided here -accept an optional input iterable, which allows them to be used -directly instead of having to wrap their call in one of the execution -functions (i.e. `transduce()`, `reduce()`, `iterator()`, `run()`). If -executed this way, transducer functions will return a transforming ES6 -iterator (generator) and reducing functions will return a reduced result -of the given input iterable. +Furthermore, most transducers & reducers provided here accept an +optional input iterable, which allows them to be used directly instead +of having to wrap their call in one of the execution functions (i.e. +`transduce()`, `reduce()`, `iterator()`, `run()`). If executed this way, +transducer functions will return a transforming ES6 iterator (generator) +and reducing functions will return a reduced result of the given input +iterable. + +### 5.0.0 release + +Several previously included internal support functions have been +migrated to the +[@thi.ng/arrays](https://github.com/thi-ng/umbrella/tree/master/packages/arrays) +package. You'll need to update your imports if you've been using any of +these directly. Note that some of these functions also have changes to +their arg order. + +Functions using randomness now all support an optional PRNG +implementation of the `IRandom` interface from the +[@thi.ng/random](https://github.com/thi-ng/umbrella/tree/master/packages/random) +package. ### Related packages @@ -574,7 +589,7 @@ function dedupe(): Transducer { } ``` -### Transformations +### Composition & execution #### `comp(f1, f2, ...)` diff --git a/packages/transducers/package.json b/packages/transducers/package.json index 1293f85add..f9e0cf8412 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -33,23 +33,33 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", + "@thi.ng/arrays": "^0.0.1", "@thi.ng/checks": "^2.1.0", "@thi.ng/compare": "^1.0.2", "@thi.ng/compose": "^1.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", + "@thi.ng/random": "^1.0.2", "@thi.ng/strings": "^1.0.3" }, "keywords": [ "array", "composition", "data", + "dedupe", "ES6", + "flatten", "functional", "generators", + "iterables", "iterators", + "interleave", + "paging", + "partition", "pipeline", "reducers", + "stepwise", + "stream", "transducers", "transformation", "typescript" @@ -58,4 +68,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/transducers/src/func/binary-search.ts b/packages/transducers/src/func/binary-search.ts deleted file mode 100644 index 1e0086b713..0000000000 --- a/packages/transducers/src/func/binary-search.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Comparator, Fn } from "@thi.ng/api"; - -/** - * Returns the supposed index of `x` in pre-sorted array-like collection - * `arr`. The `key` function first is used to obtain the actual sort - * value of `x` and each array item. The `cmp` comparator is then used to - * identify the index of `x`. - * - * @param arr - * @param key - * @param cmp - * @param x - * @returns index of `x`, else `-index` if item could not be found - */ -export const binarySearch = ( - arr: ArrayLike, - key: Fn, - cmp: Comparator, - x: A -) => { - const kx = key(x); - let low = 0; - let high = arr.length - 1; - while (low <= high) { - const mid = (low + high) >>> 1; - const c = cmp(key(arr[mid]), kx); - if (c < 0) { - low = mid + 1; - } else if (c > 0) { - high = mid - 1; - } else { - return mid; - } - } - return -low; -}; diff --git a/packages/transducers/src/func/ensure-array.ts b/packages/transducers/src/func/ensure-array.ts deleted file mode 100644 index 0de070f414..0000000000 --- a/packages/transducers/src/func/ensure-array.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { isArray, isArrayLike } from "@thi.ng/checks"; -import { ensureIterable } from "./ensure-iterable"; - -/** - * Helper function to avoid unnecessary copying if `x` is already an - * array. First checks if `x` is an array and if so returns it. Else - * attempts to obtain an iterator from `x` and if successful collects it - * as array and returns it. Throws error if `x` isn't iterable. - * - * @param x - */ -export const ensureArray = - (x: any): any[] => - isArray(x) ? x : [...ensureIterable(x)]; - -export const ensureArrayLike = - (x: any): ArrayLike => - isArrayLike(x) ? x : [...ensureIterable(x)]; diff --git a/packages/transducers/src/func/ensure-iterable.ts b/packages/transducers/src/func/ensure-iterable.ts deleted file mode 100644 index dd9acf06c5..0000000000 --- a/packages/transducers/src/func/ensure-iterable.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { illegalArgs } from "@thi.ng/errors"; - -export const ensureIterable = - (x: any): IterableIterator => { - if (!(x != null && x[Symbol.iterator])) { - illegalArgs(`value is not iterable: ${x}`); - } - return x; - }; diff --git a/packages/transducers/src/func/fuzzy-match.ts b/packages/transducers/src/func/fuzzy-match.ts deleted file mode 100644 index d9476ff966..0000000000 --- a/packages/transducers/src/func/fuzzy-match.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Predicate2 } from "@thi.ng/api"; -import { equiv } from "@thi.ng/equiv"; - -/** - * Performs a fuzzy search of `query` in `domain` and returns `true` if - * successful. The optional `eq` predicate can be used to customize item - * equality checking. Uses @thi.ng/equiv by default. - * - * Related transducer: `filterFuzzy()` (/xform/filter-fuzzy.ts) - * - * Adapted and generalized from: - * https://github.com/bevacqua/fufuzzyzzysearch (MIT) - * - * @param domain - * @param query - * @param eq - */ -export const fuzzyMatch = ( - domain: ArrayLike, - query: ArrayLike, - eq: Predicate2 = equiv -) => { - const nd = domain.length; - const nq = query.length; - if (nq > nd) { - return false; - } - if (nq === nd) { - return eq(query, domain); - } - next: - for (let i = 0, j = 0; i < nq; i++) { - const q = query[i]; - while (j < nd) { - if (eq(domain[j++], q)) { - continue next; - } - } - return false; - } - return true; -}; diff --git a/packages/transducers/src/func/peek.ts b/packages/transducers/src/func/peek.ts deleted file mode 100644 index f0c29728fe..0000000000 --- a/packages/transducers/src/func/peek.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Returns last element of given array. - * - * @param x - */ -export const peek = - (x: ArrayLike) => x[x.length - 1]; diff --git a/packages/transducers/src/func/random-id.ts b/packages/transducers/src/func/random-id.ts index f4901cbb38..5979d8aed5 100644 --- a/packages/transducers/src/func/random-id.ts +++ b/packages/transducers/src/func/random-id.ts @@ -1,3 +1,4 @@ +import { IRandom, SYSTEM } from "@thi.ng/random"; import { choices } from "../iter/choices"; import { take } from "../xform/take"; @@ -17,7 +18,8 @@ import { take } from "../xform/take"; * @param len * @param prefix * @param syms + * @param rnd */ export const randomID = - (len = 4, prefix = "", syms = "abcdefghijklmnopqrstuvwxyz") => - [prefix, ...take(len, choices(syms))].join(""); + (len = 4, prefix = "", syms = "abcdefghijklmnopqrstuvwxyz", rnd: IRandom = SYSTEM) => + [prefix, ...take(len, choices(syms, null, rnd))].join(""); diff --git a/packages/transducers/src/func/shuffle.ts b/packages/transducers/src/func/shuffle.ts deleted file mode 100644 index 9a3b355215..0000000000 --- a/packages/transducers/src/func/shuffle.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const shuffleN = - (buf: any[], n: number) => { - const l = buf.length; - n = n < l ? n : l; - while (--n >= 0) { - const a = (Math.random() * l) | 0; - const b = (Math.random() * l) | 0; - const t = buf[a]; - buf[a] = buf[b]; - buf[b] = t; - } - }; diff --git a/packages/transducers/src/func/swizzler.ts b/packages/transducers/src/func/swizzler.ts deleted file mode 100644 index 5c368006eb..0000000000 --- a/packages/transducers/src/func/swizzler.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Returns optimized function to select, repeat, reshape and / or - * reorder array/object values in the specified index order. The - * returned function can be used directly or as mapping function for the - * `map` transducer. Fast paths for up to 8 indices are provided, before - * a loop based approach is used. - * - * ``` - * swizzler([0, 0, 0])([1, 2, 3, 4]) // [ 1, 1, 1 ] - * swizzler([1, 1, 3, 3])([1, 2, 3, 4]) // [ 2, 2, 4, 4 ] - * swizzler([2, 0])([1, 2, 3]) // [ 3, 1 ] - * ``` - * - * Even though, objects can be used as input to the generated function, - * the returned values will always be in array form. - * - * ``` - * swizzler(["a", "c", "b"])({a: 1, b: 2, c: 3}) // [ 1, 3, 2 ] - * ``` - * - * @param order indices - */ -export const swizzler = - (order: string | PropertyKey[]): (x: T) => any[] => { - const [a, b, c, d, e, f, g, h] = order; - switch (order.length) { - case 0: - return () => []; - case 1: - return (x) => [x[a]]; - case 2: - return (x) => [x[a], x[b]]; - case 3: - return (x) => [x[a], x[b], x[c]]; - case 4: - return (x) => [x[a], x[b], x[c], x[d]]; - case 5: - return (x) => [x[a], x[b], x[c], x[d], x[e]]; - case 6: - return (x) => [x[a], x[b], x[c], x[d], x[e], x[f]]; - case 7: - return (x) => [x[a], x[b], x[c], x[d], x[e], x[f], x[g]]; - case 8: - return (x) => [x[a], x[b], x[c], x[d], x[e], x[f], x[g], x[h]]; - default: - return (x) => { - const res = []; - for (let i = order.length - 1; i >= 0; i--) { - res[i] = x[order[i]]; - } - return res; - }; - } - }; diff --git a/packages/transducers/src/func/weighted-random.ts b/packages/transducers/src/func/weighted-random.ts index 290a15f564..52c26deb4d 100644 --- a/packages/transducers/src/func/weighted-random.ts +++ b/packages/transducers/src/func/weighted-random.ts @@ -1,9 +1,11 @@ +import { IRandom, SYSTEM } from "@thi.ng/random"; import { repeat } from "../iter/repeat"; import { zip } from "../iter/zip"; /** - * If `weights` are given, it must be the same size as `choices`. If omitted, - * each choice will have same probability. + * Returns a no-arg function which produces a random choice of given + * weighted `choices`. If `weights` are given, it must be the same size + * as `choices`. If omitted, each choice will have same probability. * * https://www.electricmonk.nl/log/2009/12/23/weighted-random-distribution/ * @@ -12,16 +14,17 @@ import { zip } from "../iter/zip"; */ export const weightedRandom = ( choices: ArrayLike & Iterable, - weights?: ArrayLike & Iterable + weights?: ArrayLike & Iterable, + rnd: IRandom = SYSTEM ) => { const n = choices.length; const opts = [...zip(choices, weights || repeat(1))].sort((a, b) => b[1] - a[1]); let total = 0, i, r, sum; for (i = 0; i < n; i++) { - total += weights[i]; + total += opts[i][1]; } return () => { - r = Math.random() * total; + r = rnd.float(total); sum = total; for (i = 0; i < n; i++) { sum -= opts[i][1]; diff --git a/packages/transducers/src/index.ts b/packages/transducers/src/index.ts index 8410a549bc..03f409a86c 100644 --- a/packages/transducers/src/index.ts +++ b/packages/transducers/src/index.ts @@ -92,16 +92,12 @@ export * from "./xform/throttle-time"; export * from "./xform/trace"; export * from "./xform/word-wrap"; -export * from "./func/binary-search"; export * from "./func/comp"; export * from "./func/compr"; export * from "./func/constantly"; export * from "./func/deep-transform"; export * from "./func/delay"; -export * from "./func/ensure-array"; -export * from "./func/ensure-iterable"; export * from "./func/even"; -export * from "./func/fuzzy-match"; export * from "./func/hex"; export * from "./func/identity"; export * from "./func/juxt"; @@ -109,10 +105,8 @@ export * from "./func/juxtr"; export * from "./func/key-selector"; export * from "./func/lookup"; export * from "./func/odd"; -export * from "./func/peek"; export * from "./func/random-id"; export * from "./func/renamer"; -export * from "./func/swizzler"; export * from "./func/weighted-random"; export * from "./iter/as-iterable"; diff --git a/packages/transducers/src/iter/choices.ts b/packages/transducers/src/iter/choices.ts index 8abd5b830a..73858bdc26 100644 --- a/packages/transducers/src/iter/choices.ts +++ b/packages/transducers/src/iter/choices.ts @@ -1,27 +1,29 @@ import { weightedRandom } from "../func/weighted-random"; import { repeatedly } from "./repeatedly"; +import { IRandom, SYSTEM } from "@thi.ng/random"; /** * Returns an infinite iterator of random choices and their (optional) * weights. If `weights` is given, it must have at least the same size * as `choices`. If omitted, each choice will have same probability. * - * See: `weightedRandom()` - * * ``` * transduce(take(1000), frequencies(), choices("abcd", [1, 0.5, 0.25, 0.125])) * // Map { 'c' => 132, 'a' => 545, 'b' => 251, 'd' => 72 } * ``` * + * @see weightedRandom + * * @param choices * @param weights */ export const choices = ( choices: ArrayLike & Iterable, - weights?: ArrayLike & Iterable + weights?: ArrayLike & Iterable, + rnd: IRandom = SYSTEM ) => repeatedly( weights ? - weightedRandom(choices, weights) : - () => choices[(Math.random() * choices.length) | 0] + weightedRandom(choices, weights, rnd) : + () => choices[(rnd.float(choices.length) | 0)] ); diff --git a/packages/transducers/src/iter/concat.ts b/packages/transducers/src/iter/concat.ts index f03550abd5..a4f89396aa 100644 --- a/packages/transducers/src/iter/concat.ts +++ b/packages/transducers/src/iter/concat.ts @@ -1,4 +1,4 @@ -import { ensureIterable } from "../func/ensure-iterable"; +import { ensureIterable } from "@thi.ng/arrays"; /** * Yields iterator producing concatenation of given iterables. diff --git a/packages/transducers/src/iter/permutations.ts b/packages/transducers/src/iter/permutations.ts index 67c7fd2c50..abe70d1df6 100644 --- a/packages/transducers/src/iter/permutations.ts +++ b/packages/transducers/src/iter/permutations.ts @@ -1,5 +1,5 @@ +import { ensureArrayLike } from "@thi.ng/arrays"; import { illegalArgs } from "@thi.ng/errors"; -import { ensureArrayLike } from "../func/ensure-array"; import { range } from "./range"; /** diff --git a/packages/transducers/src/iter/reverse.ts b/packages/transducers/src/iter/reverse.ts index 332b18ddac..e889121d6f 100644 --- a/packages/transducers/src/iter/reverse.ts +++ b/packages/transducers/src/iter/reverse.ts @@ -1,4 +1,4 @@ -import { ensureArray } from "../func/ensure-array"; +import { ensureArray } from "@thi.ng/arrays"; /** * Yields iterator which consumes input and yield its values in reverse diff --git a/packages/transducers/src/iter/wrap.ts b/packages/transducers/src/iter/wrap.ts index 100e857528..79ff2e0269 100644 --- a/packages/transducers/src/iter/wrap.ts +++ b/packages/transducers/src/iter/wrap.ts @@ -1,5 +1,5 @@ +import { ensureArray } from "@thi.ng/arrays"; import { illegalArgs } from "@thi.ng/errors"; -import { ensureArray } from "../func/ensure-array"; /** * Yields iterator of `src` with the last `n` values of `src` prepended diff --git a/packages/transducers/src/xform/filter-fuzzy.ts b/packages/transducers/src/xform/filter-fuzzy.ts index 2a73761f18..3f68bebf5b 100644 --- a/packages/transducers/src/xform/filter-fuzzy.ts +++ b/packages/transducers/src/xform/filter-fuzzy.ts @@ -1,6 +1,6 @@ import { Fn, Predicate2 } from "@thi.ng/api"; +import { fuzzyMatch } from "@thi.ng/arrays"; import { Transducer } from "../api"; -import { fuzzyMatch } from "../func/fuzzy-match"; import { $iter } from "../iterator"; import { filter } from "./filter"; @@ -35,6 +35,6 @@ export function filterFuzzy(...args: any[]): any { const query: ArrayLike = args[0]; const { key, equiv } = >(args[1] || {}); return filter( - (x: A) => fuzzyMatch(key != null ? key(x) : x, query, equiv) + (x: A) => fuzzyMatch(query, key != null ? key(x) : x, equiv) ); } diff --git a/packages/transducers/src/xform/sample.ts b/packages/transducers/src/xform/sample.ts index 51e3af2bdf..df487474cd 100644 --- a/packages/transducers/src/xform/sample.ts +++ b/packages/transducers/src/xform/sample.ts @@ -1,6 +1,7 @@ +import { IRandom, SYSTEM } from "@thi.ng/random"; import { Reducer, Transducer } from "../api"; import { compR } from "../func/compr"; -import { iterator1 } from "../iterator"; +import { $iter } from "../iterator"; /** * Transducer which only yields values with given `prob` probability @@ -16,13 +17,19 @@ import { iterator1 } from "../iterator"; * @param src */ export function sample(prob: number): Transducer; +export function sample(prob: number, rnd: IRandom): Transducer; export function sample(prob: number, src: Iterable): IterableIterator; -export function sample(prob: number, src?: Iterable): any { - return src ? - iterator1(sample(prob), src) : - (rfn: Reducer) => { - const r = rfn[2]; - return compR(rfn, - (acc, x: T) => Math.random() < prob ? r(acc, x) : acc); - } +export function sample(prob: number, rnd: IRandom, src: Iterable): IterableIterator; +export function sample(...args: any[]): any { + const iter = $iter(sample, args); + if (iter) { + return iter; + } + const prob = args[0]; + const rnd: IRandom = args[1] || SYSTEM; + return (rfn: Reducer) => { + const r = rfn[2]; + return compR(rfn, + (acc, x: T) => rnd.float() < prob ? r(acc, x) : acc); + }; } diff --git a/packages/transducers/src/xform/stream-shuffle.ts b/packages/transducers/src/xform/stream-shuffle.ts index b0472d45f3..686efa7e28 100644 --- a/packages/transducers/src/xform/stream-shuffle.ts +++ b/packages/transducers/src/xform/stream-shuffle.ts @@ -1,5 +1,5 @@ +import { shuffle } from "@thi.ng/arrays"; import { Reducer, Transducer } from "../api"; -import { shuffleN } from "../func/shuffle"; import { $iter, iterator } from "../iterator"; import { isReduced } from "../reduced"; @@ -30,7 +30,7 @@ export function streamShuffle(...args: any[]): any { init, (acc) => { while (buf.length && !isReduced(acc)) { - shuffleN(buf, maxSwaps); + shuffle(buf, maxSwaps); acc = reduce(acc, buf.shift()); } acc = complete(acc); @@ -38,7 +38,7 @@ export function streamShuffle(...args: any[]): any { }, (acc, x: T) => { buf.push(x); - shuffleN(buf, maxSwaps); + shuffle(buf, maxSwaps); if (buf.length === n) { acc = reduce(acc, buf.shift()); } diff --git a/packages/transducers/src/xform/stream-sort.ts b/packages/transducers/src/xform/stream-sort.ts index 935fd79ed3..2b54136657 100644 --- a/packages/transducers/src/xform/stream-sort.ts +++ b/packages/transducers/src/xform/stream-sort.ts @@ -1,7 +1,6 @@ +import { binarySearch } from "@thi.ng/arrays"; import { compare as cmp } from "@thi.ng/compare"; - import { Reducer, SortOpts, Transducer } from "../api"; -import { binarySearch } from "../func/binary-search"; import { identity } from "../func/identity"; import { $iter, iterator } from "../iterator"; import { isReduced } from "../reduced"; @@ -45,8 +44,8 @@ export function streamSort(...args: any[]): any { return complete(acc); }, (acc, x) => { - const idx = binarySearch(buf, key, compare, x); - buf.splice(Math.abs(idx), 0, x); + const idx = binarySearch(x, buf, key, compare); + buf.splice(idx < 0 ? -(idx + 1) : idx, 0, x); if (buf.length === n) { acc = reduce(acc, buf.shift()); } diff --git a/packages/transducers/src/xform/swizzle.ts b/packages/transducers/src/xform/swizzle.ts index 62e5128e3f..698002bbb5 100644 --- a/packages/transducers/src/xform/swizzle.ts +++ b/packages/transducers/src/xform/swizzle.ts @@ -1,5 +1,5 @@ +import { swizzle as _swizzle } from "@thi.ng/arrays"; import { Transducer } from "../api"; -import { swizzler } from "../func/swizzler"; import { iterator1 } from "../iterator"; import { map } from "./map"; @@ -8,8 +8,6 @@ import { map } from "./map"; * property order. Accepts arrays or objects as input, but always yields * arrays. * - * Also see `swizzler()` for standalone (non-transducer) usage. - * * ``` * [...swizzle([3,0,2,1], [[1,2,3,4], [10,20,30,40]])] * // [ [ 4, 1, 3, 2 ], [ 40, 10, 30, 20 ] ] @@ -21,6 +19,8 @@ import { map } from "./map"; * // [ [ 3, 1 ] ] * ``` * + * @see thi.ng/arrays/swizzle + * * @param order key order */ export function swizzle(order: PropertyKey[]): Transducer; @@ -28,5 +28,5 @@ export function swizzle(order: PropertyKey[], src: Iterable): IterableIt export function swizzle(order: PropertyKey[], src?: Iterable): any { return src ? iterator1(swizzle(order), src) : - map(swizzler(order)); + map(_swizzle(order)); } diff --git a/packages/transducers/test/permutations.ts b/packages/transducers/test/permutations.ts index ccb6a233e3..ad3ce8a60a 100644 --- a/packages/transducers/test/permutations.ts +++ b/packages/transducers/test/permutations.ts @@ -1,4 +1,4 @@ -import { swizzler } from "../src/func/swizzler"; +import { swizzler } from "@thi.ng/arrays"; import { permutations, permutationsN } from "../src/iter/permutations"; import { range } from "../src/iter/range"; import { iterator } from "../src/iterator"; From 83260ed64e1e437d124b71667211ba343a7df496 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:51:43 +0000 Subject: [PATCH 19/43] refactor(bencode): update to use @thi.ng/arrays --- packages/bencode/package.json | 1 + packages/bencode/src/index.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/bencode/package.json b/packages/bencode/package.json index 5ba528123b..f96bdf580b 100644 --- a/packages/bencode/package.json +++ b/packages/bencode/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", + "@thi.ng/arrays": "^0.0.1", "@thi.ng/checks": "^2.1.0", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/errors": "^1.0.2", diff --git a/packages/bencode/src/index.ts b/packages/bencode/src/index.ts index aa2b5c8b45..6ef0879f35 100644 --- a/packages/bencode/src/index.ts +++ b/packages/bencode/src/index.ts @@ -1,4 +1,5 @@ import { assert } from "@thi.ng/api"; +import { peek } from "@thi.ng/arrays"; import { isArray, isArrayLike, @@ -9,7 +10,7 @@ import { } from "@thi.ng/checks"; import { defmulti } from "@thi.ng/defmulti"; import { illegalState } from "@thi.ng/errors"; -import { mapcat, peek } from "@thi.ng/transducers"; +import { mapcat } from "@thi.ng/transducers"; import { BinStructItem, bytes, From 64204a11dba6d554a242f97e3744077ce6b90bda Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:52:48 +0000 Subject: [PATCH 20/43] refactor(csp): use @thi.ng/arrays, remove obsolete shuffle() --- packages/csp/package.json | 3 ++- packages/csp/src/channel.ts | 2 +- packages/csp/src/utils/shuffle.ts | 14 -------------- 3 files changed, 3 insertions(+), 16 deletions(-) delete mode 100644 packages/csp/src/utils/shuffle.ts diff --git a/packages/csp/package.json b/packages/csp/package.json index 8b4df24493..cd1df60f81 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -37,6 +37,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", + "@thi.ng/arrays": "^0.0.1", "@thi.ng/checks": "^2.1.0", "@thi.ng/dcons": "^2.0.4", "@thi.ng/errors": "^1.0.2", @@ -59,4 +60,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/csp/src/channel.ts b/packages/csp/src/channel.ts index 1b82f0f929..ac161f80eb 100644 --- a/packages/csp/src/channel.ts +++ b/packages/csp/src/channel.ts @@ -1,4 +1,5 @@ import { Predicate } from "@thi.ng/api"; +import { shuffle } from "@thi.ng/arrays"; import { isFunction } from "@thi.ng/checks"; import { DCons } from "@thi.ng/dcons"; import { illegalArity } from "@thi.ng/errors"; @@ -19,7 +20,6 @@ import { State } from "./api"; import { FixedBuffer } from "./buffer"; -import { shuffle } from "./utils/shuffle"; export class Channel implements IReadWriteableChannel { diff --git a/packages/csp/src/utils/shuffle.ts b/packages/csp/src/utils/shuffle.ts deleted file mode 100644 index 14ff0f63fd..0000000000 --- a/packages/csp/src/utils/shuffle.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const shuffle = - (items: T[]) => { - let n = items.length; - if (n > 1) { - while (n > 0) { - const i = (Math.random() * n) | 0; - n--; - const t = items[i]; - items[i] = items[n]; - items[n] = t; - } - } - return items; - }; From 3abdc9ebad544162d418b9abd043a3e5b93368c3 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:53:17 +0000 Subject: [PATCH 21/43] refactor(fsm): update to use @thi.ng/arrays --- packages/fsm/package.json | 3 ++- packages/fsm/src/until.ts | 14 +------------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/fsm/package.json b/packages/fsm/package.json index acb305fed1..158751e3d4 100644 --- a/packages/fsm/package.json +++ b/packages/fsm/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", + "@thi.ng/arrays": "^0.0.1", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", "@thi.ng/transducers": "^4.0.1" @@ -55,4 +56,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/fsm/src/until.ts b/packages/fsm/src/until.ts index 399bac6f25..5316448de6 100644 --- a/packages/fsm/src/until.ts +++ b/packages/fsm/src/until.ts @@ -1,3 +1,4 @@ +import { endsWith } from "@thi.ng/arrays"; import { LitCallback, Matcher, RES_PARTIAL } from "./api"; import { result } from "./result"; @@ -47,16 +48,3 @@ export const until = ( RES_PARTIAL; }; }; - -const endsWith = - (src: any[], needle: any[]) => { - let i = src.length; - let j = needle.length; - if (i < j) return false; - for (; --i, --j >= 0;) { - if (src[i] !== needle[j]) { - return false; - } - } - return true; - }; From 78095f4f51f1d11f71a400ee3da9ff249af7ba51 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:54:16 +0000 Subject: [PATCH 22/43] refactor(geom): update to use @thi.ng/arrays --- packages/geom/package.json | 3 ++- packages/geom/src/ctors/path.ts | 3 ++- packages/geom/src/internal/args.ts | 2 +- packages/geom/src/ops/simplify.ts | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/geom/package.json b/packages/geom/package.json index a8aed2ee31..c14a5f233e 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", + "@thi.ng/arrays": "^0.0.1", "@thi.ng/checks": "^2.1.0", "@thi.ng/compose": "^1.0.2", "@thi.ng/defmulti": "^1.0.2", @@ -71,4 +72,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/geom/src/ctors/path.ts b/packages/geom/src/ctors/path.ts index b94f7b8fcd..0caf648e0d 100644 --- a/packages/geom/src/ctors/path.ts +++ b/packages/geom/src/ctors/path.ts @@ -1,7 +1,8 @@ +import { peek } from "@thi.ng/arrays"; import { isNumber } from "@thi.ng/checks"; import { Attribs, PathSegment, SegmentType } from "@thi.ng/geom-api"; import { eqDelta, rad } from "@thi.ng/math"; -import { map, mapcat, peek } from "@thi.ng/transducers"; +import { map, mapcat } from "@thi.ng/transducers"; import { add2, copy, diff --git a/packages/geom/src/internal/args.ts b/packages/geom/src/internal/args.ts index 7bf1bba99f..451a1908b5 100644 --- a/packages/geom/src/internal/args.ts +++ b/packages/geom/src/internal/args.ts @@ -1,5 +1,5 @@ +import { peek } from "@thi.ng/arrays"; import { isNumber, isPlainObject } from "@thi.ng/checks"; -import { peek } from "@thi.ng/transducers"; /** * Takes an array of arguments, checks if last element is a plain object diff --git a/packages/geom/src/ops/simplify.ts b/packages/geom/src/ops/simplify.ts index 8cb229d8c2..164aeaf9a9 100644 --- a/packages/geom/src/ops/simplify.ts +++ b/packages/geom/src/ops/simplify.ts @@ -1,3 +1,4 @@ +import { peek } from "@thi.ng/arrays"; import { defmulti } from "@thi.ng/defmulti"; import { IShape, @@ -6,7 +7,6 @@ import { Type } from "@thi.ng/geom-api"; import { simplify as _simplify } from "@thi.ng/geom-resample"; -import { peek } from "@thi.ng/transducers"; import { Vec } from "@thi.ng/vectors"; import { dispatch } from "../internal/dispatch"; import { vertices } from "./vertices"; From 5efda384f94edf1cbfcde303e105886a23a06ad2 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:54:45 +0000 Subject: [PATCH 23/43] refactor(geom-accel): update to use @thi.ng/arrays --- packages/geom-accel/package.json | 3 ++- packages/geom-accel/src/kdtree.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/geom-accel/package.json b/packages/geom-accel/package.json index b9b802f40f..6219bd5773 100644 --- a/packages/geom-accel/package.json +++ b/packages/geom-accel/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", + "@thi.ng/arrays": "^0.0.1", "@thi.ng/geom-api": "^0.1.1", "@thi.ng/heaps": "^1.0.2", "@thi.ng/math": "^1.1.0", @@ -56,4 +57,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/geom-accel/src/kdtree.ts b/packages/geom-accel/src/kdtree.ts index 96379029e6..6ee04a4f3e 100644 --- a/packages/geom-accel/src/kdtree.ts +++ b/packages/geom-accel/src/kdtree.ts @@ -1,8 +1,8 @@ import { ICopy, Pair } from "@thi.ng/api"; +import { ensureArray } from "@thi.ng/arrays"; import { ISpatialAccel } from "@thi.ng/geom-api"; import { Heap } from "@thi.ng/heaps"; import { EPS } from "@thi.ng/math"; -import { ensureArray } from "@thi.ng/transducers"; import { distSq, ReadonlyVec, Vec } from "@thi.ng/vectors"; const CMP = (a, b) => b[0] - a[0]; From 5ce96937373ea974895cb1744e8c76a08baa6763 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:55:44 +0000 Subject: [PATCH 24/43] minor(heaps): minor updates --- packages/heaps/src/heap.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/heaps/src/heap.ts b/packages/heaps/src/heap.ts index f396ba8fd1..f2e7b8aa76 100644 --- a/packages/heaps/src/heap.ts +++ b/packages/heaps/src/heap.ts @@ -173,11 +173,11 @@ export class Heap implements if (!n) { return res; } - let x = res[n - 1], y; + let x = res[n - 1], y: T; for (let i = n, m = vals.length; i < m; i++) { y = vals[i]; if (cmp(y, x) < 0) { - res.splice(binarySearch(res, y, 0, n, cmp), 0, y); + res.splice(binarySearch(y, res, 0, n, cmp), 0, y); res.pop(); x = res[n - 1]; } @@ -244,7 +244,13 @@ export class Heap implements } } -function binarySearch(vals: T[], x: T, lo: number, hi: number, cmp: Comparator) { +const binarySearch = ( + x: T, + vals: T[], + lo: number, + hi: number, + cmp: Comparator +) => { let m; while (lo < hi) { m = (lo + hi) >>> 1; @@ -255,4 +261,4 @@ function binarySearch(vals: T[], x: T, lo: number, hi: number, cmp: Comparato } } return lo; -} +}; From 3a74bf1aa430850533f26bf77291a24e97217f82 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:56:20 +0000 Subject: [PATCH 25/43] refactor(hiccup-markdown): update to use @thi.ng/arrays --- packages/hiccup-markdown/package.json | 3 ++- packages/hiccup-markdown/src/parse.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/hiccup-markdown/package.json b/packages/hiccup-markdown/package.json index e4a790e6cf..3111c24737 100644 --- a/packages/hiccup-markdown/package.json +++ b/packages/hiccup-markdown/package.json @@ -32,6 +32,7 @@ "typescript": "^3.2.2" }, "dependencies": { + "@thi.ng/arrays": "^0.0.1", "@thi.ng/checks": "^2.1.0", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/errors": "^1.0.2", @@ -56,4 +57,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/hiccup-markdown/src/parse.ts b/packages/hiccup-markdown/src/parse.ts index 359288c269..26a5babb2d 100644 --- a/packages/hiccup-markdown/src/parse.ts +++ b/packages/hiccup-markdown/src/parse.ts @@ -1,3 +1,4 @@ +import { peek } from "@thi.ng/arrays"; import { alts, fsm, @@ -9,7 +10,6 @@ import { untilStr, whitespace } from "@thi.ng/fsm"; -import { peek } from "@thi.ng/transducers"; import { TagFactories } from "./api"; type ParseResult = ResultBody; From 5a7e44814438d8f20b0e7201b5a2e2e5cf046f99 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:57:02 +0000 Subject: [PATCH 26/43] fix(random): add opt scale arg to IRandom.float() --- packages/random/src/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/random/src/api.ts b/packages/random/src/api.ts index 3cc92b0296..2e405bc872 100644 --- a/packages/random/src/api.ts +++ b/packages/random/src/api.ts @@ -2,7 +2,7 @@ import { ICopy } from "@thi.ng/api"; export interface IRandom { int(): number; - float(): number; + float(norm?: number): number; norm(scale?: number): number; minmax(min: number, max: number): number; gaussian(samples?: number, offset?: number, scale?: number): number; From b0b41f79ac77fe895d31756f9a780dc881797158 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 14:58:04 +0000 Subject: [PATCH 27/43] refactor(examples): update to use @thi.ng/arrays --- examples/canvas-dial/package.json | 1 + examples/canvas-dial/src/dial.ts | 2 +- examples/gesture-analysis/package.json | 1 + examples/gesture-analysis/src/index.ts | 2 +- examples/rstream-hdom/package.json | 1 + examples/rstream-hdom/src/index.ts | 2 +- examples/xml-converter/package.json | 1 + examples/xml-converter/src/format.ts | 2 +- 8 files changed, 8 insertions(+), 4 deletions(-) diff --git a/examples/canvas-dial/package.json b/examples/canvas-dial/package.json index 6fe997818c..46bebe7e0a 100644 --- a/examples/canvas-dial/package.json +++ b/examples/canvas-dial/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@thi.ng/api": "latest", + "@thi.ng/arrays": "latest", "@thi.ng/checks": "latest", "@thi.ng/hdom": "latest", "@thi.ng/hdom-components": "latest", diff --git a/examples/canvas-dial/src/dial.ts b/examples/canvas-dial/src/dial.ts index cce1fe211b..48fa362893 100644 --- a/examples/canvas-dial/src/dial.ts +++ b/examples/canvas-dial/src/dial.ts @@ -1,10 +1,10 @@ import { Fn } from "@thi.ng/api"; +import { peek } from "@thi.ng/arrays"; import { isString } from "@thi.ng/checks"; import { canvas2D } from "@thi.ng/hdom-components"; import { fitClamped } from "@thi.ng/math"; import { Subscription } from "@thi.ng/rstream"; import { GestureEvent, gestureStream, GestureType } from "@thi.ng/rstream-gestures"; -import { peek } from "@thi.ng/transducers"; import { heading, sub2 } from "@thi.ng/vectors"; /** diff --git a/examples/gesture-analysis/package.json b/examples/gesture-analysis/package.json index 8c0a4f1ff9..d1b13a7fa6 100644 --- a/examples/gesture-analysis/package.json +++ b/examples/gesture-analysis/package.json @@ -15,6 +15,7 @@ "typescript": "^3.2.2" }, "dependencies": { + "@thi.ng/arrays": "latest", "@thi.ng/hiccup-svg": "latest", "@thi.ng/rstream": "latest", "@thi.ng/rstream-gestures": "latest", diff --git a/examples/gesture-analysis/src/index.ts b/examples/gesture-analysis/src/index.ts index 1d42722b09..6fb9bd0bac 100644 --- a/examples/gesture-analysis/src/index.ts +++ b/examples/gesture-analysis/src/index.ts @@ -1,3 +1,4 @@ +import { peek } from "@thi.ng/arrays"; import { polyline as gPolyline, resample, vertices } from "@thi.ng/geom"; import { circle, @@ -14,7 +15,6 @@ import { map, multiplexObj, partition, - peek, push, transduce } from "@thi.ng/transducers"; diff --git a/examples/rstream-hdom/package.json b/examples/rstream-hdom/package.json index c78c6361aa..931e769ad6 100644 --- a/examples/rstream-hdom/package.json +++ b/examples/rstream-hdom/package.json @@ -15,6 +15,7 @@ "typescript": "^3.2.2" }, "dependencies": { + "@thi.ng/arrays": "latest", "@thi.ng/rstream": "latest", "@thi.ng/transducers": "latest", "@thi.ng/transducers-hdom": "latest" diff --git a/examples/rstream-hdom/src/index.ts b/examples/rstream-hdom/src/index.ts index 56b79ba5a3..dd64e55e12 100644 --- a/examples/rstream-hdom/src/index.ts +++ b/examples/rstream-hdom/src/index.ts @@ -1,3 +1,4 @@ +import { peek } from "@thi.ng/arrays"; import { fromRAF, ISubscribable, @@ -8,7 +9,6 @@ import { } from "@thi.ng/rstream"; import { map, - peek, reducer, scan, vals diff --git a/examples/xml-converter/package.json b/examples/xml-converter/package.json index 62410ee370..cd4947d7e2 100644 --- a/examples/xml-converter/package.json +++ b/examples/xml-converter/package.json @@ -16,6 +16,7 @@ "typescript": "^3.2.2" }, "dependencies": { + "@thi.ng/arrays": "latest", "@thi.ng/checks": "latest", "@thi.ng/defmulti": "latest", "@thi.ng/rstream": "latest", diff --git a/examples/xml-converter/src/format.ts b/examples/xml-converter/src/format.ts index 13986f74e7..881661331c 100644 --- a/examples/xml-converter/src/format.ts +++ b/examples/xml-converter/src/format.ts @@ -1,3 +1,4 @@ +import { peek } from "@thi.ng/arrays"; import { isArray, isBoolean, @@ -6,7 +7,6 @@ import { } from "@thi.ng/checks"; import { DEFAULT, defmulti } from "@thi.ng/defmulti"; import { repeat } from "@thi.ng/strings"; -import { peek } from "@thi.ng/transducers"; export interface FormatOpts { indent: number; From f719724d4186eb54c6776fca4dcfe12a39cad67c Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 15:35:46 +0000 Subject: [PATCH 28/43] feat(random): add randomID() & weightedRandom() --- packages/random/src/index.ts | 3 ++ packages/random/src/random-id.ts | 28 ++++++++++++++++++ packages/random/src/weighted-random.ts | 40 ++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 packages/random/src/random-id.ts create mode 100644 packages/random/src/weighted-random.ts diff --git a/packages/random/src/index.ts b/packages/random/src/index.ts index ce7ff7a364..d928606e8f 100644 --- a/packages/random/src/index.ts +++ b/packages/random/src/index.ts @@ -4,3 +4,6 @@ export * from "./system"; export * from "./xorshift128"; export * from "./xorwow"; export * from "./xsadd"; + +export * from "./random-id"; +export * from "./weighted-random"; diff --git a/packages/random/src/random-id.ts b/packages/random/src/random-id.ts new file mode 100644 index 0000000000..fe032f51eb --- /dev/null +++ b/packages/random/src/random-id.ts @@ -0,0 +1,28 @@ +import { IRandom } from "./api"; +import { SYSTEM } from "./system"; + +/** + * Generates and returns a random string of `len` characters (default + * 4), plus optional given `prefix` and using only provided `syms` + * characters (default lowercase a-z). + * + * ``` + * randomID() + * "qgdt" + * + * randomID(8, "id-", "0123456789ABCDEF") + * "id-94EF6E1A" + * ``` + * + * @param len + * @param prefix + * @param syms + * @param rnd + */ +export const randomID = + (len = 4, prefix = "", syms = "abcdefghijklmnopqrstuvwxyz", rnd: IRandom = SYSTEM) => { + for (const n = syms.length; --len >= 0;) { + prefix += syms[rnd.float(n) | 0]; + } + return prefix; + }; diff --git a/packages/random/src/weighted-random.ts b/packages/random/src/weighted-random.ts new file mode 100644 index 0000000000..6abe7d89f1 --- /dev/null +++ b/packages/random/src/weighted-random.ts @@ -0,0 +1,40 @@ +import { IRandom } from "./api"; +import { SYSTEM } from "./system"; + +/** + * Returns a no-arg function which produces a random choice of given + * weighted `choices` and using given `IRandom` instance (default: + * `SYSTEM`). If `weights` are given, it must be the same size as + * `choices`. If omitted, each choice will have same probability. + * + * https://www.electricmonk.nl/log/2009/12/23/weighted-random-distribution/ + * + * @param choices + * @param weights + */ +export const weightedRandom = ( + choices: Array, + weights?: ArrayLike, + rnd: IRandom = SYSTEM +) => { + const opts = choices.map( + weights ? + (x, i) => <[T, number]>[x, weights[i]] : + (x) => <[T, number]>[x, 1] + ).sort((a, b) => b[1] - a[1]); + const n = choices.length; + let total = 0, i: number, r: number, sum: number; + for (i = 0; i < n; i++) { + total += opts[i][1]; + } + return () => { + r = rnd.float(total); + sum = total; + for (i = 0; i < n; i++) { + sum -= opts[i][1]; + if (sum <= r) { + return opts[i][0]; + } + } + }; +}; From 4b0eec633544d07c053c3880f1312adfcd13a64f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 15:37:42 +0000 Subject: [PATCH 29/43] refactor(transducers): remove obsolete randomID() & weightedRandom() BREAKING CHANGE: migrate randomID() & weightedRandom() to @thi.ng/random - update choices() iterator --- packages/transducers/src/func/random-id.ts | 25 ------------- .../transducers/src/func/weighted-random.ts | 36 ------------------- packages/transducers/src/iter/choices.ts | 8 ++--- 3 files changed, 4 insertions(+), 65 deletions(-) delete mode 100644 packages/transducers/src/func/random-id.ts delete mode 100644 packages/transducers/src/func/weighted-random.ts diff --git a/packages/transducers/src/func/random-id.ts b/packages/transducers/src/func/random-id.ts deleted file mode 100644 index 5979d8aed5..0000000000 --- a/packages/transducers/src/func/random-id.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IRandom, SYSTEM } from "@thi.ng/random"; -import { choices } from "../iter/choices"; -import { take } from "../xform/take"; - -/** - * Generates and returns a random string of `len` characters (default - * 4), plus optional given `prefix` and using only provided `syms` - * characters (default lowercase a-z). - * - * ``` - * randomID() - * "qgdt" - * - * randomID(8, "id-", "0123456789ABCDEF") - * "id-94EF6E1A" - * ``` - * - * @param len - * @param prefix - * @param syms - * @param rnd - */ -export const randomID = - (len = 4, prefix = "", syms = "abcdefghijklmnopqrstuvwxyz", rnd: IRandom = SYSTEM) => - [prefix, ...take(len, choices(syms, null, rnd))].join(""); diff --git a/packages/transducers/src/func/weighted-random.ts b/packages/transducers/src/func/weighted-random.ts deleted file mode 100644 index 52c26deb4d..0000000000 --- a/packages/transducers/src/func/weighted-random.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { IRandom, SYSTEM } from "@thi.ng/random"; -import { repeat } from "../iter/repeat"; -import { zip } from "../iter/zip"; - -/** - * Returns a no-arg function which produces a random choice of given - * weighted `choices`. If `weights` are given, it must be the same size - * as `choices`. If omitted, each choice will have same probability. - * - * https://www.electricmonk.nl/log/2009/12/23/weighted-random-distribution/ - * - * @param choices - * @param weights - */ -export const weightedRandom = ( - choices: ArrayLike & Iterable, - weights?: ArrayLike & Iterable, - rnd: IRandom = SYSTEM -) => { - const n = choices.length; - const opts = [...zip(choices, weights || repeat(1))].sort((a, b) => b[1] - a[1]); - let total = 0, i, r, sum; - for (i = 0; i < n; i++) { - total += opts[i][1]; - } - return () => { - r = rnd.float(total); - sum = total; - for (i = 0; i < n; i++) { - sum -= opts[i][1]; - if (sum <= r) { - return opts[i][0]; - } - } - }; -}; diff --git a/packages/transducers/src/iter/choices.ts b/packages/transducers/src/iter/choices.ts index 73858bdc26..7b21adae5e 100644 --- a/packages/transducers/src/iter/choices.ts +++ b/packages/transducers/src/iter/choices.ts @@ -1,6 +1,6 @@ -import { weightedRandom } from "../func/weighted-random"; +import { ensureArray } from "@thi.ng/arrays"; +import { IRandom, SYSTEM, weightedRandom } from "@thi.ng/random"; import { repeatedly } from "./repeatedly"; -import { IRandom, SYSTEM } from "@thi.ng/random"; /** * Returns an infinite iterator of random choices and their (optional) @@ -19,11 +19,11 @@ import { IRandom, SYSTEM } from "@thi.ng/random"; */ export const choices = ( choices: ArrayLike & Iterable, - weights?: ArrayLike & Iterable, + weights?: ArrayLike, rnd: IRandom = SYSTEM ) => repeatedly( weights ? - weightedRandom(choices, weights, rnd) : + weightedRandom(ensureArray(choices), weights, rnd) : () => choices[(rnd.float(choices.length) | 0)] ); From dd13fa9da4841d77863446746e2a6d0ce1fc0edd Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 15:49:31 +0000 Subject: [PATCH 30/43] feat(compose): add new functions - add constantly() - add delay() - add delayed() - add identity() --- packages/compose/src/constantly.ts | 4 ++++ packages/compose/src/delay.ts | 29 +++++++++++++++++++++++++++++ packages/compose/src/delayed.ts | 3 +++ packages/compose/src/identity.ts | 1 + packages/compose/src/index.ts | 4 ++++ 5 files changed, 41 insertions(+) create mode 100644 packages/compose/src/constantly.ts create mode 100644 packages/compose/src/delay.ts create mode 100644 packages/compose/src/delayed.ts create mode 100644 packages/compose/src/identity.ts diff --git a/packages/compose/src/constantly.ts b/packages/compose/src/constantly.ts new file mode 100644 index 0000000000..2f758a5fc7 --- /dev/null +++ b/packages/compose/src/constantly.ts @@ -0,0 +1,4 @@ +import { FnAny } from "@thi.ng/api"; + +export const constantly = + (x: T): FnAny => () => x; diff --git a/packages/compose/src/delay.ts b/packages/compose/src/delay.ts new file mode 100644 index 0000000000..7b7efc4064 --- /dev/null +++ b/packages/compose/src/delay.ts @@ -0,0 +1,29 @@ +import { IDeref } from "@thi.ng/api"; + +export const delay = + (body: () => T) => new Delay(body); + +export class Delay implements + IDeref { + + value: T; + protected body: () => T; + protected realized: boolean; + + constructor(body: () => T) { + this.body = body; + this.realized = false; + } + + deref() { + if (!this.realized) { + this.value = this.body(); + this.realized = true; + } + return this.value; + } + + isRealized() { + return this.realized; + } +} diff --git a/packages/compose/src/delayed.ts b/packages/compose/src/delayed.ts new file mode 100644 index 0000000000..d250ef0f57 --- /dev/null +++ b/packages/compose/src/delayed.ts @@ -0,0 +1,3 @@ +export const delayed = + (x: T, t: number) => + new Promise((resolve) => setTimeout(() => resolve(x), t)); diff --git a/packages/compose/src/identity.ts b/packages/compose/src/identity.ts new file mode 100644 index 0000000000..74efbc8cf1 --- /dev/null +++ b/packages/compose/src/identity.ts @@ -0,0 +1 @@ +export const identity = (x: T) => x; diff --git a/packages/compose/src/index.ts b/packages/compose/src/index.ts index dfddd39435..f9c76d4c74 100644 --- a/packages/compose/src/index.ts +++ b/packages/compose/src/index.ts @@ -1,4 +1,8 @@ export * from "./comp"; +export * from "./constantly"; +export * from "./delay"; +export * from "./delayed"; +export * from "./identity"; export * from "./juxt"; export * from "./partial"; export * from "./thread-first"; From 05bf2131a9c0bd91eb20c9b39eba93c512a7c479 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 17:08:01 +0000 Subject: [PATCH 31/43] refactor(transducers): restructure, migrate / remove various functions BREAKING CHANGE: migrate / remove various functions to other packages - constantly(), delay(), identity() => @thi.ng/compose - randomID(), weightedRandom() => @thi.ng/random - remove re-exports: - even(), odd() (from @thi.ng/checks) - juxt() (from @thi.ng/compose) - remove obsolete hex() fn (use @thi.ng/strings fns instead) --- packages/transducers/src/func/constantly.ts | 2 -- packages/transducers/src/func/delay.ts | 3 --- packages/transducers/src/func/even.ts | 1 - packages/transducers/src/func/hex.ts | 10 ---------- packages/transducers/src/func/identity.ts | 1 - packages/transducers/src/func/juxt.ts | 3 --- packages/transducers/src/func/odd.ts | 1 - packages/transducers/src/index.ts | 9 --------- packages/transducers/src/rfn/frequencies.ts | 2 +- packages/transducers/src/rfn/group-by-map.ts | 4 ++-- packages/transducers/src/rfn/group-by-obj.ts | 2 +- packages/transducers/src/step.ts | 2 +- packages/transducers/src/xform/delayed.ts | 6 +++--- packages/transducers/src/xform/keep.ts | 2 +- packages/transducers/src/xform/moving-median.ts | 2 +- packages/transducers/src/xform/multiplex.ts | 2 +- packages/transducers/src/xform/partition-sort.ts | 3 +-- packages/transducers/src/xform/partition-sync.ts | 2 +- packages/transducers/src/xform/stream-sort.ts | 2 +- packages/transducers/test/permutations.ts | 4 ++-- 20 files changed, 16 insertions(+), 47 deletions(-) delete mode 100644 packages/transducers/src/func/constantly.ts delete mode 100644 packages/transducers/src/func/delay.ts delete mode 100644 packages/transducers/src/func/even.ts delete mode 100644 packages/transducers/src/func/hex.ts delete mode 100644 packages/transducers/src/func/identity.ts delete mode 100644 packages/transducers/src/func/juxt.ts delete mode 100644 packages/transducers/src/func/odd.ts diff --git a/packages/transducers/src/func/constantly.ts b/packages/transducers/src/func/constantly.ts deleted file mode 100644 index 514541cc8d..0000000000 --- a/packages/transducers/src/func/constantly.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const constantly = - (x: T): (...args: any[]) => T => () => x; diff --git a/packages/transducers/src/func/delay.ts b/packages/transducers/src/func/delay.ts deleted file mode 100644 index c276804747..0000000000 --- a/packages/transducers/src/func/delay.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const delay = - (x: T, t: number) => - new Promise((resolve) => setTimeout(() => resolve(x), t)); diff --git a/packages/transducers/src/func/even.ts b/packages/transducers/src/func/even.ts deleted file mode 100644 index 4fecc9bc95..0000000000 --- a/packages/transducers/src/func/even.ts +++ /dev/null @@ -1 +0,0 @@ -export { isEven as even } from "@thi.ng/checks"; diff --git a/packages/transducers/src/func/hex.ts b/packages/transducers/src/func/hex.ts deleted file mode 100644 index c2d5d6eb94..0000000000 --- a/packages/transducers/src/func/hex.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { radix, Stringer } from "@thi.ng/strings"; - -/** - * @deprecated use thi.ng/strings `radix()` instead - * - * @param digits - * @param prefix - */ -export const hex = (digits = 2, prefix = ""): Stringer => - radix(16, digits, prefix); diff --git a/packages/transducers/src/func/identity.ts b/packages/transducers/src/func/identity.ts deleted file mode 100644 index 74efbc8cf1..0000000000 --- a/packages/transducers/src/func/identity.ts +++ /dev/null @@ -1 +0,0 @@ -export const identity = (x: T) => x; diff --git a/packages/transducers/src/func/juxt.ts b/packages/transducers/src/func/juxt.ts deleted file mode 100644 index 00b819d738..0000000000 --- a/packages/transducers/src/func/juxt.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { juxt as _juxt } from "@thi.ng/compose"; - -export const juxt = _juxt; diff --git a/packages/transducers/src/func/odd.ts b/packages/transducers/src/func/odd.ts deleted file mode 100644 index ab3065656e..0000000000 --- a/packages/transducers/src/func/odd.ts +++ /dev/null @@ -1 +0,0 @@ -export { isOdd as odd } from "@thi.ng/checks"; diff --git a/packages/transducers/src/index.ts b/packages/transducers/src/index.ts index 03f409a86c..9201dedd9c 100644 --- a/packages/transducers/src/index.ts +++ b/packages/transducers/src/index.ts @@ -94,20 +94,11 @@ export * from "./xform/word-wrap"; export * from "./func/comp"; export * from "./func/compr"; -export * from "./func/constantly"; export * from "./func/deep-transform"; -export * from "./func/delay"; -export * from "./func/even"; -export * from "./func/hex"; -export * from "./func/identity"; -export * from "./func/juxt"; export * from "./func/juxtr"; export * from "./func/key-selector"; export * from "./func/lookup"; -export * from "./func/odd"; -export * from "./func/random-id"; export * from "./func/renamer"; -export * from "./func/weighted-random"; export * from "./iter/as-iterable"; export * from "./iter/choices"; diff --git a/packages/transducers/src/rfn/frequencies.ts b/packages/transducers/src/rfn/frequencies.ts index 1fa9467aa0..ac8794560d 100644 --- a/packages/transducers/src/rfn/frequencies.ts +++ b/packages/transducers/src/rfn/frequencies.ts @@ -1,6 +1,6 @@ import { Fn } from "@thi.ng/api"; +import { identity } from "@thi.ng/compose"; import { Reducer } from "../api"; -import { identity } from "../func/identity"; import { $$reduce } from "../reduce"; import { count } from "./count"; import { groupByMap } from "./group-by-map"; diff --git a/packages/transducers/src/rfn/group-by-map.ts b/packages/transducers/src/rfn/group-by-map.ts index 279d2b1eb8..cfeef605b5 100644 --- a/packages/transducers/src/rfn/group-by-map.ts +++ b/packages/transducers/src/rfn/group-by-map.ts @@ -1,5 +1,5 @@ -import { Reducer, GroupByOpts } from "../api"; -import { identity } from "../func/identity"; +import { identity } from "@thi.ng/compose"; +import { GroupByOpts, Reducer } from "../api"; import { $$reduce, reducer } from "../reduce"; import { push } from "./push"; diff --git a/packages/transducers/src/rfn/group-by-obj.ts b/packages/transducers/src/rfn/group-by-obj.ts index 0e075ed96c..5128f646c3 100644 --- a/packages/transducers/src/rfn/group-by-obj.ts +++ b/packages/transducers/src/rfn/group-by-obj.ts @@ -1,6 +1,6 @@ import { IObjectOf } from "@thi.ng/api"; +import { identity } from "@thi.ng/compose"; import { GroupByOpts, Reducer } from "../api"; -import { identity } from "../func/identity"; import { $$reduce, reducer } from "../reduce"; import { push } from "./push"; diff --git a/packages/transducers/src/step.ts b/packages/transducers/src/step.ts index eda33f1227..c6ab9d9c99 100644 --- a/packages/transducers/src/step.ts +++ b/packages/transducers/src/step.ts @@ -22,7 +22,7 @@ import { push } from "./rfn/push"; * // [ 1, 2, 3 ] * * // no result - * f = step(filter(even)) + * f = step(filter((x) => !(x & 1))) * f(1); // undefined * f(2); // 2 * diff --git a/packages/transducers/src/xform/delayed.ts b/packages/transducers/src/xform/delayed.ts index 5cadd02718..0b8718d2bd 100644 --- a/packages/transducers/src/xform/delayed.ts +++ b/packages/transducers/src/xform/delayed.ts @@ -1,9 +1,9 @@ import { Transducer } from "../api"; -import { delay } from "../func/delay"; +import { delayed as _delayed } from "@thi.ng/compose"; import { map } from "./map"; /** - * Yields transducer which wraps incoming values in promises, which + * Yields transducer which wraps incoming values in promises, which each * resolve after specified delay time (in ms). * * **Only to be used in async contexts and NOT with `transduce` @@ -13,4 +13,4 @@ import { map } from "./map"; */ export const delayed = (t: number): Transducer> => - map((x) => delay(x, t)); + map((x) => _delayed(x, t)); diff --git a/packages/transducers/src/xform/keep.ts b/packages/transducers/src/xform/keep.ts index 56110331d0..4b16e7fc3a 100644 --- a/packages/transducers/src/xform/keep.ts +++ b/packages/transducers/src/xform/keep.ts @@ -1,6 +1,6 @@ +import { identity } from "@thi.ng/compose"; import { Reducer, Transducer } from "../api"; import { compR } from "../func/compr"; -import { identity } from "../func/identity"; import { $iter } from "../iterator"; export function keep(pred?: (x: T) => any): Transducer; diff --git a/packages/transducers/src/xform/moving-median.ts b/packages/transducers/src/xform/moving-median.ts index 7833f27d1a..8f8b044075 100644 --- a/packages/transducers/src/xform/moving-median.ts +++ b/packages/transducers/src/xform/moving-median.ts @@ -1,7 +1,7 @@ import { compare as cmp } from "@thi.ng/compare"; +import { identity } from "@thi.ng/compose"; import { SortOpts, Transducer } from "../api"; import { comp } from "../func/comp"; -import { identity } from "../func/identity"; import { $iter } from "../iterator"; import { map } from "./map"; import { partition } from "./partition"; diff --git a/packages/transducers/src/xform/multiplex.ts b/packages/transducers/src/xform/multiplex.ts index 5b0d6c25d0..8d3ab9c5d5 100644 --- a/packages/transducers/src/xform/multiplex.ts +++ b/packages/transducers/src/xform/multiplex.ts @@ -1,5 +1,5 @@ +import { juxt } from "@thi.ng/compose"; import { Transducer } from "../api"; -import { juxt } from "../func/juxt"; import { step } from "../step"; import { map } from "./map"; diff --git a/packages/transducers/src/xform/partition-sort.ts b/packages/transducers/src/xform/partition-sort.ts index 625d3032c5..d4efaa780d 100644 --- a/packages/transducers/src/xform/partition-sort.ts +++ b/packages/transducers/src/xform/partition-sort.ts @@ -1,8 +1,7 @@ import { compare as cmp } from "@thi.ng/compare"; - +import { identity } from "@thi.ng/compose"; import { SortOpts, Transducer } from "../api"; import { comp } from "../func/comp"; -import { identity } from "../func/identity"; import { $iter, iterator } from "../iterator"; import { mapcat } from "./mapcat"; import { partition } from "./partition"; diff --git a/packages/transducers/src/xform/partition-sync.ts b/packages/transducers/src/xform/partition-sync.ts index c02e180bde..8b6f1b9afd 100644 --- a/packages/transducers/src/xform/partition-sync.ts +++ b/packages/transducers/src/xform/partition-sync.ts @@ -1,7 +1,7 @@ import { IObjectOf } from "@thi.ng/api"; import { isArray } from "@thi.ng/checks"; +import { identity } from "@thi.ng/compose"; import { Reducer, Transducer } from "../api"; -import { identity } from "../func/identity"; import { $iter, iterator } from "../iterator"; export interface PartitionSyncOpts { diff --git a/packages/transducers/src/xform/stream-sort.ts b/packages/transducers/src/xform/stream-sort.ts index 2b54136657..37c8e75bdc 100644 --- a/packages/transducers/src/xform/stream-sort.ts +++ b/packages/transducers/src/xform/stream-sort.ts @@ -1,7 +1,7 @@ import { binarySearch } from "@thi.ng/arrays"; import { compare as cmp } from "@thi.ng/compare"; +import { identity } from "@thi.ng/compose"; import { Reducer, SortOpts, Transducer } from "../api"; -import { identity } from "../func/identity"; import { $iter, iterator } from "../iterator"; import { isReduced } from "../reduced"; diff --git a/packages/transducers/test/permutations.ts b/packages/transducers/test/permutations.ts index ad3ce8a60a..241f45b265 100644 --- a/packages/transducers/test/permutations.ts +++ b/packages/transducers/test/permutations.ts @@ -1,4 +1,4 @@ -import { swizzler } from "@thi.ng/arrays"; +import { swizzle } from "@thi.ng/arrays"; import { permutations, permutationsN } from "../src/iter/permutations"; import { range } from "../src/iter/range"; import { iterator } from "../src/iterator"; @@ -41,7 +41,7 @@ describe("permutations", () => { }); it("swizzle", () => { assert.deepEqual( - [...iterator(map((x: string[]) => swizzler(x)({ x: 0, y: 1, z: 2 })), permutations("xyz", "xyz", "xyz"))], + [...iterator(map((x: string[]) => swizzle(x)({ x: 0, y: 1, z: 2 })), permutations("xyz", "xyz", "xyz"))], [...permutationsN(3)] ); }); From e9d57fcd720a1b44963bd75e4abf066fd9fa76b0 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 17:41:53 +0000 Subject: [PATCH 32/43] fix(compose): add varargs override for jux(), add tests --- packages/compose/src/juxt.ts | 5 +- packages/compose/test/delay.ts | 15 +++++ packages/compose/test/index.ts | 6 -- packages/compose/test/juxt.ts | 98 ++++++++++++++++++++++++++++++++ packages/compose/test/partial.ts | 41 +++++++++++++ 5 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 packages/compose/test/delay.ts delete mode 100644 packages/compose/test/index.ts create mode 100644 packages/compose/test/juxt.ts create mode 100644 packages/compose/test/partial.ts diff --git a/packages/compose/src/juxt.ts b/packages/compose/src/juxt.ts index 4064f77b1c..a2b6167f0b 100644 --- a/packages/compose/src/juxt.ts +++ b/packages/compose/src/juxt.ts @@ -8,7 +8,8 @@ export function juxt(a: Fn, b: Fn, c: Fn, d: export function juxt(a: Fn, b: Fn, c: Fn, d: Fn, e: Fn, f: Fn): Fn; export function juxt(a: Fn, b: Fn, c: Fn, d: Fn, e: Fn, f: Fn, g: Fn): Fn; export function juxt(a: Fn, b: Fn, c: Fn, d: Fn, e: Fn, f: Fn, g: Fn, h: Fn): Fn; -export function juxt(...fns: Fn[]) { +export function juxt(a: Fn, b: Fn, c: Fn, d: Fn, e: Fn, f: Fn, g: Fn, h: Fn, ...xs: Fn[]): Fn; +export function juxt(...fns: Fn[]) { const [a, b, c, d, e, f, g, h] = fns; switch (fns.length) { case 1: @@ -28,7 +29,7 @@ export function juxt(...fns: Fn[]) { case 8: return (x) => [a(x), b(x), c(x), d(x), e(x), f(x), g(x), h(x)]; default: - return (x: any) => { + return (x: T) => { let res = new Array(fns.length); for (let i = fns.length; --i >= 0;) { res[i] = fns[i](x); diff --git a/packages/compose/test/delay.ts b/packages/compose/test/delay.ts new file mode 100644 index 0000000000..a03b216410 --- /dev/null +++ b/packages/compose/test/delay.ts @@ -0,0 +1,15 @@ +import { delay } from "../src"; + +import * as assert from "assert"; + +describe("delay", () => { + + it("only executes once", () => { + let num = 0; + const a = delay(() => ++num); + assert(!a.isRealized()); + assert.equal(a.deref(), 1); + assert.equal(a.deref(), 1); + assert(a.isRealized()); + }); +}); diff --git a/packages/compose/test/index.ts b/packages/compose/test/index.ts deleted file mode 100644 index 1a976f7f80..0000000000 --- a/packages/compose/test/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// import * as assert from "assert"; -// import * as compose from "../src/index"; - -describe("compose", () => { - it("tests pending"); -}); diff --git a/packages/compose/test/juxt.ts b/packages/compose/test/juxt.ts new file mode 100644 index 0000000000..394cdb427b --- /dev/null +++ b/packages/compose/test/juxt.ts @@ -0,0 +1,98 @@ +import { juxt } from "../src"; + +import * as assert from "assert"; + +describe("juxt", () => { + + it("2-args", () => { + const a = juxt( + (x: number) => x + 1, + (x: number) => x * 10 + ); + assert.deepEqual(a(1), [2, 10]); + }); + + it("3-args", () => { + const a = juxt( + (x: number) => x + 1, + (x: number) => x * 10, + (x: number) => "id-" + x + ); + assert.deepEqual(a(1), [2, 10, "id-1"]); + }); + + it("4-args", () => { + const a = juxt( + (x: number) => x + 1, + (x: number) => x * 10, + (x: number) => "id-" + x, + (x: number) => [x, x], + ); + assert.deepEqual(a(1), [2, 10, "id-1", [1, 1]]); + }); + + it("5-args", () => { + const a = juxt( + (x: number) => x + 1, + (x: number) => x * 10, + (x: number) => "id-" + x, + (x: number) => [x, x], + (x: number) => ({ a: x }), + ); + assert.deepEqual(a(1), [2, 10, "id-1", [1, 1], { a: 1 }]); + }); + + it("6-args", () => { + const a = juxt( + (x: number) => x + 1, + (x: number) => x - 1, + (x: number) => x * 10, + (x: number) => "id-" + x, + (x: number) => [x, x], + (x: number) => ({ a: x }), + ); + assert.deepEqual(a(1), [2, 0, 10, "id-1", [1, 1], { a: 1 }]); + }); + + it("7-args", () => { + const a = juxt( + (x: number) => x + 1, + (x: number) => x - 1, + (x: number) => x * 10, + (x: number) => x * 100, + (x: number) => "id-" + x, + (x: number) => [x, x], + (x: number) => ({ a: x }), + ); + assert.deepEqual(a(1), [2, 0, 10, 100, "id-1", [1, 1], { a: 1 }]); + }); + + it("8-args", () => { + const a = juxt( + (x: number) => x + 1, + (x: number) => x - 1, + (x: number) => x * 10, + (x: number) => x * 100, + (x: number) => x * 1000, + (x: number) => "id-" + x, + (x: number) => [x, x], + (x: number) => ({ a: x }), + ); + assert.deepEqual(a(1), [2, 0, 10, 100, 1000, "id-1", [1, 1], { a: 1 }]); + }); + + it("9-args", () => { + const a = juxt( + (x: number) => x + 1, + (x: number) => x - 1, + (x: number) => x * 10, + (x: number) => x * 100, + (x: number) => x * 1000, + (x: number) => x * 10000, + (x: number) => "id-" + x, + (x: number) => [x, x], + (x: number) => ({ a: x }), + ); + assert.deepEqual(a(1), [2, 0, 10, 100, 1000, 10000, "id-1", [1, 1], { a: 1 }]); + }); +}); diff --git a/packages/compose/test/partial.ts b/packages/compose/test/partial.ts new file mode 100644 index 0000000000..9c154f31bf --- /dev/null +++ b/packages/compose/test/partial.ts @@ -0,0 +1,41 @@ +import { partial } from "../src"; + +import * as assert from "assert"; + +describe("partial", () => { + + const fn = (a, b, c, d, e, f, g, h, i) => [a, b, c, d, e, f, g, h, i]; + const res = [0, 1, 2, 3, 4, 5, 6, 7, 8]; + + it("1-arg", () => { + assert.deepEqual(partial(fn, 0)(1, 2, 3, 4, 5, 6, 7, 8), res); + }); + + it("2-arg", () => { + assert.deepEqual(partial(fn, 0, 1)(2, 3, 4, 5, 6, 7, 8), res); + }); + + it("3-arg", () => { + assert.deepEqual(partial(fn, 0, 1, 2)(3, 4, 5, 6, 7, 8), res); + }); + + it("4-arg", () => { + assert.deepEqual(partial(fn, 0, 1, 2, 3)(4, 5, 6, 7, 8), res); + }); + + it("5-arg", () => { + assert.deepEqual(partial(fn, 0, 1, 2, 3, 4)(5, 6, 7, 8), res); + }); + + it("6-arg", () => { + assert.deepEqual(partial(fn, 0, 1, 2, 3, 4, 5)(6, 7, 8), res); + }); + + it("7-arg", () => { + assert.deepEqual(partial(fn, 0, 1, 2, 3, 4, 5, 6)(7, 8), res); + }); + + it("8-arg", () => { + assert.deepEqual(partial(fn, 0, 1, 2, 3, 4, 5, 6, 7)(8), res); + }); +}); From d6e3c3870f8e618526205e4d3fe49157405fc07f Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 19:04:20 +0000 Subject: [PATCH 33/43] docs(malloc): update readme --- packages/malloc/README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/malloc/README.md b/packages/malloc/README.md index 4eb7bc6adc..111d8aca47 100644 --- a/packages/malloc/README.md +++ b/packages/malloc/README.md @@ -19,6 +19,8 @@ This project is part of the - [`mallocAs(type: Type, num: number)`](#mallocastype-type-num-number) - [`calloc(size: number)`](#callocsize-number) - [`callocAs(type: Type, num: number)`](#callocastype-type-num-number) + - [`realloc(addr: number, size: number)`](#reallocaddr-number-size-number) + - [`reallocArray(buf: TypedArray, num: number)`](#reallocarraybuf-typedarray-num-number) - [`free(addr: number | TypedArray)`](#freeaddr-number--typedarray) - [`freeAll()`](#freeall) - [`release()`](#release) @@ -35,8 +37,9 @@ TypeScript port of [thi.ng/tinyalloc](https://github.com/thi-ng/tinyalloc), for raw or typed array memory pooling and/or hybrid JS/WASM use cases etc. Supports free block compaction and configurable splitting. Unlike the original, -this implementation does not constrain the overall number of blocks in -use and the only imposed limit is that of the underlying array buffer. +this implementation also supports `realloc()` and does not constrain the +overall number of blocks in use and the only imposed limit is that of +the underlying array buffer. Each `MemPool` instance operates on a single large `ArrayBuffer` used as backing memory chunk, e.g. the same buffer used by a WASM module. @@ -172,6 +175,19 @@ preferred over `malloc()`. Like `mallocAs()` but zeroes allocated block before returning. +### `realloc(addr: number, size: number)` + +Attempts to adjust the size of the block at the given allocated address +to new `size` or if not possible, attempt to allocate a new block and +copies contents of current block (if successful, automatically frees old +address). Returns new address if successful or else 0. + +### `reallocArray(buf: TypedArray, num: number)` + +Similar to `realloc()`, but takes a typed array created with +`mallocAs()` / `callocAs()` and returns new arrays of same type or +`null` if re-allocation wasn't possible. + ### `free(addr: number | TypedArray)` Releases given address or array view back into the pool. Returns `true` From 77ed4c54b327bed1308cf6841da591780ba430c8 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Tue, 12 Feb 2019 19:41:51 +0000 Subject: [PATCH 34/43] fix(transducers-binary): update juxt import --- packages/transducers-binary/package.json | 3 ++- packages/transducers-binary/src/hex-dump.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/transducers-binary/package.json b/packages/transducers-binary/package.json index cff3b38638..d2f9ac18ef 100644 --- a/packages/transducers-binary/package.json +++ b/packages/transducers-binary/package.json @@ -32,6 +32,7 @@ "typescript": "^3.2.2" }, "dependencies": { + "@thi.ng/compose": "^1.0.2", "@thi.ng/strings": "^1.0.3", "@thi.ng/transducers": "^4.0.1" }, @@ -55,4 +56,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/transducers-binary/src/hex-dump.ts b/packages/transducers-binary/src/hex-dump.ts index 5956e2868f..91a7ded3a1 100644 --- a/packages/transducers-binary/src/hex-dump.ts +++ b/packages/transducers-binary/src/hex-dump.ts @@ -1,9 +1,9 @@ +import { juxt } from "@thi.ng/compose"; import { U32, U8 } from "@thi.ng/strings"; import { $iter, comp, iterator, - juxt, map, mapIndexed, padLast, From 51959b757ca4dd4e517acf2b520563e113f62e74 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 13 Feb 2019 22:15:54 +0000 Subject: [PATCH 35/43] fix(geom-accel): fix addAll(), addKeys() --- packages/geom-accel/src/kdtree.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/geom-accel/src/kdtree.ts b/packages/geom-accel/src/kdtree.ts index 6ee04a4f3e..c55a0c0052 100644 --- a/packages/geom-accel/src/kdtree.ts +++ b/packages/geom-accel/src/kdtree.ts @@ -123,7 +123,7 @@ export class KdTree implements addAll(pts: Iterable>, eps = EPS) { let ok = true; for (let [k, v] of pts) { - ok = ok && this.add(k, v, eps); + ok = this.add(k, v, eps) && ok; } return ok; } @@ -135,7 +135,7 @@ export class KdTree implements addKeys(ks: Iterable>, eps = EPS) { let ok = true; for (let k of ks) { - ok = ok && this.add(k, null, eps); + ok = this.add(k, null, eps) && ok; } return ok; } From 0007152d4ec1df7aff8dc50246fdb2c29d584993 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 14 Feb 2019 11:39:04 +0000 Subject: [PATCH 36/43] feat(arrays): add find/findIndex() --- packages/arrays/src/find.ts | 32 ++++++++++++++++++++++++++++++++ packages/arrays/src/index.ts | 1 + 2 files changed, 33 insertions(+) create mode 100644 packages/arrays/src/find.ts diff --git a/packages/arrays/src/find.ts b/packages/arrays/src/find.ts new file mode 100644 index 0000000000..206016fc28 --- /dev/null +++ b/packages/arrays/src/find.ts @@ -0,0 +1,32 @@ +import { Predicate2 } from "@thi.ng/api"; +import { equiv as _equiv } from "@thi.ng/equiv"; + +/** + * Similar to `Array.find()`, but uses thi.ng/equiv as default + * predicate. + * + * @param src + * @param x + * @param equiv + */ +export const find = + (src: ArrayLike, x: T, equiv: Predicate2 = _equiv) => { + const i = findIndex(src, x, equiv); + return i !== -1 ? src[i] : undefined; + }; + +/** + * Similar to `Array.findIndex()`, but uses thi.ng/equiv as default + * predicate. + * + * @param src + * @param x + * @param equiv + */ +export const findIndex = + (src: ArrayLike, x: T, equiv: Predicate2 = _equiv) => { + for (let i = src.length; --i >= 0;) { + if (equiv(x, src[i])) return i; + } + return -1; + }; diff --git a/packages/arrays/src/index.ts b/packages/arrays/src/index.ts index b1edbe0ed5..fa06b5b5a9 100644 --- a/packages/arrays/src/index.ts +++ b/packages/arrays/src/index.ts @@ -2,6 +2,7 @@ export * from "./binary-search"; export * from "./ends-with"; export * from "./ensure-array"; export * from "./ensure-iterable"; +export * from "./find"; export * from "./fuzzy-match"; export * from "./peek"; export * from "./shuffle"; From b01abaa5fbe4dff191d3b648902c188dfe7e52e5 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 14 Feb 2019 11:40:01 +0000 Subject: [PATCH 37/43] refactor(arrays): update arg order, fix shuffle() --- packages/arrays/src/binary-search.ts | 4 ++-- packages/arrays/src/fuzzy-match.ts | 4 ++-- packages/arrays/src/shuffle.ts | 13 ++++++++++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/arrays/src/binary-search.ts b/packages/arrays/src/binary-search.ts index 5c94498386..ac9e708806 100644 --- a/packages/arrays/src/binary-search.ts +++ b/packages/arrays/src/binary-search.ts @@ -12,14 +12,14 @@ import { compare } from "@thi.ng/compare"; * to identify the index of `x`. The sort order of `buf` MUST be * compatible with that of `cmp`. * - * @param x * @param buf + * @param x * @param key * @param cmp */ export const binarySearch = ( - x: A, buf: ArrayLike, + x: A, key: Fn = (x) => x, cmp: Comparator = compare, ) => { diff --git a/packages/arrays/src/fuzzy-match.ts b/packages/arrays/src/fuzzy-match.ts index 1ef5a598be..b318a01d53 100644 --- a/packages/arrays/src/fuzzy-match.ts +++ b/packages/arrays/src/fuzzy-match.ts @@ -13,13 +13,13 @@ import { equiv as _eq } from "@thi.ng/equiv"; * * @see thi.ng/transducers/xform/filterFuzzy * - * @param query * @param domain + * @param query * @param equiv */ export const fuzzyMatch = ( - query: ArrayLike, domain: ArrayLike, + query: ArrayLike, equiv: Predicate2 = _eq ) => { const nd = domain.length; diff --git a/packages/arrays/src/shuffle.ts b/packages/arrays/src/shuffle.ts index 8e96af68cd..00821211b3 100644 --- a/packages/arrays/src/shuffle.ts +++ b/packages/arrays/src/shuffle.ts @@ -1,8 +1,19 @@ import { IRandom, SYSTEM } from "@thi.ng/random"; +/** + * Shuffles the first `n` items of given array, using Fisher-yates and + * optional `rnd` PRNG. If `n` is `undefined`, the entire array will be + * shuffled. + * + * + * @param buf + * @param n + * @param rnd + */ export const shuffle = (buf: any[], n = buf.length, rnd: IRandom = SYSTEM) => { - const l = buf.length; + n = Math.min(n, buf.length); + const l = n; if (l > 1) { n = Math.min(n, l); while (--n >= 0) { From f95ab38cfeaad74086a7656f0363a98094169e07 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Thu, 14 Feb 2019 11:41:23 +0000 Subject: [PATCH 38/43] refactor(transducers): update thi.ng/arrays call sites --- packages/transducers/src/xform/filter-fuzzy.ts | 2 +- packages/transducers/src/xform/stream-sort.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/transducers/src/xform/filter-fuzzy.ts b/packages/transducers/src/xform/filter-fuzzy.ts index 3f68bebf5b..34235a37bf 100644 --- a/packages/transducers/src/xform/filter-fuzzy.ts +++ b/packages/transducers/src/xform/filter-fuzzy.ts @@ -35,6 +35,6 @@ export function filterFuzzy(...args: any[]): any { const query: ArrayLike = args[0]; const { key, equiv } = >(args[1] || {}); return filter( - (x: A) => fuzzyMatch(query, key != null ? key(x) : x, equiv) + (x: A) => fuzzyMatch(key != null ? key(x) : x, query, equiv) ); } diff --git a/packages/transducers/src/xform/stream-sort.ts b/packages/transducers/src/xform/stream-sort.ts index 37c8e75bdc..86b42e6927 100644 --- a/packages/transducers/src/xform/stream-sort.ts +++ b/packages/transducers/src/xform/stream-sort.ts @@ -44,7 +44,7 @@ export function streamSort(...args: any[]): any { return complete(acc); }, (acc, x) => { - const idx = binarySearch(x, buf, key, compare); + const idx = binarySearch(buf, x, key, compare); buf.splice(idx < 0 ? -(idx + 1) : idx, 0, x); if (buf.length === n) { acc = reduce(acc, buf.shift()); From 161d19d23aebd0f95dd36d4a6f849112b5be36bd Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 15 Feb 2019 13:03:52 +0000 Subject: [PATCH 39/43] feat(vectors): add fit, fit01, fit11 fns --- packages/vectors/src/fit.ts | 12 ++++++++++++ packages/vectors/src/index.ts | 1 + 2 files changed, 13 insertions(+) create mode 100644 packages/vectors/src/fit.ts diff --git a/packages/vectors/src/fit.ts b/packages/vectors/src/fit.ts new file mode 100644 index 0000000000..e40ec05aa0 --- /dev/null +++ b/packages/vectors/src/fit.ts @@ -0,0 +1,12 @@ +import { fit as _fit, fit01 as _fit01, fit11 as _fit11 } from "@thi.ng/math"; +import { ARGS_VVV, defHofOp } from "./internal/codegen"; +import { HOF_VVV, HOF_VVVVV } from "./internal/templates"; + +export const [fit, fit2, fit3, fit4] = + defHofOp(_fit, HOF_VVVVV, "o,a,b,c,d,e"); + +export const [fit01, fit01_2, fit01_3, fit01_4] = + defHofOp(_fit01, HOF_VVV, ARGS_VVV); + +export const [fit11, fit11_2, fit11_3, fit11_4] = + defHofOp(_fit11, HOF_VVV, ARGS_VVV); diff --git a/packages/vectors/src/index.ts b/packages/vectors/src/index.ts index 668fa0a8c2..355e027bc5 100644 --- a/packages/vectors/src/index.ts +++ b/packages/vectors/src/index.ts @@ -46,6 +46,7 @@ export * from "./empty"; export * from "./eqdelta"; export * from "./exp"; export * from "./face-forward"; +export * from "./fit"; export * from "./floor"; export * from "./fract"; export * from "./gvec"; From 74d77f3501233e0eaa9681f90f3fdd1624292baf Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 15 Feb 2019 13:04:58 +0000 Subject: [PATCH 40/43] refactor(vectors): improve tpl reuse --- packages/vectors/src/internal/templates.ts | 1 + packages/vectors/src/max.ts | 3 ++- packages/vectors/src/min.ts | 3 ++- packages/vectors/src/mod.ts | 6 ++---- packages/vectors/src/modn.ts | 6 ++---- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/vectors/src/internal/templates.ts b/packages/vectors/src/internal/templates.ts index a8acfdd1e3..2381cd3260 100644 --- a/packages/vectors/src/internal/templates.ts +++ b/packages/vectors/src/internal/templates.ts @@ -10,6 +10,7 @@ export const SET = ([o, a]) => `${o}=${a};`; export const SET_N = ([a]) => `${a}=n;` export const HOF_VVV = ([o, a, b, c]) => `${o}=op(${a},${b},${c});`; +export const HOF_VVVVV = ([o, a, b, c, d, e]) => `${o}=op(${a},${b},${c},${d},${e});` export const ADDM = ([o, a, b, c]) => `${o}=(${a}+${b})*${c};`; export const ADDM_N = ([o, a, b]) => `${o}=(${a}+${b})*n;`; diff --git a/packages/vectors/src/max.ts b/packages/vectors/src/max.ts index 020df3486b..dfb842f521 100644 --- a/packages/vectors/src/max.ts +++ b/packages/vectors/src/max.ts @@ -1,5 +1,6 @@ import { MultiVecOpVV, VecOpVV } from "./api"; import { defOp } from "./internal/codegen"; +import { FN2 } from "./internal/templates"; export const [max, max2, max3, max4] = - defOp(([o, a, b]) => `${o}=Math.max(${a},${b});`); + defOp(FN2("Math.max")); diff --git a/packages/vectors/src/min.ts b/packages/vectors/src/min.ts index b118587dcf..c70b77a965 100644 --- a/packages/vectors/src/min.ts +++ b/packages/vectors/src/min.ts @@ -1,5 +1,6 @@ import { MultiVecOpVV, VecOpVV } from "./api"; import { defOp } from "./internal/codegen"; +import { FN2 } from "./internal/templates"; export const [min, min2, min3, min4] = - defOp(([o, a, b]) => `${o}=Math.min(${a},${b});`); + defOp(FN2("Math.min")); diff --git a/packages/vectors/src/mod.ts b/packages/vectors/src/mod.ts index c5bb5091cc..2909107024 100644 --- a/packages/vectors/src/mod.ts +++ b/packages/vectors/src/mod.ts @@ -1,5 +1,3 @@ -import { MultiVecOpVV, VecOpVV } from "./api"; -import { defOp } from "./internal/codegen"; +import { defMathOp } from "./internal/codegen"; -export const [mod, mod2, mod3, mod4] = - defOp(([o, a, b]) => `${o}=${a}%${b};`); +export const [mod, mod2, mod3, mod4] = defMathOp("%"); diff --git a/packages/vectors/src/modn.ts b/packages/vectors/src/modn.ts index 4f570a719e..3ce1a88e85 100644 --- a/packages/vectors/src/modn.ts +++ b/packages/vectors/src/modn.ts @@ -1,5 +1,3 @@ -import { MultiVecOpVN, VecOpVN } from "./api"; -import { ARGS_VN, defOp } from "./internal/codegen"; +import { defMathNOp } from "./internal/codegen"; -export const [modN, modN2, modN3, modN4] = - defOp(([o, a]) => `${o}=${a}%n;`, ARGS_VN); +export const [modN, modN2, modN3, modN4] = defMathNOp("%"); From e0bad9c9faca058f22ae521a01e0f2bebf4c8867 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 15 Feb 2019 13:20:22 +0000 Subject: [PATCH 41/43] docs(vectors): update readme --- packages/vectors/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/vectors/README.md b/packages/vectors/README.md index 30106d2959..c17ae662c4 100644 --- a/packages/vectors/README.md +++ b/packages/vectors/README.md @@ -276,6 +276,9 @@ Functions for memory mapped, strided vectors (without requiring wrappers): ### Interpolation +- `fit` / `fit2` / `fit3` / `fit4` +- `fit01` / `fit01_2` / `fit01_3` / `fit01_4` +- `fit11` / `fit11_2` / `fit11_3` / `fit11_4` - `mix` / `mix2` / `mix3` / `mix4` - `mixN` / `mixN2` / `mixN3` / `mixN4` - `mixBilinear` / `mixBilinear2` / `mixBilinear3` / `mixBilinear4` From e7bc075c1c6611d601614ac4a08e5d974b354e8d Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 15 Feb 2019 13:48:02 +0000 Subject: [PATCH 42/43] build: add missing pkg descriptions --- packages/bencode/package.json | 2 +- packages/color/README.md | 4 ++-- packages/color/package.json | 4 ++-- packages/geom/package.json | 2 +- packages/hiccup-carbon-icons/package.json | 4 ++-- packages/transducers-binary/package.json | 2 +- packages/vector-pools/package.json | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/bencode/package.json b/packages/bencode/package.json index f96bdf580b..e8647998f3 100644 --- a/packages/bencode/package.json +++ b/packages/bencode/package.json @@ -1,7 +1,7 @@ { "name": "@thi.ng/bencode", "version": "0.1.1", - "description": "TODO", + "description": "Bencode binary encoder / decoder with optional UTF8 encoding", "module": "./index.js", "main": "./lib/index.js", "umd:main": "./lib/index.umd.js", diff --git a/packages/color/README.md b/packages/color/README.md index 69d84b6881..50058c20ef 100644 --- a/packages/color/README.md +++ b/packages/color/README.md @@ -26,8 +26,8 @@ This project is part of the ## About -Raw, array-based, color operations, conversions and optional type -wrappers, based on +Raw, array-based, color operations, color space conversions, optional type +wrappers, multi-color gradients, based on [@thi.ng/vectors](https://github.com/thi-ng/umbrella/tree/master/packages/vectors). ### Color spaces / modes diff --git a/packages/color/package.json b/packages/color/package.json index 642eff4e78..547d87636a 100644 --- a/packages/color/package.json +++ b/packages/color/package.json @@ -1,7 +1,7 @@ { "name": "@thi.ng/color", "version": "0.1.4", - "description": "TODO", + "description": "Raw, array-based, color ops, conversions, opt. type wrappers, multi-color gradients", "module": "./index.js", "main": "./lib/index.js", "umd:main": "./lib/index.umd.js", @@ -75,4 +75,4 @@ "setTimeout": false }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/geom/package.json b/packages/geom/package.json index c14a5f233e..81c127e2ac 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -1,7 +1,7 @@ { "name": "@thi.ng/geom", "version": "1.2.1", - "description": "TODO", + "description": "2D geometry types, polymorphic operations, SVG generation", "module": "./index.js", "main": "./lib/index.js", "umd:main": "./lib/index.umd.js", diff --git a/packages/hiccup-carbon-icons/package.json b/packages/hiccup-carbon-icons/package.json index b4ab41c86d..ede2207804 100644 --- a/packages/hiccup-carbon-icons/package.json +++ b/packages/hiccup-carbon-icons/package.json @@ -1,7 +1,7 @@ { "name": "@thi.ng/hiccup-carbon-icons", "version": "1.0.3", - "description": "TODO", + "description": "Full set of IBM's Carbon icons in hiccup format", "module": "./index.js", "main": "./lib/index.js", "umd:main": "./lib/index.umd.js", @@ -48,4 +48,4 @@ "access": "public" }, "sideEffects": false -} +} \ No newline at end of file diff --git a/packages/transducers-binary/package.json b/packages/transducers-binary/package.json index d2f9ac18ef..b70294751d 100644 --- a/packages/transducers-binary/package.json +++ b/packages/transducers-binary/package.json @@ -1,7 +1,7 @@ { "name": "@thi.ng/transducers-binary", "version": "0.1.1", - "description": "TODO", + "description": "Binary data related transducers & reducers", "module": "./index.js", "main": "./lib/index.js", "umd:main": "./lib/index.umd.js", diff --git a/packages/vector-pools/package.json b/packages/vector-pools/package.json index 5f522f6c4f..287af598ca 100644 --- a/packages/vector-pools/package.json +++ b/packages/vector-pools/package.json @@ -1,7 +1,7 @@ { "name": "@thi.ng/vector-pools", "version": "0.2.1", - "description": "TODO", + "description": "Data structures for managing & working with strided, memory mapped vectors", "module": "./index.js", "main": "./lib/index.js", "umd:main": "./lib/index.umd.js", @@ -57,4 +57,4 @@ "setTimeout": false }, "sideEffects": false -} +} \ No newline at end of file From 418f7af20c8ce3098e86bbc3a2377ccbac761b70 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Fri, 15 Feb 2019 14:24:37 +0000 Subject: [PATCH 43/43] Publish - @thi.ng/arrays@0.1.0 - @thi.ng/associative@1.0.5 - @thi.ng/bencode@0.2.0 - @thi.ng/cache@1.0.5 - @thi.ng/color@0.1.5 - @thi.ng/compose@1.1.0 - @thi.ng/csp@1.0.5 - @thi.ng/dcons@2.0.5 - @thi.ng/dgraph@1.0.5 - @thi.ng/fsm@2.0.0 - @thi.ng/geom-accel@1.1.2 - @thi.ng/geom-api@0.1.2 - @thi.ng/geom-arc@0.1.2 - @thi.ng/geom-clip@0.0.4 - @thi.ng/geom-closest-point@0.1.2 - @thi.ng/geom-hull@0.0.4 - @thi.ng/geom-isec@0.1.2 - @thi.ng/geom-isoline@0.1.3 - @thi.ng/geom-poly-utils@0.1.2 - @thi.ng/geom-resample@0.1.2 - @thi.ng/geom-splines@0.1.2 - @thi.ng/geom-subdiv-curve@0.1.2 - @thi.ng/geom-tessellate@0.1.2 - @thi.ng/geom-voronoi@0.1.2 - @thi.ng/geom@1.2.2 - @thi.ng/hdom-canvas@1.1.4 - @thi.ng/hdom-components@3.0.5 - @thi.ng/heaps@1.0.3 - @thi.ng/hiccup-carbon-icons@1.0.4 - @thi.ng/hiccup-css@1.0.5 - @thi.ng/hiccup-markdown@1.0.5 - @thi.ng/hiccup-svg@3.1.4 - @thi.ng/iges@1.0.5 - @thi.ng/iterators@5.0.5 - @thi.ng/malloc@2.0.2 - @thi.ng/matrices@0.1.5 - @thi.ng/pointfree-lang@1.0.4 - @thi.ng/pointfree@1.0.4 - @thi.ng/poisson@0.2.2 - @thi.ng/random@1.1.0 - @thi.ng/range-coder@1.0.5 - @thi.ng/rstream-csp@1.0.5 - @thi.ng/rstream-dot@1.0.5 - @thi.ng/rstream-gestures@1.0.5 - @thi.ng/rstream-graph@3.0.5 - @thi.ng/rstream-log@2.0.5 - @thi.ng/rstream-query@1.0.5 - @thi.ng/rstream@2.0.5 - @thi.ng/sax@1.0.5 - @thi.ng/transducers-binary@0.2.0 - @thi.ng/transducers-fsm@1.0.5 - @thi.ng/transducers-hdom@2.0.5 - @thi.ng/transducers-stats@1.0.5 - @thi.ng/transducers@5.0.0 - @thi.ng/vector-pools@0.2.2 - @thi.ng/vectors@2.3.0 --- packages/arrays/CHANGELOG.md | 12 +++++++ packages/arrays/package.json | 6 ++-- packages/associative/CHANGELOG.md | 8 +++++ packages/associative/package.json | 6 ++-- packages/bencode/CHANGELOG.md | 11 ++++++ packages/bencode/package.json | 10 +++--- packages/cache/CHANGELOG.md | 8 +++++ packages/cache/package.json | 6 ++-- packages/color/CHANGELOG.md | 8 +++++ packages/color/package.json | 10 +++--- packages/compose/CHANGELOG.md | 16 +++++++++ packages/compose/package.json | 2 +- packages/csp/CHANGELOG.md | 8 +++++ packages/csp/package.json | 10 +++--- packages/dcons/CHANGELOG.md | 8 +++++ packages/dcons/package.json | 4 +-- packages/dgraph/CHANGELOG.md | 8 +++++ packages/dgraph/package.json | 6 ++-- packages/fsm/CHANGELOG.md | 18 ++++++++++ packages/fsm/package.json | 8 ++--- packages/geom-accel/CHANGELOG.md | 11 ++++++ packages/geom-accel/package.json | 14 ++++---- packages/geom-api/CHANGELOG.md | 8 +++++ packages/geom-api/package.json | 4 +-- packages/geom-arc/CHANGELOG.md | 8 +++++ packages/geom-arc/package.json | 8 ++--- packages/geom-clip/CHANGELOG.md | 8 +++++ packages/geom-clip/package.json | 8 ++--- packages/geom-closest-point/CHANGELOG.md | 8 +++++ packages/geom-closest-point/package.json | 4 +-- packages/geom-hull/CHANGELOG.md | 8 +++++ packages/geom-hull/package.json | 4 +-- packages/geom-isec/CHANGELOG.md | 8 +++++ packages/geom-isec/package.json | 8 ++--- packages/geom-isoline/CHANGELOG.md | 8 +++++ packages/geom-isoline/package.json | 6 ++-- packages/geom-poly-utils/CHANGELOG.md | 8 +++++ packages/geom-poly-utils/package.json | 6 ++-- packages/geom-resample/CHANGELOG.md | 8 +++++ packages/geom-resample/package.json | 8 ++--- packages/geom-splines/CHANGELOG.md | 8 +++++ packages/geom-splines/package.json | 10 +++--- packages/geom-subdiv-curve/CHANGELOG.md | 8 +++++ packages/geom-subdiv-curve/package.json | 8 ++--- packages/geom-tessellate/CHANGELOG.md | 8 +++++ packages/geom-tessellate/package.json | 12 +++---- packages/geom-voronoi/CHANGELOG.md | 8 +++++ packages/geom-voronoi/package.json | 10 +++--- packages/geom/CHANGELOG.md | 8 +++++ packages/geom/package.json | 40 ++++++++++----------- packages/hdom-canvas/CHANGELOG.md | 8 +++++ packages/hdom-canvas/package.json | 4 +-- packages/hdom-components/CHANGELOG.md | 8 +++++ packages/hdom-components/package.json | 6 ++-- packages/heaps/CHANGELOG.md | 8 +++++ packages/heaps/package.json | 2 +- packages/hiccup-carbon-icons/CHANGELOG.md | 8 +++++ packages/hiccup-carbon-icons/package.json | 4 +-- packages/hiccup-css/CHANGELOG.md | 8 +++++ packages/hiccup-css/package.json | 4 +-- packages/hiccup-markdown/CHANGELOG.md | 8 +++++ packages/hiccup-markdown/package.json | 10 +++--- packages/hiccup-svg/CHANGELOG.md | 8 +++++ packages/hiccup-svg/package.json | 4 +-- packages/iges/CHANGELOG.md | 8 +++++ packages/iges/package.json | 4 +-- packages/iterators/CHANGELOG.md | 8 +++++ packages/iterators/package.json | 4 +-- packages/malloc/CHANGELOG.md | 8 +++++ packages/malloc/package.json | 2 +- packages/matrices/CHANGELOG.md | 8 +++++ packages/matrices/package.json | 4 +-- packages/pointfree-lang/CHANGELOG.md | 8 +++++ packages/pointfree-lang/package.json | 4 +-- packages/pointfree/CHANGELOG.md | 8 +++++ packages/pointfree/package.json | 4 +-- packages/poisson/CHANGELOG.md | 8 +++++ packages/poisson/package.json | 8 ++--- packages/random/CHANGELOG.md | 16 +++++++++ packages/random/package.json | 2 +- packages/range-coder/CHANGELOG.md | 8 +++++ packages/range-coder/package.json | 4 +-- packages/rstream-csp/CHANGELOG.md | 8 +++++ packages/rstream-csp/package.json | 6 ++-- packages/rstream-dot/CHANGELOG.md | 8 +++++ packages/rstream-dot/package.json | 4 +-- packages/rstream-gestures/CHANGELOG.md | 8 +++++ packages/rstream-gestures/package.json | 6 ++-- packages/rstream-graph/CHANGELOG.md | 8 +++++ packages/rstream-graph/package.json | 6 ++-- packages/rstream-log/CHANGELOG.md | 8 +++++ packages/rstream-log/package.json | 6 ++-- packages/rstream-query/CHANGELOG.md | 8 +++++ packages/rstream-query/package.json | 10 +++--- packages/rstream/CHANGELOG.md | 8 +++++ packages/rstream/package.json | 6 ++-- packages/sax/CHANGELOG.md | 8 +++++ packages/sax/package.json | 6 ++-- packages/transducers-binary/CHANGELOG.md | 16 +++++++++ packages/transducers-binary/package.json | 8 ++--- packages/transducers-fsm/CHANGELOG.md | 8 +++++ packages/transducers-fsm/package.json | 4 +-- packages/transducers-hdom/CHANGELOG.md | 8 +++++ packages/transducers-hdom/package.json | 4 +-- packages/transducers-stats/CHANGELOG.md | 8 +++++ packages/transducers-stats/package.json | 6 ++-- packages/transducers/CHANGELOG.md | 43 +++++++++++++++++++++++ packages/transducers/package.json | 10 +++--- packages/vector-pools/CHANGELOG.md | 8 +++++ packages/vector-pools/package.json | 8 ++--- packages/vectors/CHANGELOG.md | 11 ++++++ packages/vectors/package.json | 6 ++-- 112 files changed, 722 insertions(+), 192 deletions(-) create mode 100644 packages/arrays/CHANGELOG.md diff --git a/packages/arrays/CHANGELOG.md b/packages/arrays/CHANGELOG.md new file mode 100644 index 0000000000..aae707cd1f --- /dev/null +++ b/packages/arrays/CHANGELOG.md @@ -0,0 +1,12 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# 0.1.0 (2019-02-15) + + +### Features + +* **arrays:** add find/findIndex() ([0007152](https://github.com/thi-ng/umbrella/commit/0007152)) +* **arrays:** extract as new package ([361ba37](https://github.com/thi-ng/umbrella/commit/361ba37)) diff --git a/packages/arrays/package.json b/packages/arrays/package.json index 3954409541..5d48260326 100644 --- a/packages/arrays/package.json +++ b/packages/arrays/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/arrays", - "version": "0.0.1", + "version": "0.1.0", "description": "Array / Arraylike utilities", "module": "./index.js", "main": "./lib/index.js", @@ -37,7 +37,7 @@ "@thi.ng/compare": "^1.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/random": "^1.0.2" + "@thi.ng/random": "^1.1.0" }, "keywords": [ "arrays", @@ -52,4 +52,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/associative/CHANGELOG.md b/packages/associative/CHANGELOG.md index 65254203f9..4b5c4171f8 100644 --- a/packages/associative/CHANGELOG.md +++ b/packages/associative/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@1.0.4...@thi.ng/associative@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/associative + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/associative@1.0.3...@thi.ng/associative@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/associative diff --git a/packages/associative/package.json b/packages/associative/package.json index c6a1a7ba94..5df32c7ef5 100644 --- a/packages/associative/package.json +++ b/packages/associative/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/associative", - "version": "1.0.4", + "version": "1.0.5", "description": "Alternative Set & Map data type implementations with customizable equality semantics & supporting operations", "module": "./index.js", "main": "./lib/index.js", @@ -35,10 +35,10 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", "@thi.ng/compare": "^1.0.2", - "@thi.ng/dcons": "^2.0.4", + "@thi.ng/dcons": "^2.0.5", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "data structures", diff --git a/packages/bencode/CHANGELOG.md b/packages/bencode/CHANGELOG.md index 3cae5a1625..19eb64554d 100644 --- a/packages/bencode/CHANGELOG.md +++ b/packages/bencode/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [0.2.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/bencode@0.1.1...@thi.ng/bencode@0.2.0) (2019-02-15) + + +### Features + +* **bencode:** add decode(), fix string length handling ([c1bbc6f](https://github.com/thi-ng/umbrella/commit/c1bbc6f)) + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/bencode@0.1.0...@thi.ng/bencode@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/bencode diff --git a/packages/bencode/package.json b/packages/bencode/package.json index e8647998f3..efc7aa1fec 100644 --- a/packages/bencode/package.json +++ b/packages/bencode/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/bencode", - "version": "0.1.1", + "version": "0.2.0", "description": "Bencode binary encoder / decoder with optional UTF8 encoding", "module": "./index.js", "main": "./lib/index.js", @@ -33,12 +33,12 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/arrays": "^0.0.1", + "@thi.ng/arrays": "^0.1.0", "@thi.ng/checks": "^2.1.0", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/transducers-binary": "^0.1.1" + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/transducers-binary": "^0.2.0" }, "keywords": [ "bencode", @@ -54,4 +54,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/cache/CHANGELOG.md b/packages/cache/CHANGELOG.md index 85259f87eb..9bcced7fb7 100644 --- a/packages/cache/CHANGELOG.md +++ b/packages/cache/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@1.0.4...@thi.ng/cache@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/cache + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/cache@1.0.3...@thi.ng/cache@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/cache diff --git a/packages/cache/package.json b/packages/cache/package.json index c683215b45..de8d4bfa43 100644 --- a/packages/cache/package.json +++ b/packages/cache/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/cache", - "version": "1.0.4", + "version": "1.0.5", "description": "In-memory cache implementations with ES6 Map-like API and different eviction strategies", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/dcons": "^2.0.4", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/dcons": "^2.0.5", + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "cache", diff --git a/packages/color/CHANGELOG.md b/packages/color/CHANGELOG.md index 4443f7947a..96a3976ea3 100644 --- a/packages/color/CHANGELOG.md +++ b/packages/color/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/color@0.1.4...@thi.ng/color@0.1.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/color + + + + + ## [0.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/color@0.1.3...@thi.ng/color@0.1.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/color diff --git a/packages/color/package.json b/packages/color/package.json index 547d87636a..3edd5a8693 100644 --- a/packages/color/package.json +++ b/packages/color/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/color", - "version": "0.1.4", + "version": "0.1.5", "description": "Raw, array-based, color ops, conversions, opt. type wrappers, multi-color gradients", "module": "./index.js", "main": "./lib/index.js", @@ -33,13 +33,13 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/compose": "^1.0.2", + "@thi.ng/compose": "^1.1.0", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/errors": "^1.0.2", "@thi.ng/math": "^1.1.0", "@thi.ng/strings": "^1.0.3", - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "alpha", @@ -75,4 +75,4 @@ "setTimeout": false }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/compose/CHANGELOG.md b/packages/compose/CHANGELOG.md index 1ad36d601b..447461086c 100644 --- a/packages/compose/CHANGELOG.md +++ b/packages/compose/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.1.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/compose@1.0.2...@thi.ng/compose@1.1.0) (2019-02-15) + + +### Bug Fixes + +* **compose:** add varargs override for jux(), add tests ([e9d57fc](https://github.com/thi-ng/umbrella/commit/e9d57fc)) + + +### Features + +* **compose:** add new functions ([dd13fa9](https://github.com/thi-ng/umbrella/commit/dd13fa9)) + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/compose@1.0.1...@thi.ng/compose@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/compose diff --git a/packages/compose/package.json b/packages/compose/package.json index 847c3b26c3..de0acea472 100644 --- a/packages/compose/package.json +++ b/packages/compose/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/compose", - "version": "1.0.2", + "version": "1.1.0", "description": "Arity-optimized functional composition helpers", "module": "./index.js", "main": "./lib/index.js", diff --git a/packages/csp/CHANGELOG.md b/packages/csp/CHANGELOG.md index a8059cdd59..4c9099c868 100644 --- a/packages/csp/CHANGELOG.md +++ b/packages/csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@1.0.4...@thi.ng/csp@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/csp + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/csp@1.0.3...@thi.ng/csp@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/csp diff --git a/packages/csp/package.json b/packages/csp/package.json index cd1df60f81..6461a69771 100644 --- a/packages/csp/package.json +++ b/packages/csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/csp", - "version": "1.0.4", + "version": "1.0.5", "description": "ES6 promise based CSP implementation", "module": "./index.js", "main": "./lib/index.js", @@ -37,11 +37,11 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/arrays": "^0.0.1", + "@thi.ng/arrays": "^0.1.0", "@thi.ng/checks": "^2.1.0", - "@thi.ng/dcons": "^2.0.4", + "@thi.ng/dcons": "^2.0.5", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "async", @@ -60,4 +60,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/dcons/CHANGELOG.md b/packages/dcons/CHANGELOG.md index a6f56a0f5c..5e5845e251 100644 --- a/packages/dcons/CHANGELOG.md +++ b/packages/dcons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@2.0.4...@thi.ng/dcons@2.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/dcons + + + + + ## [2.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/dcons@2.0.3...@thi.ng/dcons@2.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/dcons diff --git a/packages/dcons/package.json b/packages/dcons/package.json index d053798f7f..0783d17ad0 100644 --- a/packages/dcons/package.json +++ b/packages/dcons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dcons", - "version": "2.0.4", + "version": "2.0.5", "description": "Comprehensive doubly linked list structure w/ iterator support", "module": "./index.js", "main": "./lib/index.js", @@ -37,7 +37,7 @@ "@thi.ng/compare": "^1.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "datastructure", diff --git a/packages/dgraph/CHANGELOG.md b/packages/dgraph/CHANGELOG.md index db27de994a..bc02c2a9c9 100644 --- a/packages/dgraph/CHANGELOG.md +++ b/packages/dgraph/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@1.0.4...@thi.ng/dgraph@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/dgraph + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/dgraph@1.0.3...@thi.ng/dgraph@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/dgraph diff --git a/packages/dgraph/package.json b/packages/dgraph/package.json index fced63b071..71750ad0be 100644 --- a/packages/dgraph/package.json +++ b/packages/dgraph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/dgraph", - "version": "1.0.4", + "version": "1.0.5", "description": "Type-agnostic directed acyclic graph (DAG) & graph operations", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/associative": "^1.0.4", + "@thi.ng/associative": "^1.0.5", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "data structure", diff --git a/packages/fsm/CHANGELOG.md b/packages/fsm/CHANGELOG.md index b1d7424555..ca6f3056ef 100644 --- a/packages/fsm/CHANGELOG.md +++ b/packages/fsm/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.0.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/fsm@1.0.4...@thi.ng/fsm@2.0.0) (2019-02-15) + + +### Features + +* **fsm:** update / split until() ([aeb05f8](https://github.com/thi-ng/umbrella/commit/aeb05f8)) + + +### BREAKING CHANGES + +* **fsm:** make until() array based, add untilStr() + +- rename existing `until()` => `untilStr()` + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/fsm@1.0.3...@thi.ng/fsm@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/fsm diff --git a/packages/fsm/package.json b/packages/fsm/package.json index 158751e3d4..bb03ae1936 100644 --- a/packages/fsm/package.json +++ b/packages/fsm/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/fsm", - "version": "1.0.4", + "version": "2.0.0", "description": "Composable primitives for building declarative, transducer based Finite-State machines & parsers for arbitrary data streams", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/arrays": "^0.0.1", + "@thi.ng/arrays": "^0.1.0", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "ES6", @@ -56,4 +56,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/geom-accel/CHANGELOG.md b/packages/geom-accel/CHANGELOG.md index b9747832c6..42ceb28bee 100644 --- a/packages/geom-accel/CHANGELOG.md +++ b/packages/geom-accel/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-accel@1.1.1...@thi.ng/geom-accel@1.1.2) (2019-02-15) + + +### Bug Fixes + +* **geom-accel:** fix addAll(), addKeys() ([51959b7](https://github.com/thi-ng/umbrella/commit/51959b7)) + + + + + ## [1.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-accel@1.1.0...@thi.ng/geom-accel@1.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-accel diff --git a/packages/geom-accel/package.json b/packages/geom-accel/package.json index 6219bd5773..02af997096 100644 --- a/packages/geom-accel/package.json +++ b/packages/geom-accel/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-accel", - "version": "1.1.1", + "version": "1.1.2", "description": "nD spatial indexing data structures", "module": "./index.js", "main": "./lib/index.js", @@ -33,12 +33,12 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/arrays": "^0.0.1", - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/heaps": "^1.0.2", + "@thi.ng/arrays": "^0.1.0", + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/heaps": "^1.0.3", "@thi.ng/math": "^1.1.0", - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", @@ -57,4 +57,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/geom-api/CHANGELOG.md b/packages/geom-api/CHANGELOG.md index 6084d96874..9f4b877323 100644 --- a/packages/geom-api/CHANGELOG.md +++ b/packages/geom-api/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-api@0.1.1...@thi.ng/geom-api@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-api + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-api@0.1.0...@thi.ng/geom-api@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-api diff --git a/packages/geom-api/package.json b/packages/geom-api/package.json index 6af6fbed2c..c3c5da59d2 100644 --- a/packages/geom-api/package.json +++ b/packages/geom-api/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-api", - "version": "0.1.1", + "version": "0.1.2", "description": "Shared type & interface declarations for @thi.ng/geom packages", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "ES6", diff --git a/packages/geom-arc/CHANGELOG.md b/packages/geom-arc/CHANGELOG.md index 8ef6589326..fd7ae0bd1b 100644 --- a/packages/geom-arc/CHANGELOG.md +++ b/packages/geom-arc/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-arc@0.1.1...@thi.ng/geom-arc@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-arc + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-arc@0.1.0...@thi.ng/geom-arc@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-arc diff --git a/packages/geom-arc/package.json b/packages/geom-arc/package.json index 60cbbae06e..b8d2c02fc9 100644 --- a/packages/geom-arc/package.json +++ b/packages/geom-arc/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-arc", - "version": "0.1.1", + "version": "0.1.2", "description": "2D circular / elliptic arc operations", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/checks": "^2.1.0", - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/geom-resample": "^0.1.1", + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/geom-resample": "^0.1.2", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-clip/CHANGELOG.md b/packages/geom-clip/CHANGELOG.md index b9d872b025..b2373ba8ed 100644 --- a/packages/geom-clip/CHANGELOG.md +++ b/packages/geom-clip/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-clip@0.0.3...@thi.ng/geom-clip@0.0.4) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-clip + + + + + ## [0.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-clip@0.0.2...@thi.ng/geom-clip@0.0.3) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-clip diff --git a/packages/geom-clip/package.json b/packages/geom-clip/package.json index 5bd320d956..c64ced490c 100644 --- a/packages/geom-clip/package.json +++ b/packages/geom-clip/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-clip", - "version": "0.0.3", + "version": "0.0.4", "description": "2D line & convex polygon clipping (Liang-Barsky / Sutherland-Hodgeman)", "module": "./index.js", "main": "./lib/index.js", @@ -32,10 +32,10 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/geom-isec": "^0.1.1", - "@thi.ng/geom-poly-utils": "^0.1.1", + "@thi.ng/geom-isec": "^0.1.2", + "@thi.ng/geom-poly-utils": "^0.1.2", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-closest-point/CHANGELOG.md b/packages/geom-closest-point/CHANGELOG.md index 4686de8cd9..274ef7df92 100644 --- a/packages/geom-closest-point/CHANGELOG.md +++ b/packages/geom-closest-point/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-closest-point@0.1.1...@thi.ng/geom-closest-point@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-closest-point + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-closest-point@0.1.0...@thi.ng/geom-closest-point@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-closest-point diff --git a/packages/geom-closest-point/package.json b/packages/geom-closest-point/package.json index ed923dfd63..6520d10f79 100644 --- a/packages/geom-closest-point/package.json +++ b/packages/geom-closest-point/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-closest-point", - "version": "0.1.1", + "version": "0.1.2", "description": "Closest point / proximity helpers", "module": "./index.js", "main": "./lib/index.js", @@ -32,7 +32,7 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "ES6", diff --git a/packages/geom-hull/CHANGELOG.md b/packages/geom-hull/CHANGELOG.md index c231fce41b..0d6e2e9178 100644 --- a/packages/geom-hull/CHANGELOG.md +++ b/packages/geom-hull/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-hull@0.0.3...@thi.ng/geom-hull@0.0.4) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-hull + + + + + ## [0.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-hull@0.0.2...@thi.ng/geom-hull@0.0.3) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-hull diff --git a/packages/geom-hull/package.json b/packages/geom-hull/package.json index 1b9d9c376f..7a810f47e8 100644 --- a/packages/geom-hull/package.json +++ b/packages/geom-hull/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-hull", - "version": "0.0.3", + "version": "0.0.4", "description": "Fast 2D convex hull (Graham Scan)", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-isec/CHANGELOG.md b/packages/geom-isec/CHANGELOG.md index b51d9d36dc..883cdde307 100644 --- a/packages/geom-isec/CHANGELOG.md +++ b/packages/geom-isec/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-isec@0.1.1...@thi.ng/geom-isec@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-isec + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-isec@0.1.0...@thi.ng/geom-isec@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-isec diff --git a/packages/geom-isec/package.json b/packages/geom-isec/package.json index af0b03f9b7..48c86ccacb 100644 --- a/packages/geom-isec/package.json +++ b/packages/geom-isec/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-isec", - "version": "0.1.1", + "version": "0.1.2", "description": "2D/3D shape intersection checks", "module": "./index.js", "main": "./lib/index.js", @@ -32,10 +32,10 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/geom-closest-point": "^0.1.1", + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/geom-closest-point": "^0.1.2", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-isoline/CHANGELOG.md b/packages/geom-isoline/CHANGELOG.md index a01c515907..9282f7008b 100644 --- a/packages/geom-isoline/CHANGELOG.md +++ b/packages/geom-isoline/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-isoline@0.1.2...@thi.ng/geom-isoline@0.1.3) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-isoline + + + + + ## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-isoline@0.1.1...@thi.ng/geom-isoline@0.1.2) (2019-02-11) diff --git a/packages/geom-isoline/package.json b/packages/geom-isoline/package.json index 9939932ecc..78096bc371 100644 --- a/packages/geom-isoline/package.json +++ b/packages/geom-isoline/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-isoline", - "version": "0.1.2", + "version": "0.1.3", "description": "Fast 2D contour line extraction / generation", "module": "./index.js", "main": "./lib/index.js", @@ -32,8 +32,8 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-poly-utils/CHANGELOG.md b/packages/geom-poly-utils/CHANGELOG.md index 12e2587a12..d687a3e98a 100644 --- a/packages/geom-poly-utils/CHANGELOG.md +++ b/packages/geom-poly-utils/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-poly-utils@0.1.1...@thi.ng/geom-poly-utils@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-poly-utils + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-poly-utils@0.1.0...@thi.ng/geom-poly-utils@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-poly-utils diff --git a/packages/geom-poly-utils/package.json b/packages/geom-poly-utils/package.json index 263f287320..38f1fbba65 100644 --- a/packages/geom-poly-utils/package.json +++ b/packages/geom-poly-utils/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-poly-utils", - "version": "0.1.1", + "version": "0.1.2", "description": "Polygon / triangle analysis & processing utilities", "module": "./index.js", "main": "./lib/index.js", @@ -33,9 +33,9 @@ }, "dependencies": { "@thi.ng/errors": "^1.0.2", - "@thi.ng/geom-api": "^0.1.1", + "@thi.ng/geom-api": "^0.1.2", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-resample/CHANGELOG.md b/packages/geom-resample/CHANGELOG.md index 3ee49641d0..6a5346dcc9 100644 --- a/packages/geom-resample/CHANGELOG.md +++ b/packages/geom-resample/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-resample@0.1.1...@thi.ng/geom-resample@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-resample + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-resample@0.1.0...@thi.ng/geom-resample@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-resample diff --git a/packages/geom-resample/package.json b/packages/geom-resample/package.json index ea6cd6bf18..56478c1620 100644 --- a/packages/geom-resample/package.json +++ b/packages/geom-resample/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-resample", - "version": "0.1.1", + "version": "0.1.2", "description": "Customizable nD polyline interpolation, re-sampling, splitting & nearest point computation", "module": "./index.js", "main": "./lib/index.js", @@ -33,10 +33,10 @@ }, "dependencies": { "@thi.ng/checks": "^2.1.0", - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/geom-closest-point": "^0.1.1", + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/geom-closest-point": "^0.1.2", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-splines/CHANGELOG.md b/packages/geom-splines/CHANGELOG.md index 8589f7ec4f..7d9ad7a0d5 100644 --- a/packages/geom-splines/CHANGELOG.md +++ b/packages/geom-splines/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-splines@0.1.1...@thi.ng/geom-splines@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-splines + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-splines@0.1.0...@thi.ng/geom-splines@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-splines diff --git a/packages/geom-splines/package.json b/packages/geom-splines/package.json index 09c97bff46..6d1db39ed1 100644 --- a/packages/geom-splines/package.json +++ b/packages/geom-splines/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-splines", - "version": "0.1.1", + "version": "0.1.2", "description": "nD cubic & quadratic curve analysis, conversion, interpolation, splitting", "module": "./index.js", "main": "./lib/index.js", @@ -33,11 +33,11 @@ }, "dependencies": { "@thi.ng/checks": "^2.1.0", - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/geom-arc": "^0.1.1", - "@thi.ng/geom-resample": "^0.1.1", + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/geom-arc": "^0.1.2", + "@thi.ng/geom-resample": "^0.1.2", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-subdiv-curve/CHANGELOG.md b/packages/geom-subdiv-curve/CHANGELOG.md index 029f6b38f4..39ba3d2ab4 100644 --- a/packages/geom-subdiv-curve/CHANGELOG.md +++ b/packages/geom-subdiv-curve/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-subdiv-curve@0.1.1...@thi.ng/geom-subdiv-curve@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-subdiv-curve + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-subdiv-curve@0.1.0...@thi.ng/geom-subdiv-curve@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-subdiv-curve diff --git a/packages/geom-subdiv-curve/package.json b/packages/geom-subdiv-curve/package.json index 6b1efe63a0..d84add2ae2 100644 --- a/packages/geom-subdiv-curve/package.json +++ b/packages/geom-subdiv-curve/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-subdiv-curve", - "version": "0.1.1", + "version": "0.1.2", "description": "Freely customizable, iterative subdivision curves for open / closed input geometries", "module": "./index.js", "main": "./lib/index.js", @@ -32,9 +32,9 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-tessellate/CHANGELOG.md b/packages/geom-tessellate/CHANGELOG.md index d083261e7c..8c82580bba 100644 --- a/packages/geom-tessellate/CHANGELOG.md +++ b/packages/geom-tessellate/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-tessellate@0.1.1...@thi.ng/geom-tessellate@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-tessellate + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-tessellate@0.1.0...@thi.ng/geom-tessellate@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-tessellate diff --git a/packages/geom-tessellate/package.json b/packages/geom-tessellate/package.json index b32108fdb6..f2b1584dff 100644 --- a/packages/geom-tessellate/package.json +++ b/packages/geom-tessellate/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-tessellate", - "version": "0.1.1", + "version": "0.1.2", "description": "2D/3D polygon tessellators", "module": "./index.js", "main": "./lib/index.js", @@ -33,11 +33,11 @@ }, "dependencies": { "@thi.ng/checks": "^2.1.0", - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/geom-isec": "^0.1.1", - "@thi.ng/geom-poly-utils": "^0.1.1", - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/geom-isec": "^0.1.2", + "@thi.ng/geom-poly-utils": "^0.1.2", + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom-voronoi/CHANGELOG.md b/packages/geom-voronoi/CHANGELOG.md index 5abd8c7739..7a754af923 100644 --- a/packages/geom-voronoi/CHANGELOG.md +++ b/packages/geom-voronoi/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-voronoi@0.1.1...@thi.ng/geom-voronoi@0.1.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom-voronoi + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom-voronoi@0.1.0...@thi.ng/geom-voronoi@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom-voronoi diff --git a/packages/geom-voronoi/package.json b/packages/geom-voronoi/package.json index e31928650e..6a177caaa5 100644 --- a/packages/geom-voronoi/package.json +++ b/packages/geom-voronoi/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom-voronoi", - "version": "0.1.1", + "version": "0.1.2", "description": "Fast, incremental 2D Delaunay & Voronoi mesh implementation", "module": "./index.js", "main": "./lib/index.js", @@ -34,12 +34,12 @@ "dependencies": { "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", - "@thi.ng/geom-clip": "^0.0.3", - "@thi.ng/geom-isec": "^0.1.1", - "@thi.ng/geom-poly-utils": "^0.1.1", + "@thi.ng/geom-clip": "^0.0.4", + "@thi.ng/geom-isec": "^0.1.2", + "@thi.ng/geom-poly-utils": "^0.1.2", "@thi.ng/math": "^1.1.0", "@thi.ng/quad-edge": "^0.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/geom/CHANGELOG.md b/packages/geom/CHANGELOG.md index 076244a3c9..58b1c7f8ee 100644 --- a/packages/geom/CHANGELOG.md +++ b/packages/geom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.2.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom@1.2.1...@thi.ng/geom@1.2.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/geom + + + + + ## [1.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/geom@1.2.0...@thi.ng/geom@1.2.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/geom diff --git a/packages/geom/package.json b/packages/geom/package.json index 81c127e2ac..bfa69397dc 100644 --- a/packages/geom/package.json +++ b/packages/geom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/geom", - "version": "1.2.1", + "version": "1.2.2", "description": "2D geometry types, polymorphic operations, SVG generation", "module": "./index.js", "main": "./lib/index.js", @@ -33,30 +33,30 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/arrays": "^0.0.1", + "@thi.ng/arrays": "^0.1.0", "@thi.ng/checks": "^2.1.0", - "@thi.ng/compose": "^1.0.2", + "@thi.ng/compose": "^1.1.0", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/geom-arc": "^0.1.1", - "@thi.ng/geom-clip": "^0.0.3", - "@thi.ng/geom-closest-point": "^0.1.1", - "@thi.ng/geom-hull": "^0.0.3", - "@thi.ng/geom-isec": "^0.1.1", - "@thi.ng/geom-poly-utils": "^0.1.1", - "@thi.ng/geom-resample": "^0.1.1", - "@thi.ng/geom-splines": "^0.1.1", - "@thi.ng/geom-subdiv-curve": "^0.1.1", - "@thi.ng/geom-tessellate": "^0.1.1", + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/geom-arc": "^0.1.2", + "@thi.ng/geom-clip": "^0.0.4", + "@thi.ng/geom-closest-point": "^0.1.2", + "@thi.ng/geom-hull": "^0.0.4", + "@thi.ng/geom-isec": "^0.1.2", + "@thi.ng/geom-poly-utils": "^0.1.2", + "@thi.ng/geom-resample": "^0.1.2", + "@thi.ng/geom-splines": "^0.1.2", + "@thi.ng/geom-subdiv-curve": "^0.1.2", + "@thi.ng/geom-tessellate": "^0.1.2", "@thi.ng/hiccup": "^3.0.3", - "@thi.ng/hiccup-svg": "^3.1.3", + "@thi.ng/hiccup-svg": "^3.1.4", "@thi.ng/math": "^1.1.0", - "@thi.ng/matrices": "^0.1.4", - "@thi.ng/random": "^1.0.2", - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/matrices": "^0.1.5", + "@thi.ng/random": "^1.1.0", + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", @@ -72,4 +72,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/hdom-canvas/CHANGELOG.md b/packages/hdom-canvas/CHANGELOG.md index d7eccbb705..ab7da76bf1 100644 --- a/packages/hdom-canvas/CHANGELOG.md +++ b/packages/hdom-canvas/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@1.1.3...@thi.ng/hdom-canvas@1.1.4) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/hdom-canvas + + + + + ## [1.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-canvas@1.1.2...@thi.ng/hdom-canvas@1.1.3) (2019-02-10) **Note:** Version bump only for package @thi.ng/hdom-canvas diff --git a/packages/hdom-canvas/package.json b/packages/hdom-canvas/package.json index 9f9eee81b5..636eaf3d6c 100644 --- a/packages/hdom-canvas/package.json +++ b/packages/hdom-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-canvas", - "version": "1.1.3", + "version": "1.1.4", "description": "Declarative canvas scenegraph & visualization for @thi.ng/hdom", "module": "./index.js", "main": "./lib/index.js", @@ -34,7 +34,7 @@ "dependencies": { "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", - "@thi.ng/color": "^0.1.4", + "@thi.ng/color": "^0.1.5", "@thi.ng/diff": "^3.0.2", "@thi.ng/hdom": "^7.1.0" }, diff --git a/packages/hdom-components/CHANGELOG.md b/packages/hdom-components/CHANGELOG.md index cfaca1faf4..d98097f8be 100644 --- a/packages/hdom-components/CHANGELOG.md +++ b/packages/hdom-components/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@3.0.4...@thi.ng/hdom-components@3.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/hdom-components + + + + + ## [3.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hdom-components@3.0.3...@thi.ng/hdom-components@3.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/hdom-components diff --git a/packages/hdom-components/package.json b/packages/hdom-components/package.json index 58e302054f..33115a9344 100644 --- a/packages/hdom-components/package.json +++ b/packages/hdom-components/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hdom-components", - "version": "3.0.4", + "version": "3.0.5", "description": "Raw, skinnable UI & SVG components for @thi.ng/hdom", "module": "./index.js", "main": "./lib/index.js", @@ -35,8 +35,8 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", "@thi.ng/math": "^1.1.0", - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/transducers-stats": "^1.0.4", + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/transducers-stats": "^1.0.5", "@types/webgl2": "^0.0.4" }, "keywords": [ diff --git a/packages/heaps/CHANGELOG.md b/packages/heaps/CHANGELOG.md index 0ff3012f42..1fbae5eec4 100644 --- a/packages/heaps/CHANGELOG.md +++ b/packages/heaps/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/heaps@1.0.2...@thi.ng/heaps@1.0.3) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/heaps + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/heaps@1.0.1...@thi.ng/heaps@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/heaps diff --git a/packages/heaps/package.json b/packages/heaps/package.json index 204ab78851..584a82cd06 100644 --- a/packages/heaps/package.json +++ b/packages/heaps/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/heaps", - "version": "1.0.2", + "version": "1.0.3", "description": "Generic binary heap & d-ary heap implementations with customizable ordering", "module": "./index.js", "main": "./lib/index.js", diff --git a/packages/hiccup-carbon-icons/CHANGELOG.md b/packages/hiccup-carbon-icons/CHANGELOG.md index 4301a1838d..09c6709c57 100644 --- a/packages/hiccup-carbon-icons/CHANGELOG.md +++ b/packages/hiccup-carbon-icons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-carbon-icons@1.0.3...@thi.ng/hiccup-carbon-icons@1.0.4) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/hiccup-carbon-icons + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-carbon-icons@1.0.2...@thi.ng/hiccup-carbon-icons@1.0.3) (2019-02-10) **Note:** Version bump only for package @thi.ng/hiccup-carbon-icons diff --git a/packages/hiccup-carbon-icons/package.json b/packages/hiccup-carbon-icons/package.json index ede2207804..cb34fcc1f0 100644 --- a/packages/hiccup-carbon-icons/package.json +++ b/packages/hiccup-carbon-icons/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-carbon-icons", - "version": "1.0.3", + "version": "1.0.4", "description": "Full set of IBM's Carbon icons in hiccup format", "module": "./index.js", "main": "./lib/index.js", @@ -48,4 +48,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/hiccup-css/CHANGELOG.md b/packages/hiccup-css/CHANGELOG.md index 551b468c4b..2d97e4b91a 100644 --- a/packages/hiccup-css/CHANGELOG.md +++ b/packages/hiccup-css/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@1.0.4...@thi.ng/hiccup-css@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/hiccup-css + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-css@1.0.3...@thi.ng/hiccup-css@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/hiccup-css diff --git a/packages/hiccup-css/package.json b/packages/hiccup-css/package.json index 5081310e50..87c9ad8658 100644 --- a/packages/hiccup-css/package.json +++ b/packages/hiccup-css/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-css", - "version": "1.0.4", + "version": "1.0.5", "description": "CSS from nested JS data structures", "module": "./index.js", "main": "./lib/index.js", @@ -35,7 +35,7 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "clojure", diff --git a/packages/hiccup-markdown/CHANGELOG.md b/packages/hiccup-markdown/CHANGELOG.md index 3c4afd9254..e9929076ab 100644 --- a/packages/hiccup-markdown/CHANGELOG.md +++ b/packages/hiccup-markdown/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-markdown@1.0.4...@thi.ng/hiccup-markdown@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/hiccup-markdown + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-markdown@1.0.3...@thi.ng/hiccup-markdown@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/hiccup-markdown diff --git a/packages/hiccup-markdown/package.json b/packages/hiccup-markdown/package.json index 3111c24737..a0a02c6a36 100644 --- a/packages/hiccup-markdown/package.json +++ b/packages/hiccup-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-markdown", - "version": "1.0.4", + "version": "1.0.5", "description": "Markdown serialization of hiccup DOM trees", "module": "./index.js", "main": "./lib/index.js", @@ -32,14 +32,14 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/arrays": "^0.0.1", + "@thi.ng/arrays": "^0.1.0", "@thi.ng/checks": "^2.1.0", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/fsm": "^1.0.4", + "@thi.ng/fsm": "^2.0.0", "@thi.ng/hiccup": "^3.0.3", "@thi.ng/strings": "^1.0.3", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "ES6", @@ -57,4 +57,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/hiccup-svg/CHANGELOG.md b/packages/hiccup-svg/CHANGELOG.md index 804c6dd641..5e385688c3 100644 --- a/packages/hiccup-svg/CHANGELOG.md +++ b/packages/hiccup-svg/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-svg@3.1.3...@thi.ng/hiccup-svg@3.1.4) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/hiccup-svg + + + + + ## [3.1.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/hiccup-svg@3.1.2...@thi.ng/hiccup-svg@3.1.3) (2019-02-10) **Note:** Version bump only for package @thi.ng/hiccup-svg diff --git a/packages/hiccup-svg/package.json b/packages/hiccup-svg/package.json index 2861239109..afd921b47a 100644 --- a/packages/hiccup-svg/package.json +++ b/packages/hiccup-svg/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/hiccup-svg", - "version": "3.1.3", + "version": "3.1.4", "description": "SVG element functions for @thi.ng/hiccup & @thi.ng/hdom", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/checks": "^2.1.0", - "@thi.ng/color": "^0.1.4", + "@thi.ng/color": "^0.1.5", "@thi.ng/hiccup": "^3.0.3" }, "keywords": [ diff --git a/packages/iges/CHANGELOG.md b/packages/iges/CHANGELOG.md index 4752f6e8cb..55721e6634 100644 --- a/packages/iges/CHANGELOG.md +++ b/packages/iges/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@1.0.4...@thi.ng/iges@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/iges + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/iges@1.0.3...@thi.ng/iges@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/iges diff --git a/packages/iges/package.json b/packages/iges/package.json index b05a3ede2b..43ad07f5e8 100644 --- a/packages/iges/package.json +++ b/packages/iges/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iges", - "version": "1.0.4", + "version": "1.0.5", "description": "IGES 5.3 serializer for (currently only) polygonal geometry, both open & closed", "module": "./index.js", "main": "./lib/index.js", @@ -35,7 +35,7 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/defmulti": "^1.0.2", "@thi.ng/strings": "^1.0.3", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "CAD", diff --git a/packages/iterators/CHANGELOG.md b/packages/iterators/CHANGELOG.md index bc7f3e5d13..ddd3849644 100644 --- a/packages/iterators/CHANGELOG.md +++ b/packages/iterators/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@5.0.4...@thi.ng/iterators@5.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/iterators + + + + + ## [5.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/iterators@5.0.3...@thi.ng/iterators@5.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/iterators diff --git a/packages/iterators/package.json b/packages/iterators/package.json index 70df5ceff0..97a33f0b44 100644 --- a/packages/iterators/package.json +++ b/packages/iterators/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/iterators", - "version": "5.0.4", + "version": "5.0.5", "description": "clojure.core inspired, composable ES6 iterators & generators", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/dcons": "^2.0.4", + "@thi.ng/dcons": "^2.0.5", "@thi.ng/errors": "^1.0.2" }, "keywords": [ diff --git a/packages/malloc/CHANGELOG.md b/packages/malloc/CHANGELOG.md index ad90b061df..2c30a11378 100644 --- a/packages/malloc/CHANGELOG.md +++ b/packages/malloc/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/malloc@2.0.1...@thi.ng/malloc@2.0.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/malloc + + + + + ## [2.0.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/malloc@2.0.0...@thi.ng/malloc@2.0.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/malloc diff --git a/packages/malloc/package.json b/packages/malloc/package.json index a9f24eb7b6..b83373a766 100644 --- a/packages/malloc/package.json +++ b/packages/malloc/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/malloc", - "version": "2.0.1", + "version": "2.0.2", "description": "ArrayBuffer based malloc() impl for hybrid JS/WASM use cases, based on thi.ng/tinyalloc", "module": "./index.js", "main": "./lib/index.js", diff --git a/packages/matrices/CHANGELOG.md b/packages/matrices/CHANGELOG.md index 7fd59464c4..dd4041c2ab 100644 --- a/packages/matrices/CHANGELOG.md +++ b/packages/matrices/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/matrices@0.1.4...@thi.ng/matrices@0.1.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/matrices + + + + + ## [0.1.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/matrices@0.1.3...@thi.ng/matrices@0.1.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/matrices diff --git a/packages/matrices/package.json b/packages/matrices/package.json index c8b25092bb..7a199f3b26 100644 --- a/packages/matrices/package.json +++ b/packages/matrices/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/matrices", - "version": "0.1.4", + "version": "0.1.5", "description": "Matrix & quaternion operations for 2D/3D geometry processing", "module": "./index.js", "main": "./lib/index.js", @@ -35,7 +35,7 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", "@thi.ng/math": "^1.1.0", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2D", diff --git a/packages/pointfree-lang/CHANGELOG.md b/packages/pointfree-lang/CHANGELOG.md index 3d116e8d2b..c92c3c7cb5 100644 --- a/packages/pointfree-lang/CHANGELOG.md +++ b/packages/pointfree-lang/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree-lang@1.0.3...@thi.ng/pointfree-lang@1.0.4) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/pointfree-lang + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree-lang@1.0.2...@thi.ng/pointfree-lang@1.0.3) (2019-02-10) **Note:** Version bump only for package @thi.ng/pointfree-lang diff --git a/packages/pointfree-lang/package.json b/packages/pointfree-lang/package.json index 3a0d0c7963..5050553a92 100644 --- a/packages/pointfree-lang/package.json +++ b/packages/pointfree-lang/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/pointfree-lang", - "version": "1.0.3", + "version": "1.0.4", "description": "Forth style syntax layer/compiler for the @thi.ng/pointfree DSL", "module": "./index.js", "main": "./lib/index.js", @@ -36,7 +36,7 @@ "dependencies": { "@thi.ng/api": "^5.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/pointfree": "^1.0.3" + "@thi.ng/pointfree": "^1.0.4" }, "keywords": [ "concatenative", diff --git a/packages/pointfree/CHANGELOG.md b/packages/pointfree/CHANGELOG.md index 4497dbafd1..9ed528f2b0 100644 --- a/packages/pointfree/CHANGELOG.md +++ b/packages/pointfree/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree@1.0.3...@thi.ng/pointfree@1.0.4) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/pointfree + + + + + ## [1.0.3](https://github.com/thi-ng/umbrella/compare/@thi.ng/pointfree@1.0.2...@thi.ng/pointfree@1.0.3) (2019-02-10) **Note:** Version bump only for package @thi.ng/pointfree diff --git a/packages/pointfree/package.json b/packages/pointfree/package.json index 3b6ae4dab8..1724c3a32d 100644 --- a/packages/pointfree/package.json +++ b/packages/pointfree/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/pointfree", - "version": "1.0.3", + "version": "1.0.4", "description": "Pointfree functional composition / Forth style stack execution engine", "module": "./index.js", "main": "./lib/index.js", @@ -34,7 +34,7 @@ "dependencies": { "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", - "@thi.ng/compose": "^1.0.2", + "@thi.ng/compose": "^1.1.0", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2" }, diff --git a/packages/poisson/CHANGELOG.md b/packages/poisson/CHANGELOG.md index 5abb8f98f4..c42e51cda9 100644 --- a/packages/poisson/CHANGELOG.md +++ b/packages/poisson/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/poisson@0.2.1...@thi.ng/poisson@0.2.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/poisson + + + + + ## [0.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/poisson@0.2.0...@thi.ng/poisson@0.2.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/poisson diff --git a/packages/poisson/package.json b/packages/poisson/package.json index 5f3b69be2c..3d8efe79f8 100644 --- a/packages/poisson/package.json +++ b/packages/poisson/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/poisson", - "version": "0.2.1", + "version": "0.2.2", "description": "nD Poisson-disc sampling w/ support for spatial density functions and custom PRNGs", "module": "./index.js", "main": "./lib/index.js", @@ -33,9 +33,9 @@ }, "dependencies": { "@thi.ng/checks": "^2.1.0", - "@thi.ng/geom-api": "^0.1.1", - "@thi.ng/random": "^1.0.2", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/geom-api": "^0.1.2", + "@thi.ng/random": "^1.1.0", + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "2d", diff --git a/packages/random/CHANGELOG.md b/packages/random/CHANGELOG.md index 8048a3412f..a45bc81e55 100644 --- a/packages/random/CHANGELOG.md +++ b/packages/random/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.1.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/random@1.0.2...@thi.ng/random@1.1.0) (2019-02-15) + + +### Bug Fixes + +* **random:** add opt scale arg to IRandom.float() ([5a7e448](https://github.com/thi-ng/umbrella/commit/5a7e448)) + + +### Features + +* **random:** add randomID() & weightedRandom() ([f719724](https://github.com/thi-ng/umbrella/commit/f719724)) + + + + + ## [1.0.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/random@1.0.1...@thi.ng/random@1.0.2) (2019-02-05) **Note:** Version bump only for package @thi.ng/random diff --git a/packages/random/package.json b/packages/random/package.json index d14851532e..441e05ede0 100644 --- a/packages/random/package.json +++ b/packages/random/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/random", - "version": "1.0.2", + "version": "1.1.0", "description": "Pseudo-random number generators w/ unified API", "module": "./index.js", "main": "./lib/index.js", diff --git a/packages/range-coder/CHANGELOG.md b/packages/range-coder/CHANGELOG.md index ccd04e9b35..8a8560be2e 100644 --- a/packages/range-coder/CHANGELOG.md +++ b/packages/range-coder/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@1.0.4...@thi.ng/range-coder@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/range-coder + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/range-coder@1.0.3...@thi.ng/range-coder@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/range-coder diff --git a/packages/range-coder/package.json b/packages/range-coder/package.json index 1a10bdc567..73684596d8 100644 --- a/packages/range-coder/package.json +++ b/packages/range-coder/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/range-coder", - "version": "1.0.4", + "version": "1.0.5", "description": "Binary data range encoder / decoder", "module": "./index.js", "main": "./lib/index.js", @@ -24,7 +24,7 @@ "pub": "yarn build && yarn publish --access public" }, "devDependencies": { - "@thi.ng/transducers": "^4.0.1", + "@thi.ng/transducers": "^5.0.0", "@types/mocha": "^5.2.5", "@types/node": "^10.12.15", "mocha": "^5.2.0", diff --git a/packages/rstream-csp/CHANGELOG.md b/packages/rstream-csp/CHANGELOG.md index 3d0037ae37..a154cba34c 100644 --- a/packages/rstream-csp/CHANGELOG.md +++ b/packages/rstream-csp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@1.0.4...@thi.ng/rstream-csp@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/rstream-csp + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-csp@1.0.3...@thi.ng/rstream-csp@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/rstream-csp diff --git a/packages/rstream-csp/package.json b/packages/rstream-csp/package.json index 6f2c918e2d..86de0aa266 100644 --- a/packages/rstream-csp/package.json +++ b/packages/rstream-csp/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-csp", - "version": "1.0.4", + "version": "1.0.5", "description": "@thi.ng/csp bridge module for @thi.ng/rstream", "module": "./index.js", "main": "./lib/index.js", @@ -32,8 +32,8 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/csp": "^1.0.4", - "@thi.ng/rstream": "^2.0.4" + "@thi.ng/csp": "^1.0.5", + "@thi.ng/rstream": "^2.0.5" }, "keywords": [ "bridge", diff --git a/packages/rstream-dot/CHANGELOG.md b/packages/rstream-dot/CHANGELOG.md index 4971e41921..f019c50fb1 100644 --- a/packages/rstream-dot/CHANGELOG.md +++ b/packages/rstream-dot/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@1.0.4...@thi.ng/rstream-dot@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/rstream-dot + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-dot@1.0.3...@thi.ng/rstream-dot@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/rstream-dot diff --git a/packages/rstream-dot/package.json b/packages/rstream-dot/package.json index c30bf976c4..a96d83d847 100644 --- a/packages/rstream-dot/package.json +++ b/packages/rstream-dot/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-dot", - "version": "1.0.4", + "version": "1.0.5", "description": "Graphviz DOT conversion of @thi.ng/rstream dataflow graph topologies", "module": "./index.js", "main": "./lib/index.js", @@ -32,7 +32,7 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/rstream": "^2.0.4" + "@thi.ng/rstream": "^2.0.5" }, "keywords": [ "conversion", diff --git a/packages/rstream-gestures/CHANGELOG.md b/packages/rstream-gestures/CHANGELOG.md index 953aad7e3e..11a8b23dc6 100644 --- a/packages/rstream-gestures/CHANGELOG.md +++ b/packages/rstream-gestures/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@1.0.4...@thi.ng/rstream-gestures@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/rstream-gestures + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-gestures@1.0.3...@thi.ng/rstream-gestures@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/rstream-gestures diff --git a/packages/rstream-gestures/package.json b/packages/rstream-gestures/package.json index 58cfcd7afd..6bd105df37 100644 --- a/packages/rstream-gestures/package.json +++ b/packages/rstream-gestures/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-gestures", - "version": "1.0.4", + "version": "1.0.5", "description": "Unified mouse, mouse wheel & single-touch event stream abstraction", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/rstream": "^2.0.4", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/rstream": "^2.0.5", + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "dataflow", diff --git a/packages/rstream-graph/CHANGELOG.md b/packages/rstream-graph/CHANGELOG.md index fb45f5c744..903f337850 100644 --- a/packages/rstream-graph/CHANGELOG.md +++ b/packages/rstream-graph/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@3.0.4...@thi.ng/rstream-graph@3.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/rstream-graph + + + + + ## [3.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-graph@3.0.3...@thi.ng/rstream-graph@3.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/rstream-graph diff --git a/packages/rstream-graph/package.json b/packages/rstream-graph/package.json index 028d3dce2b..128147f2ea 100644 --- a/packages/rstream-graph/package.json +++ b/packages/rstream-graph/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-graph", - "version": "3.0.4", + "version": "3.0.5", "description": "Declarative dataflow graph construction for @thi.ng/rstream", "module": "./index.js", "main": "./lib/index.js", @@ -37,8 +37,8 @@ "@thi.ng/errors": "^1.0.2", "@thi.ng/paths": "^2.0.3", "@thi.ng/resolve-map": "^4.0.3", - "@thi.ng/rstream": "^2.0.4", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/rstream": "^2.0.5", + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "compute", diff --git a/packages/rstream-log/CHANGELOG.md b/packages/rstream-log/CHANGELOG.md index 181f5ce841..5b93fc1a71 100644 --- a/packages/rstream-log/CHANGELOG.md +++ b/packages/rstream-log/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@2.0.4...@thi.ng/rstream-log@2.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/rstream-log + + + + + ## [2.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-log@2.0.3...@thi.ng/rstream-log@2.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/rstream-log diff --git a/packages/rstream-log/package.json b/packages/rstream-log/package.json index fcd51e4bd5..2c1beec213 100644 --- a/packages/rstream-log/package.json +++ b/packages/rstream-log/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-log", - "version": "2.0.4", + "version": "2.0.5", "description": "Structured, multilevel & hierarchical loggers based on @thi.ng/rstream", "module": "./index.js", "main": "./lib/index.js", @@ -35,8 +35,8 @@ "@thi.ng/api": "^5.0.2", "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", - "@thi.ng/rstream": "^2.0.4", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/rstream": "^2.0.5", + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "ES6", diff --git a/packages/rstream-query/CHANGELOG.md b/packages/rstream-query/CHANGELOG.md index f569c6ab8d..835685d87f 100644 --- a/packages/rstream-query/CHANGELOG.md +++ b/packages/rstream-query/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@1.0.4...@thi.ng/rstream-query@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/rstream-query + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream-query@1.0.3...@thi.ng/rstream-query@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/rstream-query diff --git a/packages/rstream-query/package.json b/packages/rstream-query/package.json index f41854491a..1b38446570 100644 --- a/packages/rstream-query/package.json +++ b/packages/rstream-query/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream-query", - "version": "1.0.4", + "version": "1.0.5", "description": "@thi.ng/rstream based triple store & reactive query engine", "module": "./index.js", "main": "./lib/index.js", @@ -33,13 +33,13 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/associative": "^1.0.4", + "@thi.ng/associative": "^1.0.5", "@thi.ng/checks": "^2.1.0", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/rstream": "^2.0.4", - "@thi.ng/rstream-dot": "^1.0.4", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/rstream": "^2.0.5", + "@thi.ng/rstream-dot": "^1.0.5", + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "dataflow", diff --git a/packages/rstream/CHANGELOG.md b/packages/rstream/CHANGELOG.md index 96f32eaaaf..e6340b3bfb 100644 --- a/packages/rstream/CHANGELOG.md +++ b/packages/rstream/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@2.0.4...@thi.ng/rstream@2.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/rstream + + + + + ## [2.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/rstream@2.0.3...@thi.ng/rstream@2.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/rstream diff --git a/packages/rstream/package.json b/packages/rstream/package.json index a0dff60f02..8385322cc8 100644 --- a/packages/rstream/package.json +++ b/packages/rstream/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/rstream", - "version": "2.0.4", + "version": "2.0.5", "description": "Reactive multi-tap streams, dataflow & transformation pipeline constructs", "module": "./index.js", "main": "./lib/index.js", @@ -33,12 +33,12 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/associative": "^1.0.4", + "@thi.ng/associative": "^1.0.5", "@thi.ng/atom": "^2.0.3", "@thi.ng/checks": "^2.1.0", "@thi.ng/errors": "^1.0.2", "@thi.ng/paths": "^2.0.3", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "datastructure", diff --git a/packages/sax/CHANGELOG.md b/packages/sax/CHANGELOG.md index 214e0bc157..2e3f1f0a16 100644 --- a/packages/sax/CHANGELOG.md +++ b/packages/sax/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@1.0.4...@thi.ng/sax@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/sax + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/sax@1.0.3...@thi.ng/sax@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/sax diff --git a/packages/sax/package.json b/packages/sax/package.json index d4b7873e7f..c2af85f289 100644 --- a/packages/sax/package.json +++ b/packages/sax/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/sax", - "version": "1.0.4", + "version": "1.0.5", "description": "Transducer-based, SAX-like, non-validating, speedy & tiny XML parser", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/transducers": "^4.0.1", - "@thi.ng/transducers-fsm": "^1.0.4" + "@thi.ng/transducers": "^5.0.0", + "@thi.ng/transducers-fsm": "^1.0.5" }, "keywords": [ "ES6", diff --git a/packages/transducers-binary/CHANGELOG.md b/packages/transducers-binary/CHANGELOG.md index 79c48288f1..61d09a43bc 100644 --- a/packages/transducers-binary/CHANGELOG.md +++ b/packages/transducers-binary/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [0.2.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-binary@0.1.1...@thi.ng/transducers-binary@0.2.0) (2019-02-15) + + +### Bug Fixes + +* **transducers-binary:** update juxt import ([77ed4c5](https://github.com/thi-ng/umbrella/commit/77ed4c5)) + + +### Features + +* **transducers-binary:** add utf8Length() ([7cf98ef](https://github.com/thi-ng/umbrella/commit/7cf98ef)) + + + + + ## [0.1.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-binary@0.1.0...@thi.ng/transducers-binary@0.1.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/transducers-binary diff --git a/packages/transducers-binary/package.json b/packages/transducers-binary/package.json index b70294751d..3d530a0ebe 100644 --- a/packages/transducers-binary/package.json +++ b/packages/transducers-binary/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-binary", - "version": "0.1.1", + "version": "0.2.0", "description": "Binary data related transducers & reducers", "module": "./index.js", "main": "./lib/index.js", @@ -32,9 +32,9 @@ "typescript": "^3.2.2" }, "dependencies": { - "@thi.ng/compose": "^1.0.2", + "@thi.ng/compose": "^1.1.0", "@thi.ng/strings": "^1.0.3", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "base64", @@ -56,4 +56,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/transducers-fsm/CHANGELOG.md b/packages/transducers-fsm/CHANGELOG.md index 98a4d8a0dd..7be60fe509 100644 --- a/packages/transducers-fsm/CHANGELOG.md +++ b/packages/transducers-fsm/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@1.0.4...@thi.ng/transducers-fsm@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/transducers-fsm + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-fsm@1.0.3...@thi.ng/transducers-fsm@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/transducers-fsm diff --git a/packages/transducers-fsm/package.json b/packages/transducers-fsm/package.json index 5bf3d6ba55..e0537257e8 100644 --- a/packages/transducers-fsm/package.json +++ b/packages/transducers-fsm/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-fsm", - "version": "1.0.4", + "version": "1.0.5", "description": "Transducer-based Finite State Machine transformer", "module": "./index.js", "main": "./lib/index.js", @@ -33,7 +33,7 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "ES6", diff --git a/packages/transducers-hdom/CHANGELOG.md b/packages/transducers-hdom/CHANGELOG.md index 6d4c29196b..d6f3eaad13 100644 --- a/packages/transducers-hdom/CHANGELOG.md +++ b/packages/transducers-hdom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@2.0.4...@thi.ng/transducers-hdom@2.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/transducers-hdom + + + + + ## [2.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-hdom@2.0.3...@thi.ng/transducers-hdom@2.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/transducers-hdom diff --git a/packages/transducers-hdom/package.json b/packages/transducers-hdom/package.json index 4b748a510a..b6018fedb3 100644 --- a/packages/transducers-hdom/package.json +++ b/packages/transducers-hdom/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-hdom", - "version": "2.0.4", + "version": "2.0.5", "description": "Transducer based UI updater for @thi.ng/hdom", "module": "./index.js", "main": "./lib/index.js", @@ -34,7 +34,7 @@ "dependencies": { "@thi.ng/hdom": "^7.1.0", "@thi.ng/hiccup": "^3.0.3", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "diff", diff --git a/packages/transducers-stats/CHANGELOG.md b/packages/transducers-stats/CHANGELOG.md index ec820d92d8..b8e276328b 100644 --- a/packages/transducers-stats/CHANGELOG.md +++ b/packages/transducers-stats/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.0.5](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@1.0.4...@thi.ng/transducers-stats@1.0.5) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/transducers-stats + + + + + ## [1.0.4](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers-stats@1.0.3...@thi.ng/transducers-stats@1.0.4) (2019-02-10) **Note:** Version bump only for package @thi.ng/transducers-stats diff --git a/packages/transducers-stats/package.json b/packages/transducers-stats/package.json index 15b629d2d1..120a4488c6 100644 --- a/packages/transducers-stats/package.json +++ b/packages/transducers-stats/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers-stats", - "version": "1.0.4", + "version": "1.0.5", "description": "Transducers for statistical / technical analysis", "module": "./index.js", "main": "./lib/index.js", @@ -33,9 +33,9 @@ }, "dependencies": { "@thi.ng/checks": "^2.1.0", - "@thi.ng/dcons": "^2.0.4", + "@thi.ng/dcons": "^2.0.5", "@thi.ng/errors": "^1.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "ES6", diff --git a/packages/transducers/CHANGELOG.md b/packages/transducers/CHANGELOG.md index ac27efd5a3..d7927bcacc 100644 --- a/packages/transducers/CHANGELOG.md +++ b/packages/transducers/CHANGELOG.md @@ -3,6 +3,49 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@4.0.1...@thi.ng/transducers@5.0.0) (2019-02-15) + + +### Code Refactoring + +* **transducers:** remove obsolete fns, update to use [@thi](https://github.com/thi).ng/arrays ([83cb816](https://github.com/thi-ng/umbrella/commit/83cb816)) +* **transducers:** remove obsolete randomID() & weightedRandom() ([4b0eec6](https://github.com/thi-ng/umbrella/commit/4b0eec6)) +* **transducers:** restructure, migrate / remove various functions ([05bf213](https://github.com/thi-ng/umbrella/commit/05bf213)) + + +### BREAKING CHANGES + +* **transducers:** migrate / remove various functions to other packages + +- constantly(), delay(), identity() => @thi.ng/compose +- randomID(), weightedRandom() => @thi.ng/random +- remove re-exports: + - even(), odd() (from @thi.ng/checks) + - juxt() (from @thi.ng/compose) +- remove obsolete hex() fn (use @thi.ng/strings fns instead) +* **transducers:** migrate randomID() & weightedRandom() to @thi.ng/random + +- update choices() iterator +* **transducers:** migrate various support fns to @thi.ng/arrays + +- remove/migrate functions: + - binarySearch() + - ensureArray() / ensureIterable() + - fuzzyMatch() + - peek() + - shuffleN() + - swizzler() +- add support for IRandom in: + - randomID() + - choices() + - weightedRandom() + - sample() +- update deps / readme + + + + + ## [4.0.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/transducers@4.0.0...@thi.ng/transducers@4.0.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/transducers diff --git a/packages/transducers/package.json b/packages/transducers/package.json index f9e0cf8412..65698c2f11 100644 --- a/packages/transducers/package.json +++ b/packages/transducers/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/transducers", - "version": "4.0.1", + "version": "5.0.0", "description": "Lightweight transducer implementations for ES6 / TypeScript", "module": "./index.js", "main": "./lib/index.js", @@ -33,13 +33,13 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/arrays": "^0.0.1", + "@thi.ng/arrays": "^0.1.0", "@thi.ng/checks": "^2.1.0", "@thi.ng/compare": "^1.0.2", - "@thi.ng/compose": "^1.0.2", + "@thi.ng/compose": "^1.1.0", "@thi.ng/equiv": "^1.0.2", "@thi.ng/errors": "^1.0.2", - "@thi.ng/random": "^1.0.2", + "@thi.ng/random": "^1.1.0", "@thi.ng/strings": "^1.0.3" }, "keywords": [ @@ -68,4 +68,4 @@ "access": "public" }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/vector-pools/CHANGELOG.md b/packages/vector-pools/CHANGELOG.md index 36189f8b44..9597776ef7 100644 --- a/packages/vector-pools/CHANGELOG.md +++ b/packages/vector-pools/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.2](https://github.com/thi-ng/umbrella/compare/@thi.ng/vector-pools@0.2.1...@thi.ng/vector-pools@0.2.2) (2019-02-15) + +**Note:** Version bump only for package @thi.ng/vector-pools + + + + + ## [0.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/vector-pools@0.2.0...@thi.ng/vector-pools@0.2.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/vector-pools diff --git a/packages/vector-pools/package.json b/packages/vector-pools/package.json index 287af598ca..2cb82189ce 100644 --- a/packages/vector-pools/package.json +++ b/packages/vector-pools/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/vector-pools", - "version": "0.2.1", + "version": "0.2.2", "description": "Data structures for managing & working with strided, memory mapped vectors", "module": "./index.js", "main": "./lib/index.js", @@ -33,8 +33,8 @@ }, "dependencies": { "@thi.ng/api": "^5.0.2", - "@thi.ng/malloc": "^2.0.1", - "@thi.ng/vectors": "^2.2.1" + "@thi.ng/malloc": "^2.0.2", + "@thi.ng/vectors": "^2.3.0" }, "keywords": [ "ES6", @@ -57,4 +57,4 @@ "setTimeout": false }, "sideEffects": false -} \ No newline at end of file +} diff --git a/packages/vectors/CHANGELOG.md b/packages/vectors/CHANGELOG.md index 25b808764d..a38cfb3772 100644 --- a/packages/vectors/CHANGELOG.md +++ b/packages/vectors/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.3.0](https://github.com/thi-ng/umbrella/compare/@thi.ng/vectors@2.2.1...@thi.ng/vectors@2.3.0) (2019-02-15) + + +### Features + +* **vectors:** add fit, fit01, fit11 fns ([161d19d](https://github.com/thi-ng/umbrella/commit/161d19d)) + + + + + ## [2.2.1](https://github.com/thi-ng/umbrella/compare/@thi.ng/vectors@2.2.0...@thi.ng/vectors@2.2.1) (2019-02-10) **Note:** Version bump only for package @thi.ng/vectors diff --git a/packages/vectors/package.json b/packages/vectors/package.json index d5c848e7f5..b82a2a77c4 100644 --- a/packages/vectors/package.json +++ b/packages/vectors/package.json @@ -1,6 +1,6 @@ { "name": "@thi.ng/vectors", - "version": "2.2.1", + "version": "2.3.0", "description": "Optimized 2d/3d/4d and arbitrary length vector operations", "module": "./index.js", "main": "./lib/index.js", @@ -38,8 +38,8 @@ "@thi.ng/errors": "^1.0.2", "@thi.ng/math": "^1.1.0", "@thi.ng/memoize": "^1.0.2", - "@thi.ng/random": "^1.0.2", - "@thi.ng/transducers": "^4.0.1" + "@thi.ng/random": "^1.1.0", + "@thi.ng/transducers": "^5.0.0" }, "keywords": [ "2D",