module Data.Set.MutableBit (
Set,
newSized,
member,
insert,
remove,
)
where
import Control.Monad.ST
import Data.Array.ST
import Data.Bits
import Data.Word
import Prelude hiding (map, mapM)
import qualified Prelude as P
type Bucket = Word64
type Set s = STUArray s Int Bucket
bucketBitCount :: Int
bucketBitCount = bitSize (undefined :: Bucket)
newSized :: Int -> ST s (Set s)
newSized maxVal = newArray (0, bucketCount1) 0
where bucketCount = 1+(maxVal `div` bucketBitCount)
member :: Set s -> Int -> ST s Bool
member set entry = do
let (bucketIx, ixInBucket) = entry `divMod` bucketBitCount
bucket <- readArray set bucketIx
return $! testBit bucket ixInBucket
insert :: Set s -> Int -> ST s ()
insert set entry = do
let (bucketIx, ixInBucket) = entry `divMod` bucketBitCount
bucket <- readArray set bucketIx
writeArray set bucketIx $! setBit bucket ixInBucket
remove :: Set s -> Int -> ST s ()
remove set entry = do
let (bucketIx, ixInBucket) = entry `divMod` bucketBitCount
bucket <- readArray set bucketIx
writeArray set bucketIx $! clearBit bucket ixInBucket