DeferredFolds.Unfoldl

deferred-folds-0.9.18.6: Abstractions over deferred folds

Safe Haskell | None
Language | Haskell2010

DeferredFolds.Unfoldl

Synopsis

- filter :: (a -> Bool) -> Unfoldl a -> Unfoldl a
- fold :: Fold input output -> Unfoldl input -> output
- newtype Unfoldl a = Unfoldl (forall x. (x -> a -> x) -> x -> x)
- foldable :: Foldable foldable => foldable a -> Unfoldl a
- intsInRange :: Int -> Int -> Unfoldl Int
- byteStringBytes :: ByteString -> Unfoldl Word8
- shortByteStringBytes :: ShortByteString -> Unfoldl Word8
- primArray :: Prim prim => PrimArray prim -> Unfoldl prim
- primArrayWithIndices :: Prim prim => PrimArray prim -> Unfoldl (Int, prim)
- unfoldlM :: UnfoldlM Identity input -> Unfoldl input
- mapFoldInput :: (forall x. Fold b x -> Fold a x) -> Unfoldl a -> Unfoldl b
- mapAssocs :: Map key value -> Unfoldl (key, value)
- intMapAssocs :: IntMap value -> Unfoldl (Int, value)

# Documentation

filter :: (a -> Bool) -> Unfoldl a -> Unfoldl a #

Filter the values given a predicate

fold :: Fold input output -> Unfoldl input -> output #

Apply a Gonzalez fold

newtype Unfoldl a #

A projection on data, which only knows how to execute a strict left-fold.

It is a monad and a monoid, and is very useful for efficiently aggregating the projections on data intended for left-folding, since its concatenation (`<>`) has complexity of `O(1)`.

Intuition

The intuition for this abstraction can be derived from lists.

Let's consider the `foldl'` function for lists:

    foldl' :: (b -> a -> b) -> b -> [a] -> b

If we rearrange its parameters we get

    foldl' :: [a] -> (b -> a -> b) -> b -> b

Which in Haskell is essentially the same as

    foldl' :: [a] -> (forall b. (b -> a -> b) -> b -> b)

We can isolate that part into an abstraction:

    newtype Unfoldl a = Unfoldl (forall b. (b -> a -> b) -> b -> b)

Then we get to this simple morphism:

    list :: [a] -> Unfoldl a
    list list = Unfoldl (\ step init -> foldl' step init list)

We can do the same with say Data.Text.Text:

    text :: Text -> Unfoldl Char
    text text = Unfoldl (\ step init -> Data.Text.foldl' step init text)

And then we can use those both to concatenate with just an `O(1)` cost:

    abcdef :: Unfoldl Char
    abcdef = list ['a', 'b', 'c'] <> text "def"

Please notice that up until this moment no actual data materialization has happened and hence no traversals have appeared. All that we've done is just composed a function, which only specifies which parts of data structures to traverse to perform a left-fold. Only at the moment where the actual folding will happen will we actually traverse the source data. E.g., using the "fold" function:

    abcdefLength :: Int
    abcdefLength = fold Control.Foldl.length abcdef

Constructors

Unfoldl (forall x. (x -> a -> x) -> x -> x) |

#### Instances

Instances details

Alternative Unfoldl # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods empty :: Unfoldl a # (<|>) :: Unfoldl a -> Unfoldl a -> Unfoldl a # some :: Unfoldl a -> Unfoldl [a] # many :: Unfoldl a -> Unfoldl [a] #
Applicative Unfoldl # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods pure :: a -> Unfoldl a # (<*>) :: Unfoldl (a -> b) -> Unfoldl a -> Unfoldl b # liftA2 :: (a -> b -> c) -> Unfoldl a -> Unfoldl b -> Unfoldl c # (*>) :: Unfoldl a -> Unfoldl b -> Unfoldl b # (<*) :: Unfoldl a -> Unfoldl b -> Unfoldl a #
Functor Unfoldl # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods fmap :: (a -> b) -> Unfoldl a -> Unfoldl b # (<$) :: a -> Unfoldl b -> Unfoldl a #
Monad Unfoldl # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods (>>=) :: Unfoldl a -> (a -> Unfoldl b) -> Unfoldl b # (>>) :: Unfoldl a -> Unfoldl b -> Unfoldl b # return :: a -> Unfoldl a #
MonadPlus Unfoldl # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods mzero :: Unfoldl a # mplus :: Unfoldl a -> Unfoldl a -> Unfoldl a #
Foldable Unfoldl # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods fold :: Monoid m => Unfoldl m -> m # foldMap :: Monoid m => (a -> m) -> Unfoldl a -> m # foldMap' :: Monoid m => (a -> m) -> Unfoldl a -> m # foldr :: (a -> b -> b) -> b -> Unfoldl a -> b # foldr' :: (a -> b -> b) -> b -> Unfoldl a -> b # foldl :: (b -> a -> b) -> b -> Unfoldl a -> b # foldl' :: (b -> a -> b) -> b -> Unfoldl a -> b # foldr1 :: (a -> a -> a) -> Unfoldl a -> a # foldl1 :: (a -> a -> a) -> Unfoldl a -> a # toList :: Unfoldl a -> [a] # null :: Unfoldl a -> Bool # length :: Unfoldl a -> Int # elem :: Eq a => a -> Unfoldl a -> Bool # maximum :: Ord a => Unfoldl a -> a # minimum :: Ord a => Unfoldl a -> a # sum :: Num a => Unfoldl a -> a # product :: Num a => Unfoldl a -> a #
Monoid (Unfoldl a) # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods mempty :: Unfoldl a # mappend :: Unfoldl a -> Unfoldl a -> Unfoldl a # mconcat :: [Unfoldl a] -> Unfoldl a #
Semigroup (Unfoldl a) # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods (<>) :: Unfoldl a -> Unfoldl a -> Unfoldl a # sconcat :: NonEmpty (Unfoldl a) -> Unfoldl a # stimes :: Integral b => b -> Unfoldl a -> Unfoldl a #
IsList (Unfoldl a) # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Associated Types
type Item (Unfoldl a) |
Instance details Defined in DeferredFolds.Defs.Unfoldl type Item (Unfoldl a) = a
Methods fromList :: [Item (Unfoldl a)] -> Unfoldl a # fromListN :: Int -> [Item (Unfoldl a)] -> Unfoldl a # toList :: Unfoldl a -> [Item (Unfoldl a)] #
Show a => Show (Unfoldl a) # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods showsPrec :: Int -> Unfoldl a -> ShowS # show :: Unfoldl a -> String # showList :: [Unfoldl a] -> ShowS #
Eq a => Eq (Unfoldl a) # |
Instance details Defined in DeferredFolds.Defs.Unfoldl Methods (==) :: Unfoldl a -> Unfoldl a -> Bool # (/=) :: Unfoldl a -> Unfoldl a -> Bool #
type Item (Unfoldl a) # |
Instance details Defined in DeferredFolds.Defs.Unfoldl type Item (Unfoldl a) = a

foldable :: Foldable foldable => foldable a -> Unfoldl a #

Construct from any foldable

intsInRange :: Int -> Int -> Unfoldl Int #

Ints in the specified inclusive range

byteStringBytes :: ByteString -> Unfoldl Word8 #

Bytes of a bytestring

shortByteStringBytes :: ShortByteString -> Unfoldl Word8 #

Bytes of a short bytestring

primArray :: Prim prim => PrimArray prim -> Unfoldl prim #

Elements of a prim array

primArrayWithIndices :: Prim prim => PrimArray prim -> Unfoldl (Int, prim) #

Elements of a prim array coming paired with indices

unfoldlM :: UnfoldlM Identity input -> Unfoldl input #

Unlift a monadic unfold

mapFoldInput :: (forall x. Fold b x -> Fold a x) -> Unfoldl a -> Unfoldl b #

Lift a fold input mapping function into a mapping of unfolds

mapAssocs :: Map key value -> Unfoldl (key, value) #

Associations of a map

intMapAssocs :: IntMap value -> Unfoldl (Int, value) #

Associations of an intmap