module HaskellWorks.Data.RankSelect.Internal.List
  ( chunkBy
  , toBools
  ) where

import Data.Word

import qualified HaskellWorks.Data.BalancedParens.Internal.Word as W

chunkBy :: Int -> [a] -> [[a]]
chunkBy :: Int -> [a] -> [[a]]
chunkBy Int
n [a]
bs = case (Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
n [a]
bs, Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop Int
n [a]
bs) of
  ([a]
as, [a]
zs) -> if [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
zs then [[a]
as] else [a]
as[a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
:Int -> [a] -> [[a]]
forall a. Int -> [a] -> [[a]]
chunkBy Int
n [a]
zs

toBoolsDiff :: [Word64] -> [Bool] -> [Bool]
toBoolsDiff :: [Word64] -> [Bool] -> [Bool]
toBoolsDiff = (Word64 -> ([Bool] -> [Bool]) -> [Bool] -> [Bool])
-> ([Bool] -> [Bool]) -> [Word64] -> [Bool] -> [Bool]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) (([Bool] -> [Bool]) -> ([Bool] -> [Bool]) -> [Bool] -> [Bool])
-> (Word64 -> [Bool] -> [Bool])
-> Word64
-> ([Bool] -> [Bool])
-> [Bool]
-> [Bool]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> [Bool] -> [Bool]
W.toBoolsDiff) [Bool] -> [Bool]
forall a. a -> a
id

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