Skip to content
A compact functional set data structure
Haskell C Shell
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
benchmarks
bin
cbits
src
tests
.gitignore
.travis.yml
CHANGES
LICENSE
README.md
Setup.hs
bitset.cabal
travis.sh

README.md

bitset Build Status

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:

import Data.BitSet (BitSet, (\\))
import qualified Data.BitSet as BitSet

data Color = Red | Green | Blue deriving (Show, Enum)

main :: IO ()
main = print $ bs \\ BitSet.singleton Blue where
  bs :: BitSet Color
  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 library, which uses Data.BitSet to store Xen domain status flags:

import qualified Data.BitSet.Word as BS

data DomainFlag = Dying
                | Crashed
                | Shutdown
                | Paused
                | Blocked
                | Running
                | HVM
                | Debugged
    deriving (Enum, Show)

isAlive :: DomainFlag -> Bool
isAlive = not . BS.null . BS.intersect (BS.fromList [Crashed, Shutdown])

Benchmarks

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
Something went wrong with that request. Please try again.