| benchs | ||
| doc | ||
| examples | ||
| media | ||
| src | ||
| tests | ||
| .gitignore | ||
| .header | ||
| .merlin | ||
| .ocamlinit | ||
| _oasis | ||
| _tags | ||
| AUTHORS.md | ||
| CHANGELOG.md | ||
| configure | ||
| HOWTO.md | ||
| LICENSE | ||
| Makefile | ||
| myocamlbuild.ml | ||
| opam | ||
| README.md | ||
| setup.ml | ||
ocaml-containers
What is containers?
- A usable, reasonably well-designed library that extends OCaml's standard
library (in
core/, packaged undercontainersin ocamlfind. Modules are totally independent and are prefixed withCC(for "containers-core" or "companion-cube" because I'm megalomaniac). This part should be usable and should work. For instance,CCListcontains functions and lists including safe versions ofmapandappend. It also provides a drop-in replacement to the standard library, in the moduleContainers(intended to be opened, replaces some stdlib modules with extended ones) - Several small additional libraries that complement it:
containers.datawith additional data structures that don't have an equivalent in the standard library;containers.io(deprecated)containers.iterwith list-like and tree-like iterators;containers.string(in directorystring) with a few packed modules that deal with strings (Levenshtein distance, KMP search algorithm, and a few naive utils). Again, modules are independent and sometimes parametric on the string and char types (so they should be able to deal with your favorite unicode library).
- A sub-library with complicated abstractions,
containers.advanced(with a LINQ-like query module, batch operations using GADTs, and others). - Utilities around the
unixlibrary incontainers.unix(mainly to spawn sub-processes) - A bigstring module using
bigarrayincontainers.bigarray - A lightweight S-expression printer and streaming parser in
containers.sexp - A library using Lwt,
containers.lwt. Currently only contains experimental, unstable stuff. - Random stuff, with NO GUARANTEE of even being barely usable or tested,
in other dirs (mostly
miscbut alsolwtandthreads). It's where I tend to write code when I want to test some idea, so half the modules (at least) are unfinished or don't really work.
Some of the modules have been moved to their own repository (e.g. sequence,
gen, qcheck) and are on opam for great fun and profit.
Change Log
See this file.
Finding help
- new: Mailing List on the forge;
the address is
containers-users@lists.forge.ocamlcore.org - the github wiki
- on IRC, ask
companion_cubeon#ocaml (experimental, might not exist forever)
Use
You can either build and install the library (see Build), or just copy
files to your own project. The last solution has the benefits that you
don't have additional dependencies nor build complications (and it may enable
more inlining). Since modules have a friendly license and are mostly
independent, both options are easy.
In a toplevel, using ocamlfind:
# #use "topfind";;
# #require "containers";;
# CCList.flat_map;;
- : ('a -> 'b list) -> 'a list -> 'b list = <fun>
# open Containers;; (* optional *)
# List.flat_map ;;
- : ('a -> 'b list) -> 'a list -> 'b list = <fun>
If you have comments, requests, or bugfixes, please share them! :-)
License
This code is free, under the BSD license.
The logo (media/logo.png) is
CC-SA3 wikimedia.
Contents
The design is mostly centered around polymorphism rather than functors. Such
structures comprise (some modules in misc/, some other in core/):
Core Modules (extension of the standard library)
the core library, containers, now depends on
cppo and base-bytes (provided
by ocamlfind).
Documentation here.
CCHeap, a purely functional heap structureCCVector, a growable array (pure OCaml, no C) with mutability annotationsCCList, functions on lists, including tail-recursive implementations ofmapandappendand many other thingsCCArray, utilities on arrays and slicesCCHashtbl,CCMapextensions of the standard modulesHashtblandMapCCIntCCString(basic string operations)CCPair(cartesian products)CCOpt(options, very useful)CCFun(function combinators)CCBoolCCFloatCCOrd(combinators for total orderings)CCRandom(combinators for random generators)CCPrint(printing combinators)CCHash(hashing combinators)CCError(monadic error handling, very useful)CCIO, basic utilities for IO (channels, files)
Containers.data
CCBitField, bitfields embedded in integersCCBloom, a bloom filterCCCache, memoization caches, LRU, etc.CCFlatHashtbl, a flat (open-addressing) hashtable functorial implementationCCTrie, a prefix treeCCHashTrie, a map where keys are hashed and put in a trie by hashCCMultimapandCCMultiset, functors defining persistent structuresCCFQueue, a purely functional double-ended queue structureCCBV, mutable bitvectorsCCHashSet, mutable setCCPersistentHashtblandCCPersistentArray, a semi-persistent array and hashtable (similar to persistent arrays)CCMixmap,CCMixtbl,CCMixset, containers of universal types (heterogenous containers)CCRingBuffer, a double-ended queue on top of an array-like structure, with batch operationsCCIntMap, map specialized for integer keys based on Patricia Trees, with fast mergesCCHashconsedSet, a set structure with sharing of sub-structuresCCGraph, a small collection of graph algorithmsCCBitField, a type-safe implementation of bitfields that fit inintCCWBTree, a weight-balanced tree, implementing a map interfaceCCRAL, a random-access list structure, withO(1)cons/hd/tl andO(ln(n))access to elements by their index.
Containers.io
deprecated, CCIO is now a core module. You can still install it and
depend on it but it contains no useful module.
Containers.unix
CCUnix, utils forUnix
Containers.sexp
A small S-expression library.
CCSexp, a small S-expression library
Containers.iter
Iterators:
CCKList, a persistent iterator structure (akin to a lazy list, without memoization)CCKTree, an abstract lazy tree structure
String
See doc.
In the module Containers_string:
Levenshtein: edition distance between two stringsKMP: Knuth-Morris-Pratt substring algorithm
Advanced
See doc.
In the module Containers_advanced:
CCLinq, high-level query language over collectionsCCCat, a few categorical structuresCCBatch, to combine operations on collections into one traversal
Thread
In the library containers.thread, for preemptive system threads:
CCFuture, a set of tools for preemptive threading, including a thread pool, monadic futures, and MVars (concurrent boxes)CCLock, values protected by locksCCSemaphore, a simple implementation of semaphoresCCThreadbasic wrappers forThread
Misc
See doc. This list is not necessarily up-to-date.
AbsSet, an abstract Set data structure, a bit likeLazyGraph.Automaton,CSM, state machine abstractionsBij, a GADT-based bijection language used to serialize/deserialize your data structuresHashset, a polymorphic imperative set on top ofPHashtblLazyGraph, a lazy graph structure on arbitrary (hashable+eq) types, with basic graph functions that work even on infinite graphs, and printing to DOT.PHashtbl, a polymorphic hashtable (with open addressing)RoseTree, a tree with an arbitrary number of children and its associated zipperSmallSet, a sorted list implementation behaving like a set.UnionFind, a functorial imperative Union-Find structureUniv, a universal type encoding with affectation
Others
containers.lwtcontains Lwt-related modules (experimental)
There is a QuickCheck-like library called QCheck (now in its own repo).
Incoming (Breaking) Changes
the following breaking changes are likely to occur for the next release (they can still be discussed, of course):
- moving
containers.lwtinto its own repository and opam package - moving
containers.miscinto its own repository and opam package (improving the average quality of containers!) - aliasing and deprecating
CCList.split(confusion withList.split)
already in git (but can be reverted if needed):
- change exceptions in
CCVector - change signature of
CCDeque.of_seq(remove optional argument) - heavily refactor
CCLinqincontainers.advanced. If you use this module, you will most likely have to change your code (into simpler code, hopefully). RALincontainers.miscmoved tocontainers.dataasCCRAL, and is getting improved on the way
Build
You will need OCaml >= 4.01.0.
Via opam
The prefered way to install is through opam.
$ opam install containers
From Sources
On the branch master you will need oasis to build the library. On the
branch stable it is not necessary.
$ make
To build and run tests (requires oUnit, qtest, and qcheck):
$ opam install oUnit qtest qcheck
$ ./configure --enable-tests
$ make test
To build the small benchmarking suite (requires benchmark):
$ opam install benchmark
$ make bench
$ ./benchs.native
Contributing
PRs on github are welcome (patches by email too, if you prefer so).
A few guidelines:
- no dependencies between basic modules (even just for signatures);
- add
@sincetags for new functions; - add tests if possible (using
qtest).
