Juniper is a library of extensions to the Go standard library using generics, including containers, iterators, and streams.
container/tree
contains aMap
andSet
that keep elements in sorted order. They are implemented using a B-tree, which performs better than a binary search tree.container/deque
contains a double-ended queue implemented with a ring buffer.container/xheap
contains a min-heap similar to the standard library'scontainer/heap
but more ergonomic, along with aPriorityQueue
that allows setting priorities by key.container/xlist
contains a linked-list similar to the standard library'scontainer/list
, but type-safe.xslices
contains some commonly-used slice operations, likeChunk
,Reverse
,Clear
, andJoin
.iterator
contains an iterator interface used by the containers, along with functions to manipulate them, likeMap
,While
, andReduce
.stream
contains a stream interface, which is an iterator that can fail. Useful for iterating over collections that require I/O. It has most of the same combinators asiterator
, plus some extras likePipe
andBatch
.parallel
contains some shorthand for common uses of goroutines to process slices, iterators, and streams in parallel, likeparallel.MapStream
.xsort
contains extensions to the standard library packagesort
. Notably, it also has the definition forxsort.Less
, which is how custom orderings can be defined for sorting and also for ordered collections like fromcontainer/tree
.- You can probably guess what's in the packages
xerrors
,xmath
,xmath/xrand
,xsync
, andxtime
.
Packages that overlap directly with a standard library package are named the same but with an x
prefix for "extensions", e.g. sort
and xsort
.
See the docs for more.