name: streamly version: 0.6.0 synopsis: Beautiful Streaming, Concurrent and Reactive Composition description: Streamly, short for streaming concurrently, provides monadic streams, with a simple API, almost identical to standard lists, and an in-built support for concurrency. By using stream-style combinators on stream composition, streams can be generated, merged, chained, mapped, zipped, and consumed concurrently – providing a generalized high level programming framework unifying streaming and concurrency. Controlled concurrency allows even infinite streams to be evaluated concurrently. Concurrency is auto scaled based on feedback from the stream consumer. The programmer does not have to be aware of threads, locking or synchronization to write scalable concurrent programs. . The basic streaming functionality of streamly is equivalent to that provided by streaming libraries like , , and . In addition to providing streaming functionality, streamly subsumes the functionality of list transformer libraries like @pipes@ or and also the logic programming library . On the concurrency side, it subsumes the functionality of the package. Because it supports streaming with concurrency we can write FRP applications similar in concept to or . . For file IO, currently the library provides only one API to stream the lines in the file as Strings. Future versions will provide better streaming file IO options. Streamly interoperates with the popular streaming libraries, see the interoperation section in "Streamly.Tutorial". . Why use streamly? . * /Simplicity/: Simple list like streaming API, if you know how to use lists then you know how to use streamly. This library is built with simplicity and ease of use as a primary design goal. * /Concurrency/: Simple, powerful, and scalable concurrency. Concurrency is built-in, and not intrusive, concurrent programs are written exactly the same way as non-concurrent ones. * /Generality/: Unifies functionality provided by several disparate packages (streaming, concurrency, list transformer, logic programming, reactive programming) in a concise API. * /Performance/: Streamly is designed for high performance. It employs stream fusion optimizations for best possible performance. Serial peformance is equivalent to the venerable `vector` library in most cases and even better in some cases. Concurrent performance is unbeatable. See for a comparison of popular streaming libraries on micro-benchmarks. . Where to find more information: . * /Quick Overview/: in the package * /Detailed Tutorial/: "Streamly.Tutorial" module in the haddock documentation * /Reference Documentation/: Haddock documentation for the respective modules * /Examples/: in the package * /Guides/: in the package, for documentation on advanced topics, limitations, semantics of the library or on specific use cases. * * homepage: https://github.com/composewell/streamly bug-reports: https://github.com/composewell/streamly/issues license: BSD3 license-file: LICENSE tested-with: GHC==7.10.3 , GHC==8.0.2 , GHC==8.4.4 , GHC==8.6.3 author: Harendra Kumar maintainer: harendra.kumar@gmail.com copyright: 2017 Harendra Kumar category: Control, Concurrency, Streaming, Reactivity stability: Experimental build-type: Simple cabal-version: >= 1.10 extra-source-files: Changelog.md README.md docs/streamly-vs-async.md docs/transformers.md bench.sh stack-7.10.yaml stack-8.0.yaml stack.yaml src/Streamly/Streams/Instances.hs src/Streamly/Streams/inline.hs source-repository head type: git location: https://github.com/composewell/streamly flag dev description: Development build manual: True default: False flag no-fusion description: Disable rewrite rules manual: True default: False flag streamk description: Use CPS style streams when possible manual: True default: False flag examples description: Build including examples manual: True default: False flag examples-sdl description: Build including SDL examples manual: True default: False ------------------------------------------------------------------------------- -- Library ------------------------------------------------------------------------------- library hs-source-dirs: src other-modules: Streamly.SVar -- Base streams , Streamly.Streams.StreamK.Type , Streamly.Streams.StreamK , Streamly.Streams.StreamD.Type , Streamly.Streams.StreamD , Streamly.Streams.Prelude -- Higher level streams , Streamly.Streams.SVar , Streamly.Streams.Serial , Streamly.Streams.Async , Streamly.Streams.Parallel , Streamly.Streams.Ahead , Streamly.Streams.Zip , Streamly.Streams.Combinators , Streamly.List , Streamly.String , Streamly.Enumeration exposed-modules: Streamly.Prelude , Streamly.Time , Streamly , Streamly.Tutorial , Streamly.Internal default-language: Haskell2010 ghc-options: -Wall -fspec-constr-recursive=10 if flag(streamk) cpp-options: -DUSE_STREAMK_ONLY if flag(no-fusion) cpp-options: -DDISABLE_FUSION if flag(dev) ghc-options: -Wmissed-specialisations -Wall-missed-specialisations -fno-ignore-asserts if impl(ghc >= 8.0) ghc-options: -Wcompat -Wunrecognised-warning-flags -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances build-depends: base >= 4.8 && < 5 , ghc-prim >= 0.2 && < 0.6 , deepseq >= 1.4.3 && < 1.5 , containers >= 0.5 && < 0.7 , heaps >= 0.3 && < 0.4 -- concurrency , atomic-primops >= 0.8 && < 0.9 , lockfree-queue >= 0.2.3 && < 0.3 , clock >= 0.7.1 && < 0.8 -- transfomers , exceptions >= 0.8 && < 0.11 , monad-control >= 1.0 && < 2 , mtl >= 2.2 && < 3 , transformers >= 0.4 && < 0.6 , transformers-base >= 0.4 && < 0.5 if impl(ghc < 8.0) build-depends: semigroups >= 0.18 && < 0.19 ------------------------------------------------------------------------------- -- Test suites ------------------------------------------------------------------------------- -- Compilation for coverage builds on CI machines takes too long without -O0 test-suite test type: exitcode-stdio-1.0 main-is: Main.hs hs-source-dirs: test ghc-options: -O0 -Wall -threaded -with-rtsopts=-N -fno-ignore-asserts if flag(dev) cpp-options: -DDEVBUILD ghc-options: -Wmissed-specialisations -Wall-missed-specialisations if impl(ghc >= 8.0) ghc-options: -Wcompat -Wunrecognised-warning-flags -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances build-depends: streamly , base >= 4.8 && < 5 , hspec >= 2.0 && < 3 , containers >= 0.5 && < 0.7 , transformers >= 0.4 && < 0.6 , mtl >= 2.2 && < 3 , exceptions >= 0.8 && < 0.11 default-language: Haskell2010 -- test-suite pure-streams-base -- type: exitcode-stdio-1.0 -- main-is: PureStreams.hs -- hs-source-dirs: test -- ghc-options: -O0 -Wall -threaded -with-rtsopts=-N -fno-ignore-asserts -- if flag(dev) -- cpp-options: -DDEVBUILD -- ghc-options: -Wmissed-specialisations -- -Wall-missed-specialisations -- if impl(ghc >= 8.0) -- ghc-options: -Wcompat -- -Wunrecognised-warning-flags -- -Widentities -- -Wincomplete-record-updates -- -Wincomplete-uni-patterns -- -Wredundant-constraints -- -Wnoncanonical-monad-instances -- -Wnoncanonical-monadfail-instances -- build-depends: -- streamly -- , base >= 4.8 && < 5 -- , hspec >= 2.0 && < 3 -- default-language: Haskell2010 -- -- test-suite pure-streams-streamly -- type: exitcode-stdio-1.0 -- main-is: PureStreams.hs -- hs-source-dirs: test -- cpp-options: -DUSE_STREAMLY_LIST -- ghc-options: -O0 -Wall -threaded -with-rtsopts=-N -fno-ignore-asserts -- if flag(dev) -- cpp-options: -DDEVBUILD -- ghc-options: -Wmissed-specialisations -- -Wall-missed-specialisations -- if impl(ghc >= 8.0) -- ghc-options: -Wcompat -- -Wunrecognised-warning-flags -- -Widentities -- -Wincomplete-record-updates -- -Wincomplete-uni-patterns -- -Wredundant-constraints -- -Wnoncanonical-monad-instances -- -Wnoncanonical-monadfail-instances -- build-depends: -- streamly -- , base >= 4.8 && < 5 -- , hspec >= 2.0 && < 3 -- default-language: Haskell2010 test-suite properties type: exitcode-stdio-1.0 main-is: Prop.hs hs-source-dirs: test ghc-options: -fno-ignore-asserts -Wall -O0 -threaded -with-rtsopts=-N if flag(dev) cpp-options: -DDEVBUILD ghc-options: -Wmissed-specialisations -Wall-missed-specialisations if impl(ghc >= 8.0) ghc-options: -Wcompat -Wunrecognised-warning-flags -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances build-depends: streamly , base >= 4.8 && < 5 , QuickCheck >= 2.10 && < 2.13 , hspec >= 2.0 && < 3 if impl(ghc < 8.0) build-depends: transformers >= 0.4 && < 0.6 default-language: Haskell2010 test-suite maxrate type: exitcode-stdio-1.0 default-language: Haskell2010 main-is: MaxRate.hs hs-source-dirs: test ghc-options: -fno-ignore-asserts -O2 -Wall -threaded -with-rtsopts=-N if flag(dev) buildable: True build-Depends: streamly , base >= 4.8 && < 5 , clock >= 0.7.1 && < 0.8 , hspec >= 2.0 && < 3 , random >= 1.0.0 && < 2 else buildable: False test-suite loops type: exitcode-stdio-1.0 default-language: Haskell2010 main-is: loops.hs hs-source-dirs: test ghc-options: -fno-ignore-asserts -O2 -Wall -threaded -with-rtsopts=-N build-Depends: streamly , base >= 4.8 && < 5 test-suite nested-loops type: exitcode-stdio-1.0 default-language: Haskell2010 main-is: nested-loops.hs hs-source-dirs: test ghc-options: -fno-ignore-asserts -O2 -Wall -threaded -with-rtsopts=-N build-Depends: streamly , base >= 4.8 && < 5 , random >= 1.0.0 && < 2 test-suite parallel-loops type: exitcode-stdio-1.0 default-language: Haskell2010 main-is: parallel-loops.hs hs-source-dirs: test ghc-options: -fno-ignore-asserts -O2 -Wall -threaded -with-rtsopts=-N build-Depends: streamly , base >= 4.8 && < 5 , random >= 1.0.0 && < 2 ------------------------------------------------------------------------------- -- Benchmarks ------------------------------------------------------------------------------- benchmark linear type: exitcode-stdio-1.0 hs-source-dirs: benchmark main-is: Linear.hs other-modules: LinearOps default-language: Haskell2010 ghc-options: -O2 -Wall -fspec-constr-recursive=10 if flag(dev) ghc-options: -Wmissed-specialisations -Wall-missed-specialisations -fno-ignore-asserts if impl(ghc >= 8.0) ghc-options: -Wcompat -Wunrecognised-warning-flags -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances build-depends: streamly , base >= 4.8 && < 5 , deepseq >= 1.4.3 && < 1.5 , random >= 1.0 && < 2.0 , gauge >= 0.2.4 && < 0.3 benchmark linear-async type: exitcode-stdio-1.0 hs-source-dirs: benchmark main-is: LinearAsync.hs other-modules: LinearOps default-language: Haskell2010 ghc-options: -O2 -Wall -fspec-constr-recursive=10 cpp-options: -DLINEAR_ASYNC if flag(dev) ghc-options: -Wmissed-specialisations -Wall-missed-specialisations -fno-ignore-asserts if impl(ghc >= 8.0) ghc-options: -Wcompat -Wunrecognised-warning-flags -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances build-depends: streamly , base >= 4.8 && < 5 , deepseq >= 1.4.3 && < 1.5 , random >= 1.0 && < 2.0 , gauge >= 0.2.4 && < 0.3 benchmark linear-rate type: exitcode-stdio-1.0 hs-source-dirs: benchmark main-is: LinearRate.hs other-modules: LinearOps default-language: Haskell2010 ghc-options: -O2 -Wall -fspec-constr-recursive=10 if flag(dev) ghc-options: -Wmissed-specialisations -Wall-missed-specialisations -fno-ignore-asserts if impl(ghc >= 8.0) ghc-options: -Wcompat -Wunrecognised-warning-flags -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances build-depends: streamly , base >= 4.8 && < 5 , deepseq >= 1.4.3 && < 1.5 , random >= 1.0 && < 2.0 , gauge >= 0.2.4 && < 0.3 benchmark nested type: exitcode-stdio-1.0 hs-source-dirs: benchmark main-is: Nested.hs other-modules: NestedOps default-language: Haskell2010 ghc-options: -O2 -Wall -fspec-constr-recursive=10 if flag(dev) ghc-options: -Wmissed-specialisations -Wall-missed-specialisations -fno-ignore-asserts if impl(ghc >= 8.0) ghc-options: -Wcompat -Wunrecognised-warning-flags -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances build-depends: streamly , base >= 4.8 && < 5 , deepseq >= 1.4.3 && < 1.5 , random >= 1.0 && < 2.0 , gauge >= 0.2.4 && < 0.3 ------------------------------------------------------------------------------- -- Internal benchmarks for unexposed modules ------------------------------------------------------------------------------- -- We have to copy the streamly library modules here because there is no -- way to use unexposed modules from the library. benchmark base type: exitcode-stdio-1.0 hs-source-dirs: benchmark, src main-is: BaseStreams.hs other-modules: Streamly.SVar , Streamly.Streams.StreamK.Type , Streamly.Streams.StreamK , Streamly.Streams.StreamD.Type , Streamly.Streams.StreamD , Streamly.Streams.Prelude , StreamDOps , StreamKOps default-language: Haskell2010 ghc-options: -O2 -Wall -fspec-constr-recursive=10 if flag(dev) ghc-options: -Wmissed-specialisations -Wall-missed-specialisations -fno-ignore-asserts if impl(ghc >= 8.0) ghc-options: -Wcompat -Wunrecognised-warning-flags -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances if flag(dev) buildable: True build-depends: base >= 4.8 && < 5 , deepseq >= 1.4.3 && < 1.5 , random >= 1.0 && < 2.0 , gauge >= 0.2.4 && < 0.3 , ghc-prim >= 0.2 && < 0.6 , containers >= 0.5 && < 0.7 , heaps >= 0.3 && < 0.4 -- concurrency , atomic-primops >= 0.8 && < 0.9 , lockfree-queue >= 0.2.3 && < 0.3 , clock >= 0.7.1 && < 0.8 , exceptions >= 0.8 && < 0.11 , monad-control >= 1.0 && < 2 , mtl >= 2.2 && < 3 , transformers >= 0.4 && < 0.6 , transformers-base >= 0.4 && < 0.5 if impl(ghc < 8.0) build-depends: semigroups >= 0.18 && < 0.19 else buildable: False executable nano-bench hs-source-dirs: benchmark, src main-is: NanoBenchmarks.hs other-modules: Streamly.SVar , Streamly.Streams.StreamK.Type , Streamly.Streams.StreamK , Streamly.Streams.StreamD.Type , Streamly.Streams.StreamD default-language: Haskell2010 ghc-options: -O2 -Wall if flag(dev) buildable: True build-depends: base >= 4.8 && < 5 , gauge >= 0.2.4 && < 0.3 , ghc-prim >= 0.2 && < 0.6 , containers >= 0.5 && < 0.7 , heaps >= 0.3 && < 0.4 , random >= 1.0 && < 2.0 -- concurrency , atomic-primops >= 0.8 && < 0.9 , lockfree-queue >= 0.2.3 && < 0.3 , clock >= 0.7.1 && < 0.8 , exceptions >= 0.8 && < 0.11 , monad-control >= 1.0 && < 2 , mtl >= 2.2 && < 3 , transformers >= 0.4 && < 0.6 else buildable: False executable adaptive hs-source-dirs: benchmark main-is: Adaptive.hs default-language: Haskell2010 ghc-options: -O2 -Wall if flag(dev) buildable: True build-depends: streamly , base >= 4.8 && < 5 , gauge >= 0.2.4 && < 0.3 , random >= 1.0 && < 2.0 else buildable: False executable chart default-language: Haskell2010 hs-source-dirs: benchmark main-is: Chart.hs if flag(dev) buildable: True build-Depends: base >= 4.8 && < 5 , bench-show >= 0.2 && < 0.3 , split , transformers >= 0.4 && < 0.6 else buildable: False ------------------------------------------------------------------------------- -- Examples ------------------------------------------------------------------------------- executable SearchQuery default-language: Haskell2010 main-is: SearchQuery.hs hs-source-dirs: examples if flag(examples) || flag(examples-sdl) buildable: True build-Depends: streamly , base >= 4.8 && < 5 , http-conduit >= 2.2.2 && < 2.4 else buildable: False executable ListDir default-language: Haskell2010 main-is: ListDir.hs hs-source-dirs: examples if flag(examples) || flag(examples-sdl) buildable: True build-Depends: streamly , base >= 4.8 && < 5 , path-io >= 0.1.0 && < 1.5 if impl(ghc < 8.0) build-depends: transformers >= 0.4 && < 0.6 else buildable: False executable MergeSort default-language: Haskell2010 main-is: MergeSort.hs hs-source-dirs: examples if flag(examples) || flag(examples-sdl) buildable: True build-Depends: streamly , base >= 4.8 && < 5 , random >= 1.0.0 && < 2 else buildable: False executable AcidRain default-language: Haskell2010 main-is: AcidRain.hs hs-source-dirs: examples if flag(examples) || flag(examples-sdl) buildable: True build-Depends: streamly , base >= 4.8 && < 5 , mtl >= 2.2 && < 3 if impl(ghc < 8.0) build-depends: semigroups >= 0.18 && < 0.19 , transformers >= 0.4 && < 0.6 else buildable: False executable CirclingSquare default-language: Haskell2010 main-is: CirclingSquare.hs hs-source-dirs: examples if flag(examples-sdl) buildable: True build-Depends: streamly , base >= 4.8 && < 5 , SDL >= 0.6.5 && < 0.7 else buildable: False executable ControlFlow default-language: Haskell2010 main-is: ControlFlow.hs hs-source-dirs: examples if flag(examples) || flag(examples-sdl) buildable: True build-Depends: streamly , base >= 4.8 && < 5 , exceptions >= 0.8 && < 0.11 , transformers >= 0.4 && < 0.6 , transformers-base >= 0.4 && < 0.5 if impl(ghc < 8.0) build-depends: semigroups >= 0.18 && < 0.19 else buildable: False