{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Data.Bits.ToolsYj (bitsToBits, checkBits, bitsList) 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]