module HaskellWorks.Data.RankSelect.Internal.Word
  ( toBools
  , toBoolsDiff
  , partialToBoolsDiff
  ) where

import Data.Word
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Positioning

toBools :: Word64 -> [Bool]
toBools :: Word64 -> [Bool]
toBools Word64
w = Word64 -> [Bool] -> [Bool]
toBoolsDiff Word64
w []

partialToBoolsDiff :: Count -> Word64 -> [Bool] -> [Bool]
partialToBoolsDiff :: Word64 -> Word64 -> [Bool] -> [Bool]
partialToBoolsDiff Word64
n Word64
w | Word64
n Word64 -> Word64 -> Bool
forall a. Ord a => a -> a -> Bool
> Word64
0 = Word64 -> Word64 -> [Bool] -> [Bool]
partialToBoolsDiff (Word64
n Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word64
1) Word64
w ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Word64
w Word64 -> Position -> Bool
forall a. TestBit a => a -> Position -> Bool
.?. Word64 -> Position
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
n Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word64
1))Bool -> [Bool] -> [Bool]
forall a. a -> [a] -> [a]
:)
partialToBoolsDiff Word64
0 Word64
_ = [Bool] -> [Bool]
forall a. a -> a
id
partialToBoolsDiff Word64
_ Word64
_ = [Char] -> [Bool] -> [Bool]
forall a. HasCallStack => [Char] -> a
error [Char]
"Invalid size"

toBoolsDiff :: Word64 -> [Bool] -> [Bool]
toBoolsDiff :: Word64 -> [Bool] -> [Bool]
toBoolsDiff Word64
w =
  Position -> [Bool] -> [Bool]
go Position
0x00 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x01 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x02 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x03 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x04 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x05 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x06 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x07 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x08 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x09 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0a ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0b ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0c ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0d ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0e ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0f ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x10 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x11 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x12 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x13 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x14 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x15 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x16 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x17 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x18 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x19 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1a ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1b ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1c ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1d ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1e ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1f ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x20 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x21 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x22 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x23 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x24 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x25 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x26 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x27 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x28 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x29 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2a ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2b ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2c ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2d ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2e ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2f ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x30 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x31 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x32 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x33 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x34 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x35 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x36 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x37 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x38 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x39 ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3a ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3b ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3c ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3d ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3e ([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3f
  where go :: Position -> [Bool] -> [Bool]
        go :: Position -> [Bool] -> [Bool]
go Position
p = ((Word64
w Word64 -> Position -> Bool
forall a. TestBit a => a -> Position -> Bool
.?. Position
p)Bool -> [Bool] -> [Bool]
forall a. a -> [a] -> [a]
:)