module Control.Foldl.Transduce.Textual (
textualSplit
, textualBreak
, textualSplitWhen
) where
import Data.Monoid (mempty)
import qualified Data.Monoid.Textual as MT
import qualified Data.Monoid.Null as MN
import Control.Foldl.Transduce
textualSplit :: MT.TextualMonoid m => (Char -> Bool) -> Transducer m m ()
textualSplit predicate = Transducer step () done
where
step _ txt = case MT.split predicate txt of
x:xs -> ((),[x],map (:[]) xs)
_ -> error "never happens"
done _ = mempty
data SplitWhenWhenState =
SplitWhenConditionEncountered
| SplitWhenConditionPending
textualBreak :: MT.TextualMonoid m => (Char -> Bool) -> Transducer m m ()
textualBreak predicate =
Transducer step SplitWhenConditionPending done
where
step SplitWhenConditionPending (MT.break (const False) predicate -> (i0,i1)) =
if MN.null i1
then (SplitWhenConditionPending,[i0],[])
else (SplitWhenConditionEncountered,[i0],[[i1]])
step SplitWhenConditionEncountered i =
(SplitWhenConditionEncountered,[i],[])
done = mempty
textualSplitWhen :: MT.TextualMonoid m => (Char -> Bool) -> Transducer m m ()
textualSplitWhen = textualBreak