Transducers.jl provides composable algorithms on "sequence" of inputs. They are called transducers, first introduced in Clojure language by Rich Hickey.
Using transducers is quite straightforward, especially if you already know similar concepts in iterator libraries:
using Transducers
1:40 |> Partition(7) |> Filter(x -> prod(x) % 11 == 0) |> Cat() |> Scan(+) |> sum
However, the protocol used for the transducers is quite different from
iterators and results in a better performance for complex
compositions. Furthermore, some transducers support parallel
execution. If a transducer is composed of such transducers, it can be
automatically re-used both in sequential (foldl
etc.) and parallel
(reduce
etc.) contexts.
See more in the documentation.
using Pkg
Pkg.add("Transducers")
- ThreadsX.jl implements
Base
-like API based on Transducers.jl. It is highly recommended for using threaded computation without fully switching to transducers. - LazyGroupBy.jl wraps
Transducers.Groupby
in an easy-to-use syntax. - DataTools.jl is a set of tools for data analysis built on top of Transducers.jl.
- BangBang.jl implements
mutate-or-widen API. This is the foundation of
typocalypse-free
map
/collect
-like functions. Functions such asappend!!
,merge!!
,mergewith!!
,union!!
, etc. are useful as a reducing function. - InitialValues.jl provides a framework for initial/identity element of folds.
- MicroCollections.jl provides empty and singleton collections (arrays, dicts and sets). They are useful when writing transducers and reducing functions that construct a data collection.