{-# OPTIONS_GHC -Wall -fno-warn-tabs #-} module Data.Bits.ToolsYj ( bitsToBits, checkBits, bitsList, popBit ) where import Control.Arrow import Data.Bits checkBits :: Bits bs => bs -> bs -> Bool checkBits :: forall bs. Bits bs => bs -> bs -> Bool checkBits bs wnt = (bs -> bs -> Bool forall a. Eq a => a -> a -> Bool == bs wnt) (bs -> Bool) -> (bs -> bs) -> bs -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c . (bs -> bs -> bs forall a. Bits a => a -> a -> a .&. bs wnt) bitsList :: FiniteBits bs => bs -> [bs] bitsList :: forall bs. FiniteBits bs => bs -> [bs] bitsList bs bs = (bs -> Bool) -> [bs] -> [bs] forall a. (a -> Bool) -> [a] -> [a] filter (bs -> bs -> Bool forall a. Eq a => a -> a -> Bool /= bs forall a. Bits a => a zeroBits) ([bs] -> [bs]) -> [bs] -> [bs] forall a b. (a -> b) -> a -> b $ (Int -> bs) -> [Int] -> [bs] forall a b. (a -> b) -> [a] -> [b] map ((bs bs bs -> bs -> bs forall a. Bits a => a -> a -> a .&.) (bs -> bs) -> (Int -> bs) -> Int -> bs forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> bs forall a. Bits a => Int -> a bit) [Int 0 .. bs -> Int forall b. FiniteBits b => b -> Int finiteBitSize bs bs Int -> Int -> Int forall a. Num a => a -> a -> a - Int 1] bitsToBits :: (Bits a, Bits b) => Int -> a -> b bitsToBits :: forall a b. (Bits a, Bits b) => Int -> a -> b bitsToBits Int n a b = (b -> Int -> b) -> b -> [Int] -> b forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl b -> Int -> b forall a. Bits a => a -> Int -> a setBit b forall a. Bits a => a zeroBits ([Int] -> b) -> ([(Int, Bool)] -> [Int]) -> [(Int, Bool)] -> b forall b c a. (b -> c) -> (a -> b) -> a -> c . ((Int, Bool) -> Int) -> [(Int, Bool)] -> [Int] forall a b. (a -> b) -> [a] -> [b] map (Int, Bool) -> Int forall a b. (a, b) -> a fst ([(Int, Bool)] -> [Int]) -> ([(Int, Bool)] -> [(Int, Bool)]) -> [(Int, Bool)] -> [Int] forall b c a. (b -> c) -> (a -> b) -> a -> c . ((Int, Bool) -> Bool) -> [(Int, Bool)] -> [(Int, Bool)] forall a. (a -> Bool) -> [a] -> [a] filter (Int, Bool) -> Bool forall a b. (a, b) -> b snd ([(Int, Bool)] -> b) -> [(Int, Bool)] -> b forall a b. (a -> b) -> a -> b $ (Int -> (Int, Bool)) -> [Int] -> [(Int, Bool)] forall a b. (a -> b) -> [a] -> [b] map (Int -> Int forall a. a -> a id (Int -> Int) -> (Int -> Bool) -> Int -> (Int, Bool) forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c') forall (a :: * -> * -> *) b c c'. Arrow a => a b c -> a b c' -> a b (c, c') &&& a -> Int -> Bool forall a. Bits a => a -> Int -> Bool testBit a b) [Int 0 .. Int n Int -> Int -> Int forall a. Num a => a -> a -> a - Int 1] popBit :: Bits b => b -> (Bool, b) popBit :: forall b. Bits b => b -> (Bool, b) popBit b n = (b n b -> Int -> Bool forall a. Bits a => a -> Int -> Bool `testBit` Int 0, b n b -> Int -> b forall a. Bits a => a -> Int -> a `shiftR` Int 1)