Compatibility with ghc-7.6
[hsv4l2:v4l2.git] / Foreign / Extra / BitSet.hs
1 module Foreign.Extra.BitSet
2   ( fromBitSet
3   , toBitSet
4   ) where
5
6 import Data.Bits (Bits, (.&.), (.|.), complement)
7 import Data.Set (Set, empty, insert, toList)
8
9 fromBitSet :: (Ord h, Bits c, Num c) => [(h, c)] -> (c -> h) -> c -> Set h
10 fromBitSet spec unknown bits
11   | unmatched == 0 = matched
12   | otherwise = insert (unknown unmatched) matched
13   where
14     (matched, unmatched) = foldr test (empty, bits) spec
15     test (h, v) (m, um)
16       | v == v .&. um = (insert h m, um .&. complement v)
17       | otherwise     = (m, um)
18
19 toBitSet ::(Eq h, Bits c, Num c) => [(h, c)] -> (h -> Bool) -> (h -> c) -> Set h -> c
20 toBitSet spec isUnknown unUnknown = foldr (.|.) 0 . map f . toList
21   where
22     f h
23       | isUnknown h = unUnknown h
24       | otherwise = case h `lookup` spec of
25           Just c -> c
26           Nothing -> error "toBitSet"