"A collection of functional programming libraries that can be composed together. Unlike a framework, thi.ng is a suite of instruments and you (the user) must be the composer of. Geared towards versatility, not any specific type of music." β @loganpowell via Twitter
Please visit thi.ng for additional information & topic based search of packages relevant to your use cases...
Mono-repository for 151+ thi.ng TypeScript/ES6 projects, a wide collection of largely data transformation oriented packages and building blocks for (non-exhaustive list of topics):
- Functional programming (composition, memoization, transducers, multi-methods)
- Data structures & data transformations for wide range of use cases (list, sets, maps, joins, spatial indexing, clocks)
- ES6 iterators/generators
- Immutable data handling, state containers, transacted state updates, Undo-Redo history
- Vector & matrix implementations with optional support for strided layouts, SIMD etc.
- Value-based equivalence
- Data driven UI component toolkits (multiple approaches)
- Reactive programming, stream / transducer based dataflow graphs / pipelines
- WebWorker workflow abstractions
- DSP building blocks: oscillators, noise generators, filters, 1D FFT/IFFT, muxers, rate converters
- 2D geometry generation, shape primitives, processing, conversion & visualization
- Canvas abstractions & SVG conversion
- Semi-declarative WebGL 1/2 abstraction layer
- DSL for shader functions defined in TypeScript and cross-compilation to GLSL, JS, VEX etc.
- Date/time iterators, formatters, math
- PEG-style parser combinators, FSM primitives
- Forth-style pointfree DSL for functional composition
- S-expression parser & runtime infrastructure for custom DSL creation
- Multi-format pixel buffers, conversions, Porter-Duff alpha-blending operators
- Color space/format conversions, matrix based color manipulation, cosine gradients
- Canvas-based Immediate mode GUI components
- Low-level tooling for binary data, shared memory/WASM/WebGL interop
- etc. (see package overview below)
...all with a keen eye on simplicity, re-use & minimalism without sacrificing flexibility.
This project is NOT a framework, provides no turn-key, one-size-fits-all approach and instead encourages a mix & match philosophy for various key aspects of application design (in & outside the browser). Most customization points only expect certain interfaces/type signatures rather than concrete implementations.
All packages:
- are versioned independently
- distributed in ES2017 syntax and multiple formats (ESM, CommonJS, UMD) with TypeScript typings & change logs
- highly modular with largely only a few closely related functions or single function / class per file to help w/ tree shaking
- provide re-exports of all their publics for full library imports
- have either none or only @thi.ng internal runtime dependencies
- declare public interfaces, enums & types in an
api.ts
and/orconstants.ts
file (larger packages only) - have auto-generated online documentation at docs.thi.ng
- licensed under Apache Software License 2.0
Most packages:
- have been used in production
- have detailed, individual README files w/ small usage examples
There's a steadily growing number (100+) of standalone examples (different complexities, often combining functionality from several packages) in the examples directory.
Example screenshots | (small selection) | |
---|---|---|
-
"Of umbrellas, transducers, reactive streams & mushrooms" (ongoing series):
Join our little community on our Discord server or get in touch via Twitter or the issue tracker. If you'd like to contribute, please first read this document.
In general, we welcome contributions of all kinds (docs, examples, bug fixes, feature requests, financial contributions etc.). You can find a fairly detailed overview for contributors here: CONTRIBUTING.md.
Note: The default branch for this repo is develop
. As of 2020-12-08,
we've also renamed master
to the more suitable main
branch. If you have
local clones, please follow the advice & short instructions in this
article
to update your local version.
Also please be sure to check the wiki for other project-wide information, tidbits, useful snippets etc.
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/date |
changelog | Date/time iterators, formatters, rounding | |
@thi.ng/distance |
changelog | n-D distance metrics & K-nearest neighborhoods | |
@thi.ng/k-means |
changelog | K-means clustering of n-D data | |
@thi.ng/lowdisc |
changelog | n-D Low discrepancy sequence generators | |
@thi.ng/math |
changelog | Assorted common math functions & utilities | |
@thi.ng/mime |
changelog | File extension to MIME type mappings | |
@thi.ng/pixel |
changelog | Multi-format pixel buffers | |
@thi.ng/transducers |
changelog | Composable data transformations | |
@thi.ng/vectors |
changelog | Fixed & arbitrary-length vector ops |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/args |
changelog | Declarative & functional CLI arg parsing & coercions | |
@thi.ng/api |
changelog | Common types, decorators, mixins | |
@thi.ng/bench |
changelog | Basic benchmarking helpers | |
@thi.ng/checks |
changelog | Type & value checks | |
@thi.ng/compare |
changelog | Comparators | |
@thi.ng/compose |
changelog | Functional composition helpers | |
@thi.ng/date |
changelog | Date/time iterators, formatters, rounding | |
@thi.ng/defmulti |
changelog | Dynamic multiple dispatch | |
@thi.ng/distance |
changelog | n-D distance metrics & K-nearest neighborhoods | |
@thi.ng/equiv |
changelog | Deep value equivalence checking | |
@thi.ng/errors |
changelog | Custom error types | |
@thi.ng/hex |
changelog | Hex value formatters for U4-64 words | |
@thi.ng/memoize |
changelog | Function memoization w/ customizable caching | |
@thi.ng/oquery |
changelog | Pattern based query engine for JS objects | |
@thi.ng/parse |
changelog | Parser combinators & AST generator/transformer | |
@thi.ng/paths |
changelog | Immutable nested object accessors | |
@thi.ng/strings |
changelog | Higher-order string formatting utils | |
@thi.ng/system |
changelog | Minimal life cycle container for stateful app components |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/dual-algebra |
changelog | Dual number algebra / automatic differentiation | |
@thi.ng/dsp |
changelog | DSP utils, composable signal gens/processors | |
@thi.ng/fuzzy |
changelog | Fuzzy logic primitives & rule inference engine | |
@thi.ng/intervals |
changelog | Open/closed intervals, queries, set ops | |
@thi.ng/math |
changelog | Assorted common math functions & utilities | |
@thi.ng/matrices |
changelog | Matrix operations | |
@thi.ng/sparse |
changelog | Sparse matrix & vector impls | |
@thi.ng/vectors |
changelog | Fixed & arbitrary-length vector ops |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/colored-noise |
changelog | 1D colored noise generators | |
@thi.ng/ksuid |
changelog | K-sortable unique identifiers, binary & base-N encoded | |
@thi.ng/lowdisc |
changelog | n-D Low discrepancy sequence generators | |
@thi.ng/random |
changelog | Seedable PRNG implementations, distributions & utilities |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/bencode |
changelog | Bencode binary format encoding | |
@thi.ng/csv |
changelog | Customizable CSV parser/object mapper | |
@thi.ng/dot |
changelog | Graphviz DOM & export | |
@thi.ng/dsp-io-wav |
changelog | WAV file format exporter | |
@thi.ng/geom-io-obj |
changelog | Wavefront OBJ model parser | |
@thi.ng/hiccup-css |
changelog | CSS from nested JS data structures | |
@thi.ng/hiccup-html |
changelog | Type-checked HTML5 element wrappers for hiccup | |
@thi.ng/hiccup-markdown |
changelog | Hiccup-to-Markdown serialization | |
@thi.ng/hiccup-svg |
changelog | hiccup based SVG vocab | |
@thi.ng/iges |
changelog | IGES format geometry serialization | |
@thi.ng/mime |
changelog | File extension to MIME type mappings | |
@thi.ng/pixel-io-netpbm |
changelog | 1/8/16/24bit NetPBM image format reader/writer | |
@thi.ng/prefixes |
changelog | Linked Data, RDF & xmlns prefixes/URLs | |
@thi.ng/sax |
changelog | SAX-like XML parser / transducer |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/csp |
changelog | Channel based async ops | |
@thi.ng/fsm |
changelog | FSM / parser primitives | |
@thi.ng/grid-iterators |
changelog | 2D grid iterator strategies | |
@thi.ng/iterators |
changelog | ES6 generators / iterators | |
@thi.ng/seq |
changelog | Lisp/Clojure-style sequence abstraction | |
@thi.ng/transducers |
changelog | Composable data transformations | |
@thi.ng/transducers-binary |
changelog | Binary data related transducers | |
@thi.ng/transducers-fsm |
changelog | Finite state transducer | |
@thi.ng/transducers-hdom |
changelog | Transducer based hdom UI updates | |
@thi.ng/transducers-patch |
changelog | Patch-based, array & object editing | |
@thi.ng/transducers-stats |
changelog | Technical / statistical analysis |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/rstream |
changelog | Push-based, reactive event stream primitves | |
@thi.ng/rstream-csp |
changelog | Adapter bridge CSP -> rstream | |
@thi.ng/rstream-dot |
changelog | Graphviz visualization of rstream topologies | |
@thi.ng/rstream-gestures |
changelog | Mouse & touch event stream abstraction | |
@thi.ng/rstream-graph |
changelog | Declarative dataflow graph construction | |
@thi.ng/rstream-log |
changelog | Hierarchical structured data logging | |
@thi.ng/rstream-log-file |
changelog | Log-file output handler | |
@thi.ng/rstream-query |
changelog | Triple store & query engine |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/adjacency |
changelog | Adjacency matrices & graph algorithms | |
@thi.ng/arrays |
changelog | Array utilities | |
@thi.ng/associative |
changelog | Alt Set & Map implementations | |
@thi.ng/atom |
changelog | Immutable value wrappers, views, history | |
@thi.ng/bitfield |
changelog | 1D/2D bit field implementations | |
@thi.ng/cache |
changelog | In-memory caches / strategies | |
@thi.ng/dcons |
changelog | Doubly-linked list | |
@thi.ng/diff |
changelog | Array & object diffing | |
@thi.ng/dgraph |
changelog | Dependency graph | |
@thi.ng/ecs |
changelog | Entity-Component System | |
@thi.ng/egf |
changelog | Extensible Graph Format | |
@thi.ng/gp |
changelog | Genetic programming helpers / AST gen | |
@thi.ng/heaps |
changelog | Binary & d-ary heap impls | |
@thi.ng/idgen |
changelog | Versioned ID generation / free-list | |
@thi.ng/k-means |
changelog | K-means clustering of n-D data | |
@thi.ng/ramp |
changelog | Parametric, interpolated lookup tables | |
@thi.ng/quad-edge |
changelog | Quad-edge, dual-graph data structure | |
@thi.ng/resolve-map |
changelog | DAG computations & value resolution | |
@thi.ng/vclock |
changelog | Vector clock functions / comparators | |
@thi.ng/zipper |
changelog | Immutable tree editing / navigation |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/adapt-dpi |
changelog | HDPI canvas adaptation / styling util | |
@thi.ng/dl-asset |
changelog | Asset download trigger helper | |
@thi.ng/hdiff |
changelog | String diffing w/ hiccup output (includes CLI) | |
@thi.ng/hdom |
changelog | Hiccup based VDOM & diffing | |
@thi.ng/hdom-canvas |
changelog | hdom adapter for hiccup-canvas | |
@thi.ng/hdom-components |
changelog | hdom based UI components | |
@thi.ng/hdom-mock |
changelog | hdom mock implementation (testing / prototyping) | |
@thi.ng/hiccup |
changelog | S-expression based HTML/XML serialization | |
@thi.ng/hiccup-canvas |
changelog | hiccup interpreter for canvas api | |
@thi.ng/hiccup-carbon-icons |
changelog | IBM Carbon icons in hiccup format | |
@thi.ng/imgui |
changelog | Immediate mode GUI | |
@thi.ng/interceptors |
changelog | Composable event handlers & processor | |
@thi.ng/rdom |
changelog | Reactive, diff-less, async UI components | |
@thi.ng/rdom-canvas |
changelog | rdom component wrapper for thi.ng/hiccup-canvas | |
@thi.ng/rdom-components |
changelog | Unstyled, customizable component collection | |
@thi.ng/router |
changelog | Customizable browser & non-browser router | |
@thi.ng/text-canvas |
changelog | Text-mode canvas, drawing, tables, charts |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/color |
changelog | Color conversions, gradients | |
@thi.ng/dgraph-dot |
changelog | Dependency graph -> Graphviz | |
@thi.ng/fuzzy-viz |
changelog | Visualization, instrumentation for @thi.ng/fuzzy | |
@thi.ng/geom |
changelog | 2D only geometry types & ops | |
@thi.ng/geom-accel |
changelog | Spatial indexing data structures | |
@thi.ng/geom-api |
changelog | Shared types & interfaces | |
@thi.ng/geom-arc |
changelog | 2D elliptic arc utils | |
@thi.ng/geom-clip-line |
changelog | 2D line clipping | |
@thi.ng/geom-clip-poly |
changelog | 2D convex polygon clipping | |
@thi.ng/geom-closest-point |
changelog | Closest point helpers | |
@thi.ng/geom-fuzz |
changelog | Fuzzy 2D shape drawing / filling | |
@thi.ng/geom-hull |
changelog | 2D convex hull (Graham scan) | |
@thi.ng/geom-isec |
changelog | Point & shape intersection tests | |
@thi.ng/geom-isoline |
changelog | 2D contour line extraction | |
@thi.ng/geom-poly-utils |
changelog | 2D polygon helpers | |
@thi.ng/geom-resample |
changelog | nD polyline / curve resampling | |
@thi.ng/geom-splines |
changelog | nD cubic / quadratic spline ops | |
@thi.ng/geom-subdiv-curve |
changelog | nD iterative subdivision curves | |
@thi.ng/geom-tessellate |
changelog | nD convex polygon tessellators | |
@thi.ng/geom-voronoi |
changelog | 2D iterative delaunay/voronoi | |
@thi.ng/lsys |
changelog | Extensible L-System architecture | |
@thi.ng/pixel |
changelog | Multi-format pixel buffers | |
@thi.ng/poisson |
changelog | nD Poisson disk sampling | |
@thi.ng/porter-duff |
changelog | Alpha blending / compositing ops | |
@thi.ng/scenegraph |
changelog | Extensible 2D/3D scenegraph | |
@thi.ng/simd |
changelog | WebAssembly SIMD vector batch processing | |
@thi.ng/viz |
changelog | Declarative & functional data visualization toolkit |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/shader-ast |
changelog | AST DSL for x-platform shader code | |
@thi.ng/shader-ast-glsl |
changelog | GLSL code generator | |
@thi.ng/shader-ast-js |
changelog | JS code generator | |
@thi.ng/shader-ast-stdlib |
changelog | 100+ useful AST shader functions | |
@thi.ng/webgl |
changelog | WebGL 1/2 / GPGPU facilities | |
@thi.ng/webgl-msdf |
changelog | MSDF font rendering | |
@thi.ng/webgl-shadertoy |
changelog | Shadertoy-like WebGL setup |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/base-n |
changelog | Arbitrary base-n encoding/decoding with presets | |
@thi.ng/binary |
changelog | Assorted binary / bitwise ops, utilities | |
@thi.ng/bitstream |
changelog | Bitwise input / output streams | |
@thi.ng/dlogic |
changelog | Digital logic ops / constructs | |
@thi.ng/leb128 |
changelog | WASM based LEB128 varint encoder / decoder | |
@thi.ng/malloc |
changelog | Raw & typed array memory pool & allocator | |
@thi.ng/morton |
changelog | Z-order-curve / Morton coding | |
@thi.ng/range-coder |
changelog | Binary data Range encoder / decoder | |
@thi.ng/rle-pack |
changelog | Run-length encoding data compression | |
@thi.ng/soa |
changelog | Memory mapped data structures & serialization | |
@thi.ng/unionstruct |
changelog | Wrapper for C-like structs / unions | |
@thi.ng/vector-pools |
changelog | Data structures for memory mapped vectors |
Project | Version | Changelog | Description |
---|---|---|---|
@thi.ng/pointfree |
changelog | Stack-based DSL & functional composition | |
@thi.ng/pointfree-lang |
changelog | Forth-like syntax layer for @thi.ng/pointfree | |
@thi.ng/sexpr |
changelog | S-Expression parser & runtime infrastructure |
git clone https://github.com/thi-ng/umbrella.git
cd umbrella
yarn install
yarn build
Once the entire mono-repo has been fully built at least once before, individual packages can then be (re)built like so:
lerna run build --scope @thi.ng/transducers
Please see the example build instructions in the wiki for further details.
(most, but not all packages have tests)
yarn test
# or individually
lerna run test --scope @thi.ng/rstream
The resulting reports will be saved under /packages/*/coverage/lcov-report/
.
yarn cover
Autogenerated documentation (using
TypeDoc) will be saved under
/packages/*/doc/
and is also available at docs.thi.ng.
yarn doc
Furthermore, an experimental tsdoc-based documentation repo provides an alternative markdown output including cross-references between all packages, but currently isn't frequently updated (only every few months):
https://github.com/thi-ng/umbrella-docs-temp
Β© 2015 - 2021 Karsten Schmidt // Apache Software License 2.0
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!