Data packed tight like a tin can of sardines.
The libraries bytestring
, text
, aeson
, and attoparsec
all have a few
things in common. They are known to be some of the fastest Haskell libraries
to exist for widespread production use, they are well-vetted by the Haskell
community, and their approaches to their internal API are old. packed
implements
its own bytestring
, text
, aeson
, and parsers (not necessarily in the spirit
of attoparsec
, also there are a number of parsers in this library).
For packed
, we want to avoid using the C FFI, instead wishing to implement things
in pure GHC Haskell. Most things in packed
are implemented using -XUnboxedSums
and -XUnboxedTuples
. The aforementioned libraries were created before
of UnboxedSums
and before resizeMutableByteArray#
. These push the design
decisions of packed
in a different direction. Additionally, we do not
support any stream fusion. It is unclear whether users of text
and bytestring
benefit from stream fusion in practice, and it would complicate the implementation.
We provide both sliced and unsliced variants of ByteString
and Text
:
- Sliced bytes:
Bytes
- Unsliced bytes:
ByteArray
- Sliced text:
Text
- Unsliced text:
SmallText
In certain situations, the metadata needed for slicing is an unnecessary
source of allocations. Users of packed
are expected to know what they need.
In short, packed
is a different design of the APIs of these libraries, and
some preliminary benchmarks on the parser show promising results.
Do not attempt to build this library with versions of GHC earlier than 8.6.
The constraint on base
in the cabal file should prevent this from happening.
There is nothing from base-4.12
that is actually needed here. The reason
for this constraint is that the UnboxedSums
extension, which was introduced
in GHC 8.2, produced corrupted code that crashed at runtime. One such problem
was corrected in GHC 8.4. Soon after, another was discovered. It was fixed
in GHC 8.6. The maintainers of this library are unaware of any other problems
with UnboxedSums
. However, keep in mind that this extension is not widely used,
and there is a possibility, however remote we hope it is, that a sufficiently
complex use of UnboxedSums
may unearth yet another problem.
The API of packed
is unstable, and will most likely remain so until the nearing
of GHC 8.8 or 9.0.
This repository currently contains a bunch of libraries which will be split
off into their own libraries at some point, but for now, because of the
instability of the API, it is easier to keep them all under one roof.