name: streaming version: 0.1.0.16 cabal-version: >=1.10 build-type: Simple synopsis: a free monad transformer optimized for streaming applications description: @Stream@ can be used wherever is used. The compiler's standard range of optimizations work better for operations written in terms of `Stream`. @FreeT f m r@ / @Stream f m r@ is of course extremely general, and many functor-general combinators are exported by the general module @Streaming@. . @Streaming.Prelude@ is focused on elementary /streaming/ applications. Here the free iteration of the \'base\' functors (readings of the @f@ in @Stream f m r@) express forms of effectful sequence or succession. Some of types in question appear in the streaming IO libraries under titles like . > pipes: Producer a m r, Producer a m (Producer a m r), FreeT (Producer a m) m r > io-streams: InputStream a, Generator a r > conduit: Source m a, ConduitM () o m r . @Streaming.Prelude@ closely follows @Pipes.Prelude@, but cleverly /omits the pipes/: . > ghci> S.stdoutLn $ S.take 2 S.stdinLn > let's > let's > stream > stream . And here we do a little /connect and resume/, as the streaming-io experts call it: . > ghci> rest <- S.print $ S.splitAt 3 $ S.each [1..10] > 1 > 2 > 3 > ghci> S.sum rest > 49 . Somehow, we didn't even need a four-character operator for that, nor advice about best practices! - just ordinary Haskell common sense. . The simplest form of interoperation with is accomplished with this isomorphism: . > Pipes.unfoldr Streaming.next :: Stream (Of a) m r -> Producer a m r > Streaming.unfoldr Pipes.next :: Producer a m r -> Stream (Of a) m r . (@streaming@ can be mixed with @pipes@ wherever @pipes@ itself employs @Control.Monad.Trans.Free@; speedups are frequently appreciable.) Interoperation with is thus: . > Streaming.reread IOStreams.read :: InputStream a -> Stream (Of a) IO () > IOStreams.unfoldM Streaming.uncons :: Stream (Of a) IO () -> IO (InputStream a) . A simple exit to would be, e.g.: . > Conduit.unfoldM Streaming.uncons :: Stream (Of a) m () -> Source m a . These conversions should never be more expensive than a single @>->@ or @=$=@. . At a much more general level, we also of course have interoperation with : . > Free.iterTM Stream.wrap :: FreeT f m a -> Stream f m a > Stream.iterTM Free.wrap :: Stream f m a -> FreeT f m a . For some simple ghci examples, see the commentary throughout the Prelude module. For slightly more advanced usage see the commentary in the haddocks of and e.g. of shell-like programs from the io-streams tutorial. Here's a simple with intrinsically streaming byte streams. license: BSD3 license-file: LICENSE author: michaelt maintainer: what_is_it_to_do_anything@yahoo.com stability: Experimental homepage: https://github.com/michaelt/streaming bug-reports: https://github.com/michaelt/streaming/issues category: Data, Pipes source-repository head type: git location: https://github.com/michaelt/streaming library exposed-modules: Streaming, Streaming.Prelude, Streaming.Internal -- other-modules: other-extensions: RankNTypes, CPP, StandaloneDeriving, FlexibleContexts, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveTraversable, UndecidableInstances build-depends: base >=4.6 && <5 , mtl >=2.1 && <2.3 , mmorph >=1.0 && <1.2 , transformers >=0.3 && <0.5 default-language: Haskell2010