A bit set is a compact data structure, which maintains a set of members
from a type that can be enumerated (i. e. has an Enum instance). Current
implementation is abstract with respect to conatiner type, so any
numeric type with Bits instance can be used as a container.
Here's a usage example for a dynamic bit set, which uses a tweaked version
of Integer for storing bits:
importData.BitSet (BitSet, (\\))
importqualifiedData.BitSetasBitSetdataColor=Red | Green | Bluederiving (Show, Enum)
main::IO()
main =print$ bs \\BitSet.singleton Bluewherebs::BitSetColor
bs =BitSet.fromList [Red, Green, Blue]The API is exactly the same for a static bitset, based on native Word.
Here's an example from [hen] hen library, which uses Data.BitSet to
store Xen domain status flags:
importqualifiedData.BitSet.WordasBSdataDomainFlag=Dying
| Crashed
| Shutdown
| Paused
| Blocked
| Running
| HVM
| Debuggedderiving (Enum, Show)
isAlive::DomainFlag->Bool
isAlive =not.BS.null.BS.intersect (BS.fromList [Crashed, Shutdown])To run benchmarks, configure cabal with benchmarks
and build:
$ cabal-dev install-deps --enable-benchmarks && cabal-dev build
$ ./dist/build/bitset-benchmarks/bitset-benchmarks -o dist/bench.html