foldl-transduce-0.4.2.0: src/Control/Foldl/Transduce/Textual.hs
{-# LANGUAGE ViewPatterns #-}
-- |
--
-- This module has transducers that work on 'Text' and other text-like types.
module Control.Foldl.Transduce.Textual (
textualSplit
, 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 (textualSplitWhen (=='.')) (reify id) ignore L.list) ["aa","bb.bb","cc"]
["aa","bb"]
-}
textualSplitWhen :: MT.TextualMonoid m => (Char -> Bool) -> Transducer m m ()
textualSplitWhen 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