hmt-0.16: Music/Theory/Bits.hs
-- | Bits functions.
module Music.Theory.Bits where
import Data.Bits {- base -}
bit_pp :: Bool -> Char
bit_pp b = if b then '1' else '0'
bits_pp :: [Bool] -> String
bits_pp = map bit_pp
-- | Generate /n/ place bit sequence for /x/.
gen_bitseq :: FiniteBits b => Int -> b -> [Bool]
gen_bitseq n x =
if finiteBitSize x < n
then error "gen_bitseq"
else map (testBit x) (reverse [0 .. n - 1])
-- | Given bit sequence (most to least significant) generate 'Bits' value.
--
-- > :set -XBinaryLiterals
-- > pack_bitseq [True,False,True,False] == 0b1010
-- > pack_bitseq [True,False,False,True,False,False] == 0b100100
-- > 0b100100 == 36
pack_bitseq :: Bits i => [Bool] -> i
pack_bitseq =
last .
scanl (\n (k,b) -> if b then setBit n k else n) zeroBits .
zip [0..] .
reverse
-- | 'bits_pp' of 'gen_bitseq'.
--
-- > :set -XBinaryLiterals
-- > 0xF0 == 0b11110000
-- > gen_bitseq_pp 8 (0xF0::Int) == "11110000"
gen_bitseq_pp :: FiniteBits b => Int -> b -> String
gen_bitseq_pp n = bits_pp . gen_bitseq n