Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
A resource management decorator for Stream
s.
Stream
s requiring resource allocation are lifted to values of type
Bracketed
, which can be combined using an API that is more restricted
than that of the original Stream
s and ensures prompt deallocation of
resources.
Values of type Bracketed
can later be run by supplying a
Stream
-consumer continuation to the with
function.
>>>
:{
do -- boring setup stuff for a two-line text file path <- (</> "streaming-bracketed-doctest.txt") <$> getTemporaryDirectory exists <- doesPathExist path when exists (removeFile path) withFile path WriteMode (for_ ["aaa","bbb"] . hPutStrLn) -- end of setup let lineStream = R.linesFromFile utf8 nativeNewlineMode path lines :> () <- R.with (R.over_ (S.take 1) lineStream *> R.over (S.map (map succ)) lineStream) S.toList return lines :} ["aaa","bbb","ccc"]
Synopsis
- data Bracketed a r
- clear :: Stream (Of x) IO r -> Bracketed x r
- bracketed :: IO a -> (a -> IO ()) -> (a -> Stream (Of x) IO r) -> Bracketed x r
- with :: Bracketed a r -> (forall x. Stream (Of a) IO x -> IO (Of b x)) -> IO (Of b r)
- with_ :: Bracketed a r -> (Stream (Of a) IO r -> IO b) -> IO b
- over :: (forall x. Stream (Of a) IO x -> Stream (Of b) IO x) -> Bracketed a r -> Bracketed b r
- over' :: (forall x. Stream (Of a) IO x -> Stream (Of b) IO (Of s x)) -> Bracketed a r -> Bracketed b (Of s r)
- over_ :: (Stream (Of a) IO r -> Stream (Of b) IO r') -> Bracketed a r -> Bracketed b r'
- for :: Bracketed a r -> (a -> Bracketed b x) -> Bracketed b r
- linesFromFile :: TextEncoding -> NewlineMode -> FilePath -> Bracketed String ()
- concatRanges :: TextEncoding -> NewlineMode -> [(FilePath, Int, Int)] -> Bracketed String ()
Bracketed
A resource management decorator for the Stream
type.
a
is the type of yielded elements, r
the type of the final result.
It is not parameterized by a base monad because the underlying
Stream
s are always over IO
.
Instances
Bifunctor Bracketed Source # |
|
Monad (Bracketed a) Source # | |
Functor (Bracketed a) Source # | |
Applicative (Bracketed a) Source # |
|
Defined in Streaming.Bracketed.Internal | |
MonadIO (Bracketed a) Source # | |
Defined in Streaming.Bracketed.Internal |
Lifting streams
Consuming bracketed streams with continuations
with :: Bracketed a r -> (forall x. Stream (Of a) IO x -> IO (Of b x)) -> IO (Of b r) Source #
Consume a Bracketed
stream, exhausting it.
>>>
R.with (pure True) S.toList
[] :> True
with_ :: Bracketed a r -> (Stream (Of a) IO r -> IO b) -> IO b Source #
Consume a Bracketed
stream, possibly wihout exhausting it.
Finalizers lying in unconsumed parts of the stream will not be executed until the callback returns, so better not tarry too long if you want prompt finalization.
>>>
R.with_ (R.clear (S.each "abcd" *> pure True)) (S.toList . S.take 2)
"ab" :> ()
Transforming bracketed streams
over :: (forall x. Stream (Of a) IO x -> Stream (Of b) IO x) -> Bracketed a r -> Bracketed b r Source #
Apply to the underlying stream a transformation that preserves the return value, like map
.
>>>
R.with (S.map succ `R.over` R.clear (S.each "abcd")) S.toList
"bcde" :> ()
over' :: (forall x. Stream (Of a) IO x -> Stream (Of b) IO (Of s x)) -> Bracketed a r -> Bracketed b (Of s r) Source #
Like over
, but for transformations which return some final state or summary value besides the original return value.
over_ :: (Stream (Of a) IO r -> Stream (Of b) IO r') -> Bracketed a r -> Bracketed b r' Source #
Apply to the underlying stream a transformation that might not preserve
the return value, like take
.
>>>
R.with (S.take 2 `R.over_` R.clear (S.each "abdc")) S.toList
"ab" :> ()
for :: Bracketed a r -> (a -> Bracketed b x) -> Bracketed b r Source #
Replaces each element of a stream with an associated stream.
Can be useful for traversing hierachical structures.
Reading text files
linesFromFile :: TextEncoding -> NewlineMode -> FilePath -> Bracketed String () Source #
A bracketed stream of all the lines in a text file.
This is adequate for simple use cases. For more advanced ones where
efficiency and memory usage are important, it's better to use a packed
text representation like the one provided by the text
package.
concatRanges :: TextEncoding -> NewlineMode -> [(FilePath, Int, Int)] -> Bracketed String () Source #
Given a list of text files and line ranges, create a stream of lines belonging to the concatenated ranges.