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 :: Int -> [a] -> [[a]]
chunkBy Int
n [a]
bs = case Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt 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 []

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