Description
Bitmasks for efficient storing of boolean flags.
Description
Please see the README on GitHub at https://github.com/AliceRixte/bitmasks#readme
README.md
Bitmasks
Bitmasks for efficient storing of boolean flags.
Alternatives
You might prefer the bitset package, that uses a similar implementation to this library. The main difference between bitset and bitmasks is that, contrarily to bitset, bitmasks is intended to be imported non qualified.
Usage
Define your flags as an enumeration:
import Data.Word
import Data.Bitmask
data PizzaTopping =
Cheese
| Mushrooms
| Pineapple
| Ham
deriving (Show, Eq, Bounded, Enum)
-- We only need 8 bits since there are only 4 toppings
type PizzaMask = Bitmask8 PizzaTopping
Creating bitmasks
-- A Margherita pizza (cheese only)
margherita :: PizzaMask
margherita = fromFlags [Cheese]
veggie :: PizzaMask
veggie = fromExceptFlags [Ham]
Access and modify flags
Use getFlag to check if a pizza has a specific topping:
>>> getFlag Cheese funghi
True
>>> getFlag Pineapple funghi
False
Add toppings to a pizza:
>>> hawaiian = addFlags [Pineapple, Ham] margherita
>>> getFlags [Pineapple, Mushroom] hawaiian
True
Make any pizza vegetarian (bitwise AND):
>>> veggieHawaiian = veggie .&. hawaiian
>>> getFlag Ham veggieHawaiian
Toggle the toppinsertFlages, topping toggling should be a thing):
>>> funghi = flipFlags [Pineapple, Mushroom] veggieHawaiian
>>> toFlags funghi
[Cheese,Mushrooms]
Remove a topping:
>>> margherita == deleteFlag Mushroom funghi
True
Convert to lists
-- Get all toppings as a list
>>> toFlags funghi
[Cheese,Mushrooms]
>>> toFlags hawaiian
[Cheese,Pineapple,Ham]
-- Convert to association lists
>>> toFlagsBool funghi
[(Cheese,True),(Mushrooms,True),(Pineapple,False),(Ham,False)]