# streaming-bracketed
[](https://travis-ci.org/danidiaz/streaming-bracketed)
## What's this?
A resource management "decorator" for the `Stream` type from
[streaming](http://hackage.haskell.org/package/streaming).
The idea is that the `Bracketed` type represents a `Stream` which might have
some finalizers that will be triggered when we reach a given point in the
stream.
By being careful about how we lift operations to work on `Bracketed` streams,
we can ensure that finalizers are promptly called even with operations like
`take`.
`Bracketed` streams are ultimately consumed by using a continuation.
## Differences with resourcet
[resourcet](http://hackage.haskell.org/package/resourcet) is a widely used
library for resource handling. It provides a monad transformer over IO that
keeps track of registered resources and ensures proper cleanup.
The main differences with the present library are:
- This library only works on `Stream`s from streaming.
- `Bracketed` sits above the streaming monad, not below like `ResourceT`.
- This library aims to provide smarter handling of stream functions like
`take`, without too much hassle.
- In this library finalizer scopes are nested, unlike `ResourceT` which allows
arbitrary interleavings.
## Doubts
- Lifting functions like `splitAt` might cause problems if we try to use the
rest of the stream.
## Motivation
From the
[CHANGELOG](http://hackage.haskell.org/package/streaming-0.2.1.0/changelog) of
the [streaming](http://hackage.haskell.org/package/streaming) package:
> Remove bracketStream, MonadCatch instance, and everything dealing with
> ResourceT. All of these things of sort of broken for Stream since there is no
> guarantee of linear consumption (functions like take can prevent finalizers
> from running).
[One Github issue](https://github.com/haskell-streaming/streaming/issues/52).
[Another one](https://github.com/haskell-streaming/streaming-with/issues/2).
[Streaming libs exercise/challenge](https://twitter.com/DiazCarrete/status/1016073374458671104):
> Given a list [(Filepath,Int,Int)] of files and line ranges, create a stream
> of lines belonging to the concatenated ranges.
> Prompt release of file handles is required. resource-handling monads and
> "withXXX"-style functions are allowed.