module Language.Haskell.Formatter.Toolkit.ListTool
(maybeLast, mergeConsecutiveElements, takeEvery, concatenateRuns,
concatenateShiftedRuns)
where
import qualified Data.List as List
import qualified Data.Maybe as Maybe
import qualified Data.Monoid as Monoid
import qualified Data.Word as Word
maybeLast :: [a] -> Maybe a
maybeLast = Maybe.listToMaybe . reverse
mergeConsecutiveElements :: (a -> Bool) -> [a] -> [a]
mergeConsecutiveElements isMerged = snd . List.foldl' merge (False, [])
where merge (isConsecutive, list) element = (isConsecutive', list')
where isConsecutive' = isMerged element
list' = Monoid.mappend list merged
merged
= if isConsecutive' && isConsecutive then [] else [element]
takeEvery :: Word.Word -> [a] -> [a]
takeEvery _ [] = []
takeEvery period list@(first : _)
= first : takeEvery period (drop (fromIntegral period) list)
concatenateRuns :: Word.Word -> [[a]] -> [[a]]
concatenateRuns _ [] = []
concatenateRuns period lists = concat run : concatenateRuns period rest
where (run, rest) = splitAt (fromIntegral period) lists
concatenateShiftedRuns :: Word.Word -> Word.Word -> [[a]] -> [[a]]
concatenateShiftedRuns period shift lists
= case shift of
0 -> concatenateUnshifted lists
_ -> concat shifted : concatenateUnshifted unshifted
where (shifted, unshifted) = splitAt (fromIntegral shift) lists
where concatenateUnshifted = concatenateRuns period