Copyright | (c) Alice Rixte 2025 |
---|---|
License | BSD 3 |
Maintainer | alice.rixte@u-bordeaux.fr |
Stability | stable |
Portability | portable Bitmasks for efficient storing of boolean flags |
Safe Haskell | None |
Language | GHC2021 |
Data.Bitmask
Description
Synopsis
- data Bitmask w (flag :: k)
- type Bitmask8 = Bitmask Word8 :: k -> Type
- type Bitmask16 = Bitmask Word16 :: k -> Type
- type Bitmask32 = Bitmask Word32 :: k -> Type
- type Bitmask64 = Bitmask Word64 :: k -> Type
- fromBits :: forall {k} w (flag :: k). w -> Bitmask w flag
- toBits :: forall {k} w (flag :: k). Bitmask w flag -> w
- checkBitmask :: forall flag w. (FiniteBits w, Enum flag, Bounded flag) => Bitmask w flag -> Bool
- noFlag :: forall {k} w (flag :: k). Bits w => Bitmask w flag
- allFlags :: (FiniteBits w, Enum flag) => Bitmask w flag
- fromFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag
- toFlags :: forall flag w. (FiniteBits w, Enum flag, Bounded flag) => Bitmask w flag -> [flag]
- fromExceptFlags :: (FiniteBits w, Enum flag) => [flag] -> Bitmask w flag
- toExceptFlags :: forall flag w. (FiniteBits w, Enum flag, Bounded flag) => Bitmask w flag -> [flag]
- fromFlagsBool :: forall flag w. (Bits w, Enum flag) => [(flag, Bool)] -> Bitmask w flag
- toFlagsBool :: forall flag w. (FiniteBits w, Enum flag, Bounded flag) => Bitmask w flag -> [(flag, Bool)]
- getFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bool
- getFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> [Bool]
- addFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag
- addFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag
- deleteFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag
- deleteFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag
- flipFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag
- flipFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag
- setFlag :: (Bits w, Enum flag) => flag -> Bool -> Bitmask w flag -> Bitmask w flag
- setFlags :: (Bits w, Enum flag) => [(flag, Bool)] -> Bitmask w flag -> Bitmask w flag
- modifyFlag :: (Bits w, Enum flag) => flag -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag
- modifyFlags :: (Bits w, Enum flag) => [flag] -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag
- (.&.) :: Bits a => a -> a -> a
- (.|.) :: Bits a => a -> a -> a
- xor :: Bits a => a -> a -> a
- complement :: Bits a => a -> a
Documentation
data Bitmask w (flag :: k) Source #
A bitmask that contains boolean flags
- The
flag
type should be an enumeration type (i.e. an instance ofEnum
). - The
w
type should be an integral type (e.g.Word8
,Word32
, etc.) that supports bitwise operations. - The number of bits in
w
must be at least as many as the number of constructors inflag
.
- Usage:
data PizzaTopping = Cheese | Mushrooms | Pineapple | Ham deriving (Show, Eq, Bounded, Enum) type PizzaMask = Bitmask8 PizzaTopping Word8
Instances
Bits w => Bits (Bitmask w flag) Source # | |
Defined in Data.Bitmask.Internal Methods (.&.) :: Bitmask w flag -> Bitmask w flag -> Bitmask w flag # (.|.) :: Bitmask w flag -> Bitmask w flag -> Bitmask w flag # xor :: Bitmask w flag -> Bitmask w flag -> Bitmask w flag # complement :: Bitmask w flag -> Bitmask w flag # shift :: Bitmask w flag -> Int -> Bitmask w flag rotate :: Bitmask w flag -> Int -> Bitmask w flag setBit :: Bitmask w flag -> Int -> Bitmask w flag clearBit :: Bitmask w flag -> Int -> Bitmask w flag complementBit :: Bitmask w flag -> Int -> Bitmask w flag testBit :: Bitmask w flag -> Int -> Bool bitSizeMaybe :: Bitmask w flag -> Maybe Int bitSize :: Bitmask w flag -> Int isSigned :: Bitmask w flag -> Bool shiftL :: Bitmask w flag -> Int -> Bitmask w flag unsafeShiftL :: Bitmask w flag -> Int -> Bitmask w flag shiftR :: Bitmask w flag -> Int -> Bitmask w flag unsafeShiftR :: Bitmask w flag -> Int -> Bitmask w flag rotateL :: Bitmask w flag -> Int -> Bitmask w flag | |
Show w => Show (Bitmask w flag) Source # | |
Eq w => Eq (Bitmask w flag) Source # | |
Ord w => Ord (Bitmask w flag) Source # | |
Defined in Data.Bitmask.Internal Methods compare :: Bitmask w flag -> Bitmask w flag -> Ordering (<) :: Bitmask w flag -> Bitmask w flag -> Bool (<=) :: Bitmask w flag -> Bitmask w flag -> Bool (>) :: Bitmask w flag -> Bitmask w flag -> Bool (>=) :: Bitmask w flag -> Bitmask w flag -> Bool |
Conversion to and from bits
Check bitmask validity
checkBitmask :: forall flag w. (FiniteBits w, Enum flag, Bounded flag) => Bitmask w flag -> Bool Source #
Check that a bitmask can represent all flags.
>>>
checkBitmask (allFlags :: Bitmask8 PizzaTopping)
True
Bitmask creation
noFlag :: forall {k} w (flag :: k). Bits w => Bitmask w flag Source #
A bitmask with all flags set to False
.
>>>
getFlag Mushrooms (noFlag :: PizzaMask)
False
allFlags :: (FiniteBits w, Enum flag) => Bitmask w flag Source #
A bitmask with all flags set to True
.
>>>
getFlag Mushrooms (allFlags :: PizzaMask)
True
fromFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag Source #
Create a bitmask from a list of flags to set to True
.
>>>
hawaiian = fromFlags [Pineapple, Ham, Cheese] :: PizzaMask
toFlags :: forall flag w. (FiniteBits w, Enum flag, Bounded flag) => Bitmask w flag -> [flag] Source #
Convert a bitmask to a list of flags that are set to True
.
>>>
toFlags hawaiian
[Cheese,Pineapple,Ham]
fromExceptFlags :: (FiniteBits w, Enum flag) => [flag] -> Bitmask w flag Source #
Create a bitmask from a list of flags to set to False
>>>
veggie = fromExceptFlags [Ham] :: PizzaMask
toExceptFlags :: forall flag w. (FiniteBits w, Enum flag, Bounded flag) => Bitmask w flag -> [flag] Source #
Convert a bitmask to a list of flags that are set to False
.
>>>
toExceptFlags veggie
[Ham]
fromFlagsBool :: forall flag w. (Bits w, Enum flag) => [(flag, Bool)] -> Bitmask w flag Source #
Convert an association list of flags and boolean values to a bitmask.
>>>
funghi = fromFlagsBool [(Cheese, True), (Ham, False), (Mushrooms, True)] :: PizzaMask
toFlagsBool :: forall flag w. (FiniteBits w, Enum flag, Bounded flag) => Bitmask w flag -> [(flag, Bool)] Source #
Convert a bitmask to an association list of flags and boolean values.
>>>
toFlagsBool funghi
[(Cheese,True),(Mushrooms,True),(Pineapple,False),(Ham,False)]
Flag querying
getFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bool Source #
Get a flag from a bitmask.
>>>
getFlag Mushrooms hawaiian
False
getFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> [Bool] Source #
Get multiple flags from a bitmask.
>>>
getFlags [Cheese, Mushrooms] hawaiian
[True,False]
Flag modification
addFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag Source #
Add a flag to a bitmask (set it to True
).
>>>
margherita = addFlag Cheese (noFlag :: PizzaMask)
addFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag Source #
Add multiple flags to a bitmask (set them to True
).
>>>
hawaiian = addFlags [Pineapple, Ham] margherita
deleteFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag Source #
Remove a flag from a bitmask (set it to False
).
>>>
veggie = deleteFlag Ham (allFlags :: PizzaMask)
deleteFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag Source #
Remove multiple flags from a bitmask (set them to False
).
>>>
picky = deleteFlags [Pineapple, Ham] (allFlags :: PizzaMask)
flipFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag Source #
Flip a flag in a bitmask.
>>>
margherita = flipFlag Cheese (noFlag :: PizzaMask)
flipFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag Source #
Flip multiple flags in a bitmask.
>>>
funghi = flipFlags [Mushrooms, Ham, Pineapple] hawaiian
setFlag :: (Bits w, Enum flag) => flag -> Bool -> Bitmask w flag -> Bitmask w flag Source #
Set a flag in a bitmask.
>>>
funghi = setFlag Mushrooms True margherita
setFlags :: (Bits w, Enum flag) => [(flag, Bool)] -> Bitmask w flag -> Bitmask w flag Source #
Set multiple flags in a bitmask.
>>>
hawaiian = setFlags [(Ham, True), (Pineapple, True)] margherita
modifyFlag :: (Bits w, Enum flag) => flag -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag Source #
Modify a flag in a bitmask.
>>>
veggie = modifyFlag Ham not (allFlags :: PizzaMask)
modifyFlags :: (Bits w, Enum flag) => [flag] -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag Source #
Modify multiple flags in a bitmask.
>>>
picky = modifyFlags [Pineapple, Ham] not (allFlags :: PizzaMask)
Re-exports from Data.Bits
complement :: Bits a => a -> a #