{-# LANGUAGE GHC2021#-}
module Data.Bitmask.Internal
( Bitmask(..)
, Bitmask8
, Bitmask16
, Bitmask32
, Bitmask64
, fromBits
, toBits
, checkBitmask
, noFlag
, allFlags
, fromFlags
, toFlags
, fromExceptFlags
, toExceptFlags
, fromFlagsBool
, toFlagsBool
, getFlag
, getFlags
, addFlag
, addFlags
, deleteFlag
, deleteFlags
, flipFlag
, flipFlags
, setFlag
, setFlags
, modifyFlag
, modifyFlags
) where
import Data.Word
import Data.Bits
newtype Bitmask w flag = Bitmask w
deriving (Bitmask w flag -> Bitmask w flag -> Bool
(Bitmask w flag -> Bitmask w flag -> Bool)
-> (Bitmask w flag -> Bitmask w flag -> Bool)
-> Eq (Bitmask w flag)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall w k (flag :: k).
Eq w =>
Bitmask w flag -> Bitmask w flag -> Bool
$c== :: forall w k (flag :: k).
Eq w =>
Bitmask w flag -> Bitmask w flag -> Bool
== :: Bitmask w flag -> Bitmask w flag -> Bool
$c/= :: forall w k (flag :: k).
Eq w =>
Bitmask w flag -> Bitmask w flag -> Bool
/= :: Bitmask w flag -> Bitmask w flag -> Bool
Eq, Eq (Bitmask w flag)
Eq (Bitmask w flag) =>
(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)
-> (Bitmask w flag -> Bitmask w flag -> Bitmask w flag)
-> (Bitmask w flag -> Bitmask w flag -> Bitmask w flag)
-> Ord (Bitmask w flag)
Bitmask w flag -> Bitmask w flag -> Bool
Bitmask w flag -> Bitmask w flag -> Ordering
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall w k (flag :: k). Ord w => Eq (Bitmask w flag)
forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Bool
forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Ordering
forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
$ccompare :: forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Ordering
compare :: Bitmask w flag -> Bitmask w flag -> Ordering
$c< :: forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Bool
< :: Bitmask w flag -> Bitmask w flag -> Bool
$c<= :: forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Bool
<= :: Bitmask w flag -> Bitmask w flag -> Bool
$c> :: forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Bool
> :: Bitmask w flag -> Bitmask w flag -> Bool
$c>= :: forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Bool
>= :: Bitmask w flag -> Bitmask w flag -> Bool
$cmax :: forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
max :: Bitmask w flag -> Bitmask w flag -> Bitmask w flag
$cmin :: forall w k (flag :: k).
Ord w =>
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
min :: Bitmask w flag -> Bitmask w flag -> Bitmask w flag
Ord, Int -> Bitmask w flag -> ShowS
[Bitmask w flag] -> ShowS
Bitmask w flag -> String
(Int -> Bitmask w flag -> ShowS)
-> (Bitmask w flag -> String)
-> ([Bitmask w flag] -> ShowS)
-> Show (Bitmask w flag)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall w k (flag :: k). Show w => Int -> Bitmask w flag -> ShowS
forall w k (flag :: k). Show w => [Bitmask w flag] -> ShowS
forall w k (flag :: k). Show w => Bitmask w flag -> String
$cshowsPrec :: forall w k (flag :: k). Show w => Int -> Bitmask w flag -> ShowS
showsPrec :: Int -> Bitmask w flag -> ShowS
$cshow :: forall w k (flag :: k). Show w => Bitmask w flag -> String
show :: Bitmask w flag -> String
$cshowList :: forall w k (flag :: k). Show w => [Bitmask w flag] -> ShowS
showList :: [Bitmask w flag] -> ShowS
Show, Eq (Bitmask w flag)
Bitmask w flag
Eq (Bitmask w flag) =>
(Bitmask w flag -> Bitmask w flag -> Bitmask w flag)
-> (Bitmask w flag -> Bitmask w flag -> Bitmask w flag)
-> (Bitmask w flag -> Bitmask w flag -> Bitmask w flag)
-> (Bitmask w flag -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> Bitmask w flag
-> (Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bool)
-> (Bitmask w flag -> Maybe Int)
-> (Bitmask w flag -> Int)
-> (Bitmask w flag -> Bool)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int -> Bitmask w flag)
-> (Bitmask w flag -> Int)
-> Bits (Bitmask w flag)
Int -> Bitmask w flag
Bitmask w flag -> Bool
Bitmask w flag -> Int
Bitmask w flag -> Maybe Int
Bitmask w flag -> Bitmask w flag
Bitmask w flag -> Int -> Bool
Bitmask w flag -> Int -> Bitmask w flag
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
forall a.
Eq a =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> a
-> (Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> Bool)
-> (a -> Maybe Int)
-> (a -> Int)
-> (a -> Bool)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int)
-> Bits a
forall w k (flag :: k). Bits w => Eq (Bitmask w flag)
forall w k (flag :: k). Bits w => Bitmask w flag
forall w k (flag :: k). Bits w => Int -> Bitmask w flag
forall w k (flag :: k). Bits w => Bitmask w flag -> Bool
forall w k (flag :: k). Bits w => Bitmask w flag -> Int
forall w k (flag :: k). Bits w => Bitmask w flag -> Maybe Int
forall w k (flag :: k). Bits w => Bitmask w flag -> Bitmask w flag
forall w k (flag :: k). Bits w => Bitmask w flag -> Int -> Bool
forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
$c.&. :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
.&. :: Bitmask w flag -> Bitmask w flag -> Bitmask w flag
$c.|. :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
.|. :: Bitmask w flag -> Bitmask w flag -> Bitmask w flag
$cxor :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Bitmask w flag -> Bitmask w flag
xor :: Bitmask w flag -> Bitmask w flag -> Bitmask w flag
$ccomplement :: forall w k (flag :: k). Bits w => Bitmask w flag -> Bitmask w flag
complement :: Bitmask w flag -> Bitmask w flag
$cshift :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
shift :: Bitmask w flag -> Int -> Bitmask w flag
$crotate :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
rotate :: Bitmask w flag -> Int -> Bitmask w flag
$czeroBits :: forall w k (flag :: k). Bits w => Bitmask w flag
zeroBits :: Bitmask w flag
$cbit :: forall w k (flag :: k). Bits w => Int -> Bitmask w flag
bit :: Int -> Bitmask w flag
$csetBit :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
setBit :: Bitmask w flag -> Int -> Bitmask w flag
$cclearBit :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
clearBit :: Bitmask w flag -> Int -> Bitmask w flag
$ccomplementBit :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
complementBit :: Bitmask w flag -> Int -> Bitmask w flag
$ctestBit :: forall w k (flag :: k). Bits w => Bitmask w flag -> Int -> Bool
testBit :: Bitmask w flag -> Int -> Bool
$cbitSizeMaybe :: forall w k (flag :: k). Bits w => Bitmask w flag -> Maybe Int
bitSizeMaybe :: Bitmask w flag -> Maybe Int
$cbitSize :: forall w k (flag :: k). Bits w => Bitmask w flag -> Int
bitSize :: Bitmask w flag -> Int
$cisSigned :: forall w k (flag :: k). Bits w => Bitmask w flag -> Bool
isSigned :: Bitmask w flag -> Bool
$cshiftL :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
shiftL :: Bitmask w flag -> Int -> Bitmask w flag
$cunsafeShiftL :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
unsafeShiftL :: Bitmask w flag -> Int -> Bitmask w flag
$cshiftR :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
shiftR :: Bitmask w flag -> Int -> Bitmask w flag
$cunsafeShiftR :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
unsafeShiftR :: Bitmask w flag -> Int -> Bitmask w flag
$crotateL :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
rotateL :: Bitmask w flag -> Int -> Bitmask w flag
$crotateR :: forall w k (flag :: k).
Bits w =>
Bitmask w flag -> Int -> Bitmask w flag
rotateR :: Bitmask w flag -> Int -> Bitmask w flag
$cpopCount :: forall w k (flag :: k). Bits w => Bitmask w flag -> Int
popCount :: Bitmask w flag -> Int
Bits)
type Bitmask8 = Bitmask Word8
type Bitmask16 = Bitmask Word16
type Bitmask32 = Bitmask Word32
type Bitmask64 = Bitmask Word64
fromBits :: w -> Bitmask w flag
fromBits :: forall {k} w (flag :: k). w -> Bitmask w flag
fromBits = w -> Bitmask w flag
forall {k} w (flag :: k). w -> Bitmask w flag
Bitmask
toBits :: Bitmask w flag -> w
toBits :: forall {k} w (flag :: k). Bitmask w flag -> w
toBits (Bitmask w
w) = w
w
checkBitmask :: forall flag w. (FiniteBits w, Enum flag, Bounded flag)
=> Bitmask w flag -> Bool
checkBitmask :: forall flag w.
(FiniteBits w, Enum flag, Bounded flag) =>
Bitmask w flag -> Bool
checkBitmask (Bitmask w
w) =
w -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize w
w Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= (flag -> Int
forall a. Enum a => a -> Int
fromEnum (flag
forall a. Bounded a => a
maxBound :: flag) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
noFlag :: Bits w => Bitmask w flag
noFlag :: forall {k} w (flag :: k). Bits w => Bitmask w flag
noFlag = w -> Bitmask w flag
forall {k} w (flag :: k). w -> Bitmask w flag
Bitmask w
forall a. Bits a => a
zeroBits
allFlags :: (FiniteBits w, Enum flag) => Bitmask w flag
allFlags :: forall w flag. (FiniteBits w, Enum flag) => Bitmask w flag
allFlags = w -> Bitmask w flag
forall {k} w (flag :: k). w -> Bitmask w flag
Bitmask w
forall a. FiniteBits a => a
oneBits
fromFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag
fromFlags :: forall w flag. (Bits w, Enum flag) => [flag] -> Bitmask w flag
fromFlags = (flag -> Bitmask w flag -> Bitmask w flag)
-> Bitmask w flag -> [flag] -> Bitmask w flag
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr flag -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
addFlag Bitmask w flag
forall {k} w (flag :: k). Bits w => Bitmask w flag
noFlag
toFlags :: forall flag w. (FiniteBits w, Enum flag, Bounded flag)
=> Bitmask w flag -> [flag]
toFlags :: forall flag w.
(FiniteBits w, Enum flag, Bounded flag) =>
Bitmask w flag -> [flag]
toFlags bm :: Bitmask w flag
bm@(Bitmask w
w) =
let n :: Int
n = w -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize w
w in
(flag -> Bool) -> [flag] -> [flag]
forall a. (a -> Bool) -> [a] -> [a]
filter (flag -> Bitmask w flag -> Bool
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bool
`getFlag` Bitmask w flag
bm)
[Int -> flag
forall a. Enum a => Int -> a
toEnum Int
i | Int
i <- [Int
0 .. Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (flag -> Int
forall a. Enum a => a -> Int
fromEnum (flag
forall a. Bounded a => a
maxBound :: flag))]]
fromExceptFlags :: (FiniteBits w, Enum flag) => [flag] -> Bitmask w flag
fromExceptFlags :: forall w flag.
(FiniteBits w, Enum flag) =>
[flag] -> Bitmask w flag
fromExceptFlags = (flag -> Bitmask w flag -> Bitmask w flag)
-> Bitmask w flag -> [flag] -> Bitmask w flag
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr flag -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
deleteFlag Bitmask w flag
forall w flag. (FiniteBits w, Enum flag) => Bitmask w flag
allFlags
toExceptFlags :: forall flag w. (FiniteBits w, Enum flag, Bounded flag)
=> Bitmask w flag -> [flag]
toExceptFlags :: forall flag w.
(FiniteBits w, Enum flag, Bounded flag) =>
Bitmask w flag -> [flag]
toExceptFlags bm :: Bitmask w flag
bm@(Bitmask w
w) =
let n :: Int
n = w -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize w
w in
(flag -> Bool) -> [flag] -> [flag]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (flag -> Bool) -> flag -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (flag -> Bitmask w flag -> Bool
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bool
`getFlag` Bitmask w flag
bm))
[Int -> flag
forall a. Enum a => Int -> a
toEnum Int
i | Int
i <- [Int
0 .. Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (flag -> Int
forall a. Enum a => a -> Int
fromEnum (flag
forall a. Bounded a => a
maxBound :: flag))]]
fromFlagsBool :: forall flag w. (Bits w, Enum flag)
=> [(flag, Bool)] -> Bitmask w flag
fromFlagsBool :: forall flag w.
(Bits w, Enum flag) =>
[(flag, Bool)] -> Bitmask w flag
fromFlagsBool = ((flag, Bool) -> Bitmask w flag -> Bitmask w flag)
-> Bitmask w flag -> [(flag, Bool)] -> Bitmask w flag
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((flag -> Bool -> Bitmask w flag -> Bitmask w flag)
-> (flag, Bool) -> Bitmask w flag -> Bitmask w flag
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry flag -> Bool -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bool -> Bitmask w flag -> Bitmask w flag
setFlag) Bitmask w flag
forall {k} w (flag :: k). Bits w => Bitmask w flag
noFlag
toFlagsBool :: forall flag w. (FiniteBits w, Enum flag, Bounded flag)
=> Bitmask w flag -> [(flag, Bool)]
toFlagsBool :: forall flag w.
(FiniteBits w, Enum flag, Bounded flag) =>
Bitmask w flag -> [(flag, Bool)]
toFlagsBool bm :: Bitmask w flag
bm@(Bitmask w
w) =
let n :: Int
n = w -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize w
w in
[(Int -> flag
forall a. Enum a => Int -> a
toEnum Int
i, flag -> Bitmask w flag -> Bool
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bool
getFlag (Int -> flag
forall a. Enum a => Int -> a
toEnum Int
i) Bitmask w flag
bm)
| Int
i <- [Int
0 .. Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (flag -> Int
forall a. Enum a => a -> Int
fromEnum (flag
forall a. Bounded a => a
maxBound :: flag))]]
getFlag :: (Bits w, Enum flag) => flag -> Bitmask w flag -> Bool
getFlag :: forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bool
getFlag flag
flag (Bitmask w
w) = w -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit w
w (flag -> Int
forall a. Enum a => a -> Int
fromEnum flag
flag)
getFlags :: (Bits w, Enum flag) => [flag] -> Bitmask w flag -> [Bool]
getFlags :: forall w flag.
(Bits w, Enum flag) =>
[flag] -> Bitmask w flag -> [Bool]
getFlags [flag]
fs Bitmask w flag
bm = (flag -> Bool) -> [flag] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map (flag -> Bitmask w flag -> Bool
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bool
`getFlag` Bitmask w flag
bm) [flag]
fs
addFlag :: (Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
addFlag :: forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
addFlag flag
f = flag -> Bool -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bool -> Bitmask w flag -> Bitmask w flag
setFlag flag
f Bool
True
addFlags :: (Bits w, Enum flag)
=> [flag] -> Bitmask w flag -> Bitmask w flag
addFlags :: forall w flag.
(Bits w, Enum flag) =>
[flag] -> Bitmask w flag -> Bitmask w flag
addFlags [flag]
fs Bitmask w flag
bm = (flag -> Bitmask w flag -> Bitmask w flag)
-> Bitmask w flag -> [flag] -> Bitmask w flag
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr flag -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
addFlag Bitmask w flag
bm [flag]
fs
deleteFlag :: (Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
deleteFlag :: forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
deleteFlag flag
f = flag -> Bool -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bool -> Bitmask w flag -> Bitmask w flag
setFlag flag
f Bool
False
deleteFlags :: (Bits w, Enum flag)
=> [flag] -> Bitmask w flag -> Bitmask w flag
deleteFlags :: forall w flag.
(Bits w, Enum flag) =>
[flag] -> Bitmask w flag -> Bitmask w flag
deleteFlags [flag]
fs Bitmask w flag
bm = (flag -> Bitmask w flag -> Bitmask w flag)
-> Bitmask w flag -> [flag] -> Bitmask w flag
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr flag -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
deleteFlag Bitmask w flag
bm [flag]
fs
setFlag :: (Bits w, Enum flag) =>
flag -> Bool -> Bitmask w flag -> Bitmask w flag
setFlag :: forall w flag.
(Bits w, Enum flag) =>
flag -> Bool -> Bitmask w flag -> Bitmask w flag
setFlag flag
flag Bool
value (Bitmask w
w) = w -> Bitmask w flag
forall {k} w (flag :: k). w -> Bitmask w flag
Bitmask (w -> Bitmask w flag) -> w -> Bitmask w flag
forall a b. (a -> b) -> a -> b
$
if Bool
value then
w -> Int -> w
forall a. Bits a => a -> Int -> a
setBit w
w (flag -> Int
forall a. Enum a => a -> Int
fromEnum flag
flag)
else
w -> Int -> w
forall a. Bits a => a -> Int -> a
clearBit w
w (flag -> Int
forall a. Enum a => a -> Int
fromEnum flag
flag)
setFlags :: (Bits w, Enum flag) =>
[(flag, Bool)] -> Bitmask w flag -> Bitmask w flag
setFlags :: forall w flag.
(Bits w, Enum flag) =>
[(flag, Bool)] -> Bitmask w flag -> Bitmask w flag
setFlags [(flag, Bool)]
fs Bitmask w flag
bm = ((flag, Bool) -> Bitmask w flag -> Bitmask w flag)
-> Bitmask w flag -> [(flag, Bool)] -> Bitmask w flag
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((flag -> Bool -> Bitmask w flag -> Bitmask w flag)
-> (flag, Bool) -> Bitmask w flag -> Bitmask w flag
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry flag -> Bool -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bool -> Bitmask w flag -> Bitmask w flag
setFlag) Bitmask w flag
bm [(flag, Bool)]
fs
flipFlag :: (Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
flipFlag :: forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
flipFlag flag
flag (Bitmask w
w) = w -> Bitmask w flag
forall {k} w (flag :: k). w -> Bitmask w flag
Bitmask (w -> Bitmask w flag) -> w -> Bitmask w flag
forall a b. (a -> b) -> a -> b
$ w -> Int -> w
forall a. Bits a => a -> Int -> a
complementBit w
w (flag -> Int
forall a. Enum a => a -> Int
fromEnum flag
flag)
flipFlags :: (Bits w, Enum flag) =>
[flag] -> Bitmask w flag -> Bitmask w flag
flipFlags :: forall w flag.
(Bits w, Enum flag) =>
[flag] -> Bitmask w flag -> Bitmask w flag
flipFlags [flag]
fs Bitmask w flag
bm = (flag -> Bitmask w flag -> Bitmask w flag)
-> Bitmask w flag -> [flag] -> Bitmask w flag
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr flag -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> Bitmask w flag -> Bitmask w flag
flipFlag Bitmask w flag
bm [flag]
fs
modifyFlag :: (Bits w, Enum flag) =>
flag -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag
modifyFlag :: forall w flag.
(Bits w, Enum flag) =>
flag -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag
modifyFlag flag
flag Bool -> Bool
f (Bitmask w
w) = w -> Bitmask w flag
forall {k} w (flag :: k). w -> Bitmask w flag
Bitmask (w -> Bitmask w flag) -> w -> Bitmask w flag
forall a b. (a -> b) -> a -> b
$
if Bool -> Bool
f (w -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
testBit w
w (flag -> Int
forall a. Enum a => a -> Int
fromEnum flag
flag)) then
w -> Int -> w
forall a. Bits a => a -> Int -> a
setBit w
w (flag -> Int
forall a. Enum a => a -> Int
fromEnum flag
flag)
else
w -> Int -> w
forall a. Bits a => a -> Int -> a
clearBit w
w (flag -> Int
forall a. Enum a => a -> Int
fromEnum flag
flag)
modifyFlags :: (Bits w, Enum flag) =>
[flag] -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag
modifyFlags :: forall w flag.
(Bits w, Enum flag) =>
[flag] -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag
modifyFlags [flag]
fs Bool -> Bool
f Bitmask w flag
bm = (flag -> Bitmask w flag -> Bitmask w flag)
-> Bitmask w flag -> [flag] -> Bitmask w flag
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (flag -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag
forall w flag.
(Bits w, Enum flag) =>
flag -> (Bool -> Bool) -> Bitmask w flag -> Bitmask w flag
`modifyFlag` Bool -> Bool
f) Bitmask w flag
bm [flag]
fs