module Control.Foldl.Text (
fold
, foldM
, head
, last
, null
, length
, any
, all
, maximum
, minimum
, elem
, notElem
, find
, index
, elemIndex
, findIndex
, count
, lazy
, module Control.Foldl
, module Data.Text
) where
import Control.Foldl (Fold, FoldM)
import Control.Foldl.Internal (Maybe'(..), strict, Either'(..), hush)
import Data.Text (Text)
import Prelude hiding (
head, last, null, length, any, all, maximum, minimum, elem, notElem )
import qualified Control.Foldl
import qualified Control.Foldl.Internal
import qualified Data.Text
import qualified Data.Text.Lazy
fold :: Fold Text a -> Data.Text.Lazy.Text -> a
fold :: forall a. Fold Text a -> Text -> a
fold (Control.Foldl.Fold x -> Text -> x
step x
begin x -> a
done) Text
as =
x -> a
done (forall a. (a -> Text -> a) -> a -> Text -> a
Data.Text.Lazy.foldlChunks x -> Text -> x
step x
begin Text
as)
{-# INLINABLE fold #-}
foldM :: Monad m => FoldM m Text a -> Data.Text.Lazy.Text -> m a
foldM :: forall (m :: * -> *) a. Monad m => FoldM m Text a -> Text -> m a
foldM (Control.Foldl.FoldM x -> Text -> m x
step m x
begin x -> m a
done) Text
as = do
x
x <- forall a. (a -> Text -> a) -> a -> Text -> a
Data.Text.Lazy.foldlChunks m x -> Text -> m x
step' m x
begin Text
as
x -> m a
done x
x
where
step' :: m x -> Text -> m x
step' m x
mx Text
bs = do
x
x <- m x
mx
x
x seq :: forall a b. a -> b -> b
`seq` x -> Text -> m x
step x
x Text
bs
{-# INLINABLE foldM #-}
head :: Fold Text (Maybe Char)
head :: Fold Text (Maybe Char)
head = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold Maybe' Char -> Text -> Maybe' Char
step forall a. Maybe' a
Nothing' forall a. Maybe' a -> Maybe a
Control.Foldl.Internal.lazy
where
step :: Maybe' Char -> Text -> Maybe' Char
step Maybe' Char
mc Text
txt =
if Text -> Bool
Data.Text.null Text
txt
then Maybe' Char
mc
else case Maybe' Char
mc of
Just' Char
_ -> Maybe' Char
mc
Maybe' Char
Nothing' -> forall a. a -> Maybe' a
Just' (Text -> Char
Data.Text.head Text
txt)
{-# INLINABLE head #-}
last :: Fold Text (Maybe Char)
last :: Fold Text (Maybe Char)
last = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold Maybe' Char -> Text -> Maybe' Char
step forall a. Maybe' a
Nothing' forall a. Maybe' a -> Maybe a
Control.Foldl.Internal.lazy
where
step :: Maybe' Char -> Text -> Maybe' Char
step Maybe' Char
mc Text
txt =
if Text -> Bool
Data.Text.null Text
txt
then Maybe' Char
mc
else forall a. a -> Maybe' a
Just' (Text -> Char
Data.Text.last Text
txt)
{-# INLINABLE last #-}
null :: Fold Text Bool
null :: Fold Text Bool
null = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold Bool -> Text -> Bool
step Bool
True forall a. a -> a
id
where
step :: Bool -> Text -> Bool
step Bool
isNull Text
txt = Bool
isNull Bool -> Bool -> Bool
&& Text -> Bool
Data.Text.null Text
txt
{-# INLINABLE null #-}
length :: Num n => Fold Text n
length :: forall n. Num n => Fold Text n
length =
forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold (\n
n Text
txt -> n
n forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral (Text -> Int
Data.Text.length Text
txt)) n
0 forall a. a -> a
id
{-# INLINABLE length #-}
all :: (Char -> Bool) -> Fold Text Bool
all :: (Char -> Bool) -> Fold Text Bool
all Char -> Bool
predicate =
forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold (\Bool
b Text
txt -> Bool
b Bool -> Bool -> Bool
&& (Char -> Bool) -> Text -> Bool
Data.Text.all Char -> Bool
predicate Text
txt) Bool
True forall a. a -> a
id
{-# INLINABLE all #-}
any :: (Char -> Bool) -> Fold Text Bool
any :: (Char -> Bool) -> Fold Text Bool
any Char -> Bool
predicate =
forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold (\Bool
b Text
txt -> Bool
b Bool -> Bool -> Bool
|| (Char -> Bool) -> Text -> Bool
Data.Text.any Char -> Bool
predicate Text
txt) Bool
False forall a. a -> a
id
{-# INLINABLE any #-}
maximum :: Fold Text (Maybe Char)
maximum :: Fold Text (Maybe Char)
maximum = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold Maybe' Char -> Text -> Maybe' Char
step forall a. Maybe' a
Nothing' forall a. Maybe' a -> Maybe a
Control.Foldl.Internal.lazy
where
step :: Maybe' Char -> Text -> Maybe' Char
step Maybe' Char
mc Text
txt =
if Text -> Bool
Data.Text.null Text
txt
then Maybe' Char
mc
else forall a. a -> Maybe' a
Just' (case Maybe' Char
mc of
Maybe' Char
Nothing' -> Text -> Char
Data.Text.maximum Text
txt
Just' Char
c -> forall a. Ord a => a -> a -> a
max Char
c (Text -> Char
Data.Text.maximum Text
txt) )
{-# INLINABLE maximum #-}
minimum :: Fold Text (Maybe Char)
minimum :: Fold Text (Maybe Char)
minimum = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold Maybe' Char -> Text -> Maybe' Char
step forall a. Maybe' a
Nothing' forall a. Maybe' a -> Maybe a
Control.Foldl.Internal.lazy
where
step :: Maybe' Char -> Text -> Maybe' Char
step Maybe' Char
mc Text
txt =
if Text -> Bool
Data.Text.null Text
txt
then Maybe' Char
mc
else forall a. a -> Maybe' a
Just' (case Maybe' Char
mc of
Maybe' Char
Nothing' -> Text -> Char
Data.Text.minimum Text
txt
Just' Char
c -> forall a. Ord a => a -> a -> a
min Char
c (Text -> Char
Data.Text.minimum Text
txt) )
{-# INLINABLE minimum #-}
elem :: Char -> Fold Text Bool
elem :: Char -> Fold Text Bool
elem Char
c = (Char -> Bool) -> Fold Text Bool
any (Char
c forall a. Eq a => a -> a -> Bool
==)
{-# INLINABLE elem #-}
notElem :: Char -> Fold Text Bool
notElem :: Char -> Fold Text Bool
notElem Char
c = (Char -> Bool) -> Fold Text Bool
all (Char
c forall a. Eq a => a -> a -> Bool
/=)
{-# INLINABLE notElem #-}
find :: (Char -> Bool) -> Fold Text (Maybe Char)
find :: (Char -> Bool) -> Fold Text (Maybe Char)
find Char -> Bool
predicate = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold Maybe' Char -> Text -> Maybe' Char
step forall a. Maybe' a
Nothing' forall a. Maybe' a -> Maybe a
Control.Foldl.Internal.lazy
where
step :: Maybe' Char -> Text -> Maybe' Char
step Maybe' Char
mc Text
txt = case Maybe' Char
mc of
Maybe' Char
Nothing' -> forall a. Maybe a -> Maybe' a
strict ((Char -> Bool) -> Text -> Maybe Char
Data.Text.find Char -> Bool
predicate Text
txt)
Just' Char
_ -> Maybe' Char
mc
{-# INLINABLE find #-}
index :: Integral n => n -> Fold Text (Maybe Char)
index :: forall n. Integral n => n -> Fold Text (Maybe Char)
index n
i = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold Either' Int Char -> Text -> Either' Int Char
step (forall a b. a -> Either' a b
Left' (forall a b. (Integral a, Num b) => a -> b
fromIntegral n
i)) forall a b. Either' a b -> Maybe b
hush
where
step :: Either' Int Char -> Text -> Either' Int Char
step Either' Int Char
x Text
txt = case Either' Int Char
x of
Left' Int
remainder ->
let len :: Int
len = Text -> Int
Data.Text.length Text
txt
in if Int
remainder forall a. Ord a => a -> a -> Bool
< Int
len
then forall a b. b -> Either' a b
Right' (Text -> Int -> Char
Data.Text.index Text
txt Int
remainder)
else forall a b. a -> Either' a b
Left' (Int
remainder forall a. Num a => a -> a -> a
- Int
len)
Either' Int Char
_ -> Either' Int Char
x
{-# INLINABLE index #-}
elemIndex :: Num n => Char -> Fold Text (Maybe n)
elemIndex :: forall n. Num n => Char -> Fold Text (Maybe n)
elemIndex Char
c = forall n. Num n => (Char -> Bool) -> Fold Text (Maybe n)
findIndex (Char
c forall a. Eq a => a -> a -> Bool
==)
{-# INLINABLE elemIndex #-}
findIndex :: Num n => (Char -> Bool) -> Fold Text (Maybe n)
findIndex :: forall n. Num n => (Char -> Bool) -> Fold Text (Maybe n)
findIndex Char -> Bool
predicate = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold forall {b}. Num b => Either' b b -> Text -> Either' b b
step (forall a b. a -> Either' a b
Left' n
0) forall a b. Either' a b -> Maybe b
hush
where
step :: Either' b b -> Text -> Either' b b
step Either' b b
x Text
txt = case Either' b b
x of
Left' b
m -> case (Char -> Bool) -> Text -> Maybe Int
Data.Text.findIndex Char -> Bool
predicate Text
txt of
Maybe Int
Nothing -> forall a b. a -> Either' a b
Left' (b
m forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral (Text -> Int
Data.Text.length Text
txt))
Just Int
n -> forall a b. b -> Either' a b
Right' (b
m forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n)
Either' b b
_ -> Either' b b
x
{-# INLINABLE findIndex #-}
count :: Num n => Char -> Fold Text n
count :: forall n. Num n => Char -> Fold Text n
count Char
c = forall a b x. (x -> a -> x) -> x -> (x -> b) -> Fold a b
Control.Foldl.Fold forall {a}. Num a => a -> Text -> a
step n
0 forall a. a -> a
id
where
step :: a -> Text -> a
step a
n Text
txt = a
n forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral (Text -> Text -> Int
Data.Text.count (Char -> Text
Data.Text.singleton Char
c) Text
txt)
{-# INLINABLE count #-}
lazy :: Fold Text Data.Text.Lazy.Text
lazy :: Fold Text Text
lazy = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Text] -> Text
Data.Text.Lazy.fromChunks forall a. Fold a [a]
Control.Foldl.list
{-# INLINABLE lazy #-}