Haskell implementation of Flat, a principled, portable and compact binary data format (specs).
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
import Flat
data Direction = North | South | Center | East | West deriving (Show,Generic,Flat)
Use flat to encode:
flat [North,South]
-> "\149"
and unflat to decode:
unflat (flat [North,South]) :: Decoded [Direction]
-> Right [ North , South ]
And thanks to Flat's bit-encoding, this list fits in 1 byte (rather than the 5 bytes that would be required by a traditional byte encoding):
flatBits [North,South]
-> "10010101"
For some hard data, see this comparison of the major haskell serialisation libraries.
Briefly:
flat produces significantly smaller binaries than all other libraries (3/4 times usually)store, persist and flat are fasterstore, flat, persist and cereal are fasterflat is usually faster for all but the highest network speedsGet the latest stable version from hackage.
Tested with:
Data types with more than 512 constructors are currently unsupported (but support could be easily added if necessary)
Longish compilation times
To improve performance, flat relies on extensive inlining. This unfortunately leads to longer compilation times.
If you have many data types or very large ones, you might want to:
During development, turn optimisations off (stack --fast or -O0 in the cabal file).
Keep your serialisation code in separate modules.
See also the full list of open issues.
Rust and TypeScript-JavaScript ports are under development.
Get in touch if you would like to help porting flat to other languages.
flat reuses ideas and readapts code from various packages, mainly: store, binary-bits and binary and includes bug fixes from a number of contributors.
To decode flat encoded data you need to know the type of the serialised data.
This is ok for applications that do not require long-term storage and that do not operate in open distributed systems.
For those who do, you might want to supplement flat with ZM - Language independent, reproducible, absolute types.
Haskell
99.9%
Haskell implementation of Flat, a principled, portable and compact binary data format (specs).
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
import Flat
data Direction = North | South | Center | East | West deriving (Show,Generic,Flat)
Use flat to encode:
flat [North,South]
-> "\149"
and unflat to decode:
unflat (flat [North,South]) :: Decoded [Direction]
-> Right [ North , South ]
And thanks to Flat's bit-encoding, this list fits in 1 byte (rather than the 5 bytes that would be required by a traditional byte encoding):
flatBits [North,South]
-> "10010101"
For some hard data, see this comparison of the major haskell serialisation libraries.
Briefly:
flat produces significantly smaller binaries than all other libraries (3/4 times usually)store, persist and flat are fasterstore, flat, persist and cereal are fasterflat is usually faster for all but the highest network speedsGet the latest stable version from hackage.
Tested with:
Data types with more than 512 constructors are currently unsupported (but support could be easily added if necessary)
Longish compilation times
To improve performance, flat relies on extensive inlining. This unfortunately leads to longer compilation times.
If you have many data types or very large ones, you might want to:
During development, turn optimisations off (stack --fast or -O0 in the cabal file).
Keep your serialisation code in separate modules.
See also the full list of open issues.
Rust and TypeScript-JavaScript ports are under development.
Get in touch if you would like to help porting flat to other languages.
flat reuses ideas and readapts code from various packages, mainly: store, binary-bits and binary and includes bug fixes from a number of contributors.
To decode flat encoded data you need to know the type of the serialised data.
This is ok for applications that do not require long-term storage and that do not operate in open distributed systems.
For those who do, you might want to supplement flat with ZM - Language independent, reproducible, absolute types.
Haskell
99.9%