packages feed

streaming-bracketed-0.1.0.0: README.md

# streaming-bracketed

[![Build Status](https://travis-ci.org/danidiaz/streaming-bracketed.svg?branch=master)](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.