Modulestreamly-core-0.3.1Haskell2010
Streamly.Internal.Data.Unfold
- 3 types
- 1 class
- 111 values
- Packagestreamly-core-0.3.1
- Exports115
- LanguageHaskell2010
- LicenceBSD-3-Clause
- SourceType.hs
Setup
0 declarationsTo execute the code examples provided in this module in ghci, please run the following commands first.
:mimport Streamly.Data.Unfold (Unfold)import qualified Streamly.Data.Fold as Foldimport qualified Streamly.Data.Scanl as Scanlimport qualified Streamly.Data.Stream as Streamimport qualified Streamly.Data.Unfold as Unfold
For APIs that have not been released yet.
import qualified Streamly.Internal.Data.Unfold as UnfoldUnfold Type
50 declarationsDeprecated. Use supply instead.
Carry the input along with the output as the first element of the output tuple.
carry = Unfold.lmap (x -> (x,x)) . Unfold.zipRepeat
Note that the input seed may mutate (e.g. if the seed is a Handle or IORef) as stream is generated from it, so we need to be careful when reusing the seed while the stream is being generated from it.
Map an unfold generating action to each element of an unfold and flatten the results into a single stream.
See crossWith.
Definition:
cross = Unfold.crossWith (,)To create a cross product of the streams generated from a tuple we can write:
:{cross :: Monad m => Unfold m a b -> Unfold m c d -> Unfold m (a, c) (b, d)cross u1 u2 = Unfold.cross (Unfold.lmap fst u1) (Unfold.lmap snd u2):}
Pre-release
Outer product discarding the second element.
Unimplemented
Outer product discarding the first element.
Unimplemented
Like crossWithM but uses a pure combining function.
crossWith f = crossWithM (\b c -> return $ f b c)u1 = Unfold.lmap fst Unfold.fromListu2 = Unfold.lmap snd Unfold.fromListu = Unfold.crossWith (,) u1 u2Unfold.fold Fold.toList u ([1,2,3], [4,5,6])[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]
Create a cross product (vector product or cartesian product) of the output streams of two unfolds using a monadic combining function.
Pre-release
Supply the first component of the tuple to an unfold that accepts a tuple as a seed resulting in a fold that accepts the second component of the tuple as a seed.
first a = Unfold.lmap (a, )
Pre-release
The unfold discards its input and generates a function stream using the supplied monadic action.
Pre-release
Convert a list of pure values to a Stream
Discards the unfold input and always returns the argument of fromPure.
fromPure = fromEffect . purePre-release
Convert a tuple to a Stream.
Lift a pure function into an unfold. The unfold generates a singleton stream.
function f = functionM $ return . fLift a monadic function into an unfold. The unfold generates a singleton stream.
Identity unfold. The unfold generates a singleton stream having the input as the only element.
identity = function Prelude.idPre-release
Interleave the streams generated by two unfolds.
Map a function on the input argument of the Unfold.
u = Unfold.lmap (fmap (+1)) Unfold.fromListUnfold.fold Fold.toList u [1..5][2,3,4,5,6]
Definition:
lmap f = Unfold.unfoldEach (Unfold.function f)Map an action on the input argument of the Unfold.
Definition:
lmapM f = Unfold.unfoldEach (Unfold.functionM f)
Deprecated. Please use unfoldEach instead.
Apply the first unfold to each output element of the second unfold and flatten the output in a single stream.
Deprecated. Use carry with unfoldEach instead.
Deprecated. Please use unfoldEachInterleave instead.
See Streamly.Internal.Data.Stream.unfoldEachInterleave for
documentation and notes.
Internal
Map a function on the output of the unfold (the type b).
Pre-release
Deprecated. Use carry with map instead.
Apply a monadic function to each element of the stream and replace it with the output of the resulting action.
Deprecated. Use carry with mapM instead.
Make an unfold from step and inject functions.
Pre-release
Supply the second component of the tuple to an unfold that accepts a tuple as a seed resulting in a fold that accepts the first component of the tuple as a seed.
second b = Unfold.lmap (, b)
Pre-release
Supply the seed to an unfold closing the input end of the unfold.
supply a = Unfold.lmap (Prelude.const a)Pre-release
End the stream generated by the Unfold as soon as the predicate fails on an element.
Same as takeWhile but with a monadic predicate.
takeWhileMWithInput f u = Unfold.map snd $ Unfold.takeWhileM (\(a,b) -> f a b) (Unfold.carry u)Apply the first unfold to each output element of the second unfold and flatten the output in a single stream.
See Streamly.Internal.Data.Stream.unfoldEachInterleave for
documentation and notes.
Internal
Like unfoldrM but uses a pure step function.
:{ f [] = Nothing f (x:xs) = Just (x, xs):}
Unfold.fold Fold.toList (Unfold.unfoldr f) [1,2,3][1,2,3]
Build a stream by unfolding a monadic step function starting from a seed. The step function returns the next element in the stream and the next seed value. When it is done it returns Nothing and the stream ends.
Like zipWithM but with a pure zip function.
square = fmap (\x -> x * x) Unfold.fromListcube = fmap (\x -> x * x * x) Unfold.fromListu = Unfold.zipWith (,) square cubeUnfold.fold Fold.toList u [1..5][(1,1),(4,8),(9,27),(16,64),(25,125)]
zipWith f = zipWithM (\a b -> return $ f a b)Distribute the input to two unfolds and then zip the outputs to a single stream using a monadic zip function.
zipWithM f u1 u2 = Unfold.lmap (\x -> (x,x)) (Unfold.zipArrowWithM f u1 u2)Stops as soon as any of the unfolds stops.
Pre-release
Constructors
ConcatOuter s1ConcatInner s1 s2
An Unfold m a b is a generator of a stream of values of type b from a
seed of type a in Monad m.
Unfolds
0 declarationsBasic Constructors
Lift a monadic function into an unfold generating a nil stream with a side effect.
An empty stream.
Prepend a monadic single element generator function to an Unfold. The same seed is used in the action as well as the unfold.
Pre-release
Generators
Generate a monadic stream from a seed.
Generates an infinite stream repeating the seed.
Given a seed (n, action), generates a stream replicating the action n
times.
fromIndicesM gen generates an infinite stream of values using gen
starting from the seed.
fromIndicesM f = Unfold.mapM f $ Unfold.enumerateFrom 0
Pre-release
Generates an infinite stream starting with the given seed and applying the given function repeatedly.
Enumerations
Same as enumerateFromStepNum using a stride of 1:
>>> enumerateFromNum = lmap (from -> (from, 1)) Unfold.enumerateFromStepNum
>>> Stream.toList $ Stream.take 6 $ Stream.unfold enumerateFromNum (0.9)
[0.9,1.9,2.9,3.9,4.9,5.9]
Also, same as enumerateFromThenNum using a stride of 1 but see the note in enumerateFromThenNum about the loss of precision:
>>> enumerateFromNum = lmap (from -> (from, from + 1)) Unfold.enumerateFromThenNum
>>> Stream.toList $ Stream.take 6 $ Stream.unfold enumerateFromNum (0.9)
[0.9,1.9,2.9,3.8999999999999995,4.8999999999999995,5.8999999999999995]
Internal
Enumerate from given starting Enum value from with stride of 1 till
maxBound
Internal
Can be used to enumerate unbounded integrals. This does not check for overflow or underflow for bounded integrals.
Internal
Unfolds (from, stride) generating an infinite stream starting from
from and incrementing every time by stride. For Bounded types, after
the value overflows it keeps enumerating in a cycle:
>>> Stream.toList $ Stream.take 10 $ Stream.unfold Unfold.enumerateFromStepNum (255::Word8,1)
[255,0,1,2,3,4,5,6,7,8]
The implementation is numerically stable for floating point values.
Note enumerateFromStepIntegral is faster for integrals.
Internal
Same as 'enumerateFromStepNum (from, next)' using a stride of next - from:
>>> enumerateFromThenNum = lmap ((from, next) -> (from, next - from)) Unfold.enumerateFromStepNum
Example: @ >>> Stream.toList $ Stream.take 10 $ Stream.unfold enumerateFromThenNum (255::Word8,0) [255,0,1,2,3,4,5,6,7,8]
The implementation is numerically stable for floating point values.
Note that enumerateFromThenIntegral is faster for integrals.
Note that in the strange world of floating point numbers, using
enumerateFromThenNum (from, from + 1) is almost exactly the same as
enumerateFromStepNum (from, 1) but not precisely the same. Because (from +
1) - from is not exactly 1, it may lose some precision, the loss may also
be aggregated in each step, if you want that precision then use
enumerateFromStepNum instead.
Internal
Enumerate from given starting Enum value from and next Enum value next
with stride of (fromEnum next - fromEnum from) till maxBound.
Internal
Enumerate from given starting Enum value from and then Enum value next
and to Enum value to with stride of (fromEnum next - fromEnum from)
till to value.
Internal
Same as enumerateFromStepNum with a step of 1 and enumerating up to the specified upper limit rounded to the nearest integral value:
>>> Stream.toList $ Stream.unfold Unfold.enumerateFromToFractional (0.1, 6.3)
[0.1,1.1,2.1,3.1,4.1,5.1,6.1]
Internal
Enumerate from given starting Enum value from and to Enum value to
with stride of 1 till to value.
Internal
Types that can be enumerated as a stream. The operations in this type
class are equivalent to those in the Enum type class, except that these
generate a stream instead of a list. Use the functions in
Streamly.Internal.Data.Unfold.Enumeration module to define new instances.
Pre-release
Methods
enumerateFrom :: Monad m => Unfold m a aUnfolds
fromgenerating a stream starting with the elementfrom, enumerating up to maxBound when the type is Bounded or generating an infinite stream when the type is not Bounded.Example1 expression Stream.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFrom (0 :: Int)[0,1,2,3]
For Fractional types, enumeration is numerically stable. However, no overflow or underflow checks are performed.
Example1 expression Stream.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFrom 1.1[1.1,2.1,3.1,4.1]
Pre-release
enumerateFromTo :: Monad m => Unfold m (a, a) aUnfolds
(from, to)generating a finite stream starting with the elementfrom, enumerating the type up to the valueto. Iftois smaller thanfromthen an empty stream is returned.Example1 expression Stream.toList $ Stream.unfold Unfold.enumerateFromTo (0, 4)[0,1,2,3,4]
For Fractional types, the last element is equal to the specified
tovalue after rounding to the nearest integral value.Example1 expression Stream.toList $ Stream.unfold Unfold.enumerateFromTo (1.1, 4)[1.1,2.1,3.1,4.1]
Example1 expression Stream.toList $ Stream.unfold Unfold.enumerateFromTo (1.1, 4.6)[1.1,2.1,3.1,4.1,5.1]
Pre-release
enumerateFromThen :: Monad m => Unfold m (a, a) aUnfolds
(from, then)generating a stream whose first element isfromand the successive elements are in increments ofthen. Enumeration can occur downwards or upwards depending on whetherthencomes before or afterfrom. For Bounded types the stream ends when maxBound is reached, for unbounded types it keeps enumerating infinitely.Example1 expression Stream.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFromThen (0, 2)[0,2,4,6]
Example1 expression Stream.toList $ Stream.take 4 $ Stream.unfold Unfold.enumerateFromThen (0,(-2))[0,-2,-4,-6]
Pre-release
enumerateFromThenTo :: Monad m => Unfold m (a, a, a) aUnfolds
(from, then, to)generating a finite stream whose first element isfromand the successive elements are in increments ofthenup toto. Enumeration can occur downwards or upwards depending on whetherthencomes before or afterfrom.Example1 expression Stream.toList $ Stream.unfold Unfold.enumerateFromThenTo (0, 2, 6)[0,2,4,6]
Example1 expression Stream.toList $ Stream.unfold Unfold.enumerateFromThenTo (0, (-2), (-6))[0,-2,-4,-6]
Pre-release
Instances21Enumerable, …
Enumerable IntegerDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable NaturalDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable Int16Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable Int32Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable Int64Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable Int8Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable BoolDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable CharDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable DoubleDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable FloatDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable IntDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable OrderingDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable WordDefined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable Word16Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable Word32Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable Word64Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable Word8Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable ()Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationIntegral a => Enumerable (Ratio a)Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationEnumerable a => Enumerable (Identity a)Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.EnumerationHasResolution a => Enumerable (Fixed a)Defined in streamly-core-0.3.1 · Streamly.Internal.Data.Unfold.Enumeration
From Containers
Convert a list of monadic values to a Stream
From Memory
From Stream
Combinators
0 declarationsMapping on Input
Convert an Unfold into an unfold accepting a tuple as an argument, using the argument of the original fold as the second element of tuple and discarding the first element of the tuple.
discardFirst = Unfold.lmap snd
Pre-release
Convert an Unfold into an unfold accepting a tuple as an argument, using the argument of the original fold as the first element of tuple and discarding the second element of the tuple.
discardSecond = Unfold.lmap fst
Pre-release
Convert an Unfold that accepts a tuple as an argument into an unfold that accepts a tuple with elements swapped.
swap = Unfold.lmap Tuple.swap
Pre-release
Folding
1 declarationCompose an Unfold and a Fold. Given an Unfold m a b and a
Fold m b c, returns a monadic action a -> m c representing the
application of the fold on the unfolded stream.
Unfold.fold Fold.sum Unfold.fromList [1..100]5050
fold f u = Stream.fold f . Stream.unfold uPre-release
Mapping on Output
Scan the output of an Unfold to change it in a stateful manner.
Pre-release
Scan the output of an Unfold to change it in a stateful manner.
Pre-release
Scan the output of an Unfold to change it in a stateful manner. Once fold is done it will stop.
u = Unfold.scanl (Scanl.take 2 Scanl.sum) Unfold.fromListUnfold.fold Fold.toList u [1,2,3,4,5][0,1,3]
Pre-release
Scan the output of an Unfold to change it in a stateful manner. Once fold is done it will restart from its initial state.
u = Unfold.scanlMany (Scanl.take 2 Scanl.sum) Unfold.fromListUnfold.fold Fold.toList u [1,2,3,4,5][0,1,3,0,3,7,0,5]
Pre-release
Apply a fold multiple times on the output of an unfold.
Pre-release
Either Wrapped Input
Choose left or right unfold based on an either input.
Pre-release
Filtering
u = Unfold.take 2 Unfold.fromListUnfold.fold Fold.toList u [1..100][1,2]
Include only those elements that pass a predicate.
Same as filter but with a monadic predicate.
drop n unf drops n elements from the stream generated by unf.
Similar to dropWhileM but with a pure condition function.
dropWhileM f unf drops elements from the stream generated by unf while
the condition holds true. The condition function f is monadic in nature.
Cross product
Cross intersection of two unfolds. See innerJoin for more details.
Zip
Takes a tuple whose first element is repeated and the second element is passed through the supplied unfold.
zipRepeat = fmap (\(x,y) -> (fst x, y)) . Unfold.carry . Unfold.lmap sndzipRepeat = Unfold.zipArrowWith (,) Unfold.repeat
Resource Management
bracket is the most general resource management operation, all other
operations can be expressed using it. These functions have IO suffix
because the allocation and cleanup functions are IO actions. For
generalized allocation and cleanup functions see the functions without
the IO suffix in the "streamly" package.
gbracket_ Like gbracketIO but with following differences:
alloc action
a -> m cruns with async exceptions enabledcleanup action
c -> m dwon't run if the stream is garbage collected after partial evaluation.
Inhibits stream fusion
Pre-release
gbracketIO Run the alloc action a -> m c with async exceptions disabled but keeping
blocking operations interruptible (see mask). Use the
output c as input to Unfold m c b to generate an output stream. When
unfolding use the supplied try operation forall s. m s -> m (Either e s)
to catch synchronous exceptions. If an exception occurs run the exception
handling unfold Unfold m (c, e) b.
The cleanup action c -> m d, runs whenever the stream ends normally, due
to a sync or async exception or if it gets garbage collected after a partial
lazy evaluation. See bracket for the semantics of the cleanup action.
gbracket can express all other exception handling combinators.
Inhibits stream fusion
Pre-release
Run a side effect a -> m c on the input a before unfolding it using
Unfold m a b.
before f = lmapM (\a -> f a >> return a)Pre-release
Unfold the input a using Unfold m a b, run an action on a whenever
the unfold stops normally, or if it is garbage collected after a partial
lazy evaluation.
The semantics of the action a -> m c are similar to the cleanup action
semantics in bracket.
See also after_
Pre-release
Like after with following differences:
action
a -> m cwon't run if the stream is garbage collected after partial evaluation.Monad
mdoes not require any other constraints.
Pre-release
Unfold the input a using Unfold m a b, run an action on a whenever
the unfold stops normally, aborts due to an exception or if it is garbage
collected after a partial lazy evaluation.
The semantics of the action a -> m c are similar to the cleanup action
semantics in bracket.
finally release = bracket return release
See also finally_
Inhibits stream fusion
Pre-release
Like finallyIO with following differences:
action
a -> m cwon't run if the stream is garbage collected after partial evaluation.
Inhibits stream fusion
Pre-release
Run the alloc action a -> m c with async exceptions disabled but keeping
blocking operations interruptible (see mask). Use the
output c as input to Unfold m c b to generate an output stream.
c is usually a resource under the state of monad m, e.g. a file
handle, that requires a cleanup after use. The cleanup action c -> m d,
runs whenever the stream ends normally, due to a sync or async exception or
if it gets garbage collected after a partial lazy evaluation.
bracket only guarantees that the cleanup action runs, and it runs with
async exceptions enabled. The action must ensure that it can successfully
cleanup the resource in the face of sync or async exceptions.
When the stream ends normally or on a sync exception, cleanup action runs immediately in the current thread context, whereas in other cases it runs in the GC context, therefore, cleanup may be delayed until the GC gets to run.
See also: bracket_, gbracket
Inhibits stream fusion
Pre-release
Like bracketIO but with following differences:
alloc action
a -> m cruns with async exceptions enabledcleanup action
c -> m dwon't run if the stream is garbage collected after partial evaluation.
Inhibits stream fusion
Pre-release
Exceptions
Most of these combinators inhibit stream fusion, therefore, when possible, they should be called in an outer loop to mitigate the cost. For example, instead of calling them on a stream of chars call them on a stream of arrays before flattening it to a stream of chars.
Unfold the input a using Unfold m a b, run the action a -> m c on
a if the unfold aborts due to an exception.
Inhibits stream fusion
Pre-release
When unfolding Unfold m a b if an exception e occurs, unfold e using
Unfold m e b.
Inhibits stream fusion
Pre-release
Deprecated
Deprecated. Please use scanl instead
Deprecated. Please use scanlMany instead