module HaskellWorks.Data.BalancedParens.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 forall a. Ord a => a -> a -> Bool
> Word64
0 = Word64 -> Word64 -> [Bool] -> [Bool]
partialToBoolsDiff (Word64
n forall a. Num a => a -> a -> a
- Word64
1) Word64
w forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Word64
w forall a. TestBit a => a -> Position -> Bool
.?. forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
n forall a. Num a => a -> a -> a
- Word64
1))forall a. a -> [a] -> [a]
:)
partialToBoolsDiff Word64
0 Word64
_ = forall a. a -> a
id
partialToBoolsDiff Word64
_ Word64
_ = 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x01 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x02 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x03 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x04 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x05 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x06 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x07 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x08 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x09 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0a forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0b forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0c forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0d forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0e forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x0f forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x10 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x11 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x12 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x13 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x14 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x15 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x16 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x17 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x18 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x19 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1a forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1b forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1c forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1d forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1e forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x1f forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x20 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x21 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x22 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x23 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x24 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x25 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x26 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x27 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x28 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x29 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2a forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2b forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2c forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2d forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2e forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x2f forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x30 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x31 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x32 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x33 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x34 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x35 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x36 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x37 forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Position -> [Bool] -> [Bool]
go Position
0x38 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x39 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3a forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3b forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3c forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3d forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position -> [Bool] -> [Bool]
go Position
0x3e 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 forall a. TestBit a => a -> Position -> Bool
.?. Position
p)forall a. a -> [a] -> [a]
:)