bitmasks 0 → 0.0.1
raw patch · 7 files changed
+48/−19 lines, 7 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Data.Bitmask: addFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag
- Data.Bitmask: addFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag
- Data.Bitmask.Internal: instance forall w k (flag :: k). GHC.Bits.Bits w => GHC.Bits.Bits (Data.Bitmask.Internal.Bitmask w flag)
- Data.Bitmask.Internal: instance forall w k (flag :: k). GHC.Show.Show w => GHC.Show.Show (Data.Bitmask.Internal.Bitmask w flag)
+ Data.Bitmask: infixl 5 .|.
+ Data.Bitmask: infixl 6 `xor`
+ Data.Bitmask: infixl 7 .&.
+ Data.Bitmask: insertFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag
+ Data.Bitmask: insertFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag
+ Data.Bitmask.Internal: insertFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bitmask w flag
+ Data.Bitmask.Internal: insertFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag
+ Data.Bitmask.Internal: instance forall w k (flag :: k). GHC.Internal.Bits.Bits w => GHC.Internal.Bits.Bits (Data.Bitmask.Internal.Bitmask w flag)
+ Data.Bitmask.Internal: instance forall w k (flag :: k). GHC.Internal.Show.Show w => GHC.Internal.Show.Show (Data.Bitmask.Internal.Bitmask w flag)
Files
- CHANGELOG.md +4/−0
- README.md +9/−2
- bitmasks.cabal +4/−4
- src/Data/Bitmask.hs +2/−4
- src/Data/Bitmask/Internal.hs +24/−4
- test/Data/BitmaskSpec.hs +4/−4
- test/Data/Pizza.hs +1/−1
CHANGELOG.md view
@@ -10,3 +10,7 @@ ## 0 - 2025-09-17 * Bitmask data types with API and tests. + +## 0.0.1 - 2026-03-09 + +* Rename addFlag -> insertFlag.
README.md view
@@ -1,7 +1,14 @@ # Bitmasks -Bitmasks for boolean flags. +[](https://haskell.org) [](https://github.com/AliceRixte/bitmasks/LICENSE) [](https://hackage.haskell.org/package/bitmasks) [](https://www.stackage.org/nightly/package/bitmasks) [](https://www.stackage.org/lts/package/bitmasks) + +Bitmasks for efficient storing of boolean flags. + +## Alternatives + +You might prefer the [bitset](https://hackage.haskell.org/package/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: @@ -59,7 +66,7 @@ >>> getFlag Ham veggieHawaiian ``` -Toggle (I have no idea what I'm talking about) the toppings : +Toggle the toppinsertFlages, topping toggling should be a thing): ```haskell >>> funghi = flipFlags [Pineapple, Mushroom] veggieHawaiian
bitmasks.cabal view
@@ -1,11 +1,11 @@ cabal-version: 2.2 --- This file has been generated from package.yaml by hpack version 0.37.0.+-- This file has been generated from package.yaml by hpack version 0.39.1. -- -- see: https://github.com/sol/hpack name: bitmasks-version: 0+version: 0.0.1 synopsis: Bitmasks for efficient storing of boolean flags description: Please see the README on GitHub at <https://github.com/AliceRixte/bitmasks#readme> category: data@@ -39,7 +39,7 @@ ghc-options: -Wall -threaded build-depends: base >=4.18 && <5- default-language: Haskell2010+ default-language: GHC2024 test-suite bitmasks-test type: exitcode-stdio-1.0@@ -58,4 +58,4 @@ , base >=4.18 && <5 , bitmasks , hspec >=2.11- default-language: Haskell2010+ default-language: GHC2024
src/Data/Bitmask.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE GHC2021#-} - -------------------------------------------------------------------------------- -- | -- @@ -39,8 +37,8 @@ , getFlag , getFlags -- ** Flag modification - , addFlag - , addFlags + , insertFlag + , insertFlags , deleteFlag , deleteFlags , flipFlag
src/Data/Bitmask/Internal.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE GHC2021#-} - -------------------------------------------------------------------------------- -- | -- @@ -52,6 +50,8 @@ , getFlag , getFlags -- ** Flag modification + , insertFlag + , insertFlags , addFlag , addFlags , deleteFlag @@ -88,7 +88,7 @@ -- | Ham -- deriving (Show, Eq, Bounded, Enum) -- --- type PizzaMask = Bitmask8 PizzaTopping Word8 +-- type PizzaMask = Bitmask Word8 PizzaTopping -- @ -- newtype Bitmask w flag = Bitmask w @@ -142,7 +142,7 @@ -- >>> hawaiian = fromFlags [Pineapple, Ham, Cheese] :: PizzaMask -- fromFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -fromFlags = foldr addFlag noFlag +fromFlags = foldr insertFlag noFlag -- | Convert a bitmask to a list of flags that are set to 'True'. -- @@ -219,6 +219,8 @@ flag -> Bitmask w flag -> Bitmask w flag addFlag f = setFlag f True +{-# DEPRECATED addFlag "Use insertFlag instead." #-} + -- | Add multiple flags to a bitmask (set them to 'True'). -- -- >>> hawaiian = addFlags [Pineapple, Ham] margherita @@ -226,6 +228,24 @@ addFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> Bitmask w flag addFlags fs bm = foldr addFlag bm fs + +{-# DEPRECATED addFlags "Use insertFlags instead." #-} + +-- | Add a flag to a bitmask (set it to 'True'). +-- +-- >>> margherita = insertFlag Cheese (noFlag :: PizzaMask) +-- +insertFlag :: (Bits w, Enum flag) => + flag -> Bitmask w flag -> Bitmask w flag +insertFlag f = setFlag f True + +-- | Add multiple flags to a bitmask (set them to 'True'). +-- +-- >>> hawaiian = insertFlags [Pineapple, Ham] margherita +-- +insertFlags :: (Bits w, Enum flag) + => [flag] -> Bitmask w flag -> Bitmask w flag +insertFlags fs bm = foldr insertFlag bm fs -- | Remove a flag from a bitmask (set it to 'False'). --
test/Data/BitmaskSpec.hs view
@@ -49,11 +49,11 @@ getAdd :: Property getAdd = property $ \(flag :: PizzaTopping) (bm :: PizzaMask) -> - getFlag flag (addFlag flag bm) == True + getFlag flag (insertFlag flag bm) == True getAdds :: Property getAdds = property $ \(flags :: [PizzaTopping]) (bm :: PizzaMask) -> - all id $ getFlags flags (addFlags flags bm) + all id $ getFlags flags (insertFlags flags bm) getDelete :: Property getDelete = property $ \(flag :: PizzaTopping) (bm :: PizzaMask) -> @@ -78,8 +78,8 @@ it "fromToExcept" $ property fromToExcept it "getFlag flag allFlags == True" $ property getAll it "getFlag flag noFlag == False" $ property getNone - it "getFlag flag (addFlag flag bm) == True" $ property getAdd - it "all id (getFlags flags (addFlags flags bm))" $ property getAdds + it "getFlag flag (insertFlag flag bm) == True" $ property getAdd + it "all id (getFlags flags (insertFlags flags bm))" $ property getAdds it "getFlag flag (deleteFlag flag bm) == False" $ property getDelete it "all not (getFlags flags (deleteFlags flags bm))" $ property getDeletes it "modifyFlags not flags bm == flipFlags flags bm" $ property flipModifs
test/Data/Pizza.hs view
@@ -28,4 +28,4 @@ veggie = fromExceptFlags [Ham] hawaiian :: PizzaMask -hawaiian = addFlags [Pineapple, Ham] margherita +hawaiian = insertFlags [Pineapple, Ham] margherita