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

import Data.Word

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

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

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

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

toBalancedParensString :: [Bool] -> String
toBalancedParensString :: [Bool] -> String
toBalancedParensString (Bool
True:[Bool]
bs)  = Char
'('forall a. a -> [a] -> [a]
:[Bool] -> String
toBalancedParensString [Bool]
bs
toBalancedParensString (Bool
False:[Bool]
bs) = Char
')'forall a. a -> [a] -> [a]
:[Bool] -> String
toBalancedParensString [Bool]
bs
toBalancedParensString []         = String
""