{-# LANGUAGE ViewPatterns #-} -- | -- -- This module has transducers that work on 'Text' and other text-like types. module Control.Foldl.Transduce.Textual ( -- * Splitters textualSplit , textualBreak -- * Deprecated , textualSplitWhen ) where import Data.Monoid (mempty) import qualified Data.Monoid.Textual as MT import qualified Data.Monoid.Null as MN import Control.Foldl.Transduce {- $setup >>> import Control.Applicative >>> import qualified Control.Foldl as L >>> import Control.Foldl.Transduce -} {-| >>> L.fold (folds (textualSplit (=='.')) L.list L.list) [".","bb.bb","c.c."] [[""],["","bb"],["bb","c"],["c"],[""]] -} 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 {-| >>> L.fold (bisect (textualBreak (=='.')) (reify id) ignore L.list) ["aa","bb.bb","cc"] ["aa","bb"] -} 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 {-# DEPRECATED textualSplitWhen "use textualBreak instead" #-} textualSplitWhen :: MT.TextualMonoid m => (Char -> Bool) -> Transducer m m () textualSplitWhen = textualBreak