{-# OPTIONS_HADDOCK hide #-}
module Language.Hanspell.TextLines
( linesByLength
, linesByWordCount
) where
import Data.List
linesByLength :: Int -> String -> [String]
linesByLength maxChars =
map unlines . reverse . map reverse . merge .
foldl' mergeLine (maxChars,0,[],[]) . lines
where
mergeLine :: (Int,Int,[String],[[String]])
-> String
-> (Int,Int,[String],[[String]])
mergeLine (maxChars,headsLength,heads,merged) aLine =
if lineLength + headsLength > maxChars && not (null heads)
then (maxChars,lineLength,[aLine],heads:merged)
else (maxChars,lineLength + headsLength,aLine:heads,merged)
where lineLength = length aLine + 1
linesByWordCount :: Int -> String -> [String]
linesByWordCount maxWords =
map unlines . reverse . map reverse . merge .
foldl' mergeLine (maxWords,0,[],[]) . lines
where
mergeLine :: (Int,Int,[String],[[String]])
-> String
-> (Int,Int,[String],[[String]])
mergeLine (maxWords,headsWords,heads,merged) aLine =
if xWords + headsWords > maxWords && not (null heads)
then (maxWords,xWords,[aLine],heads:merged)
else (maxWords,xWords + headsWords,aLine:heads,merged)
where xWords = length (words aLine)
merge (_,_,heads,merged) = if null heads then merged else heads:merged