mirror of
https://github.com/composewell/streamly.git
synced 2024-09-11 19:47:10 +03:00
392 lines
12 KiB
Plaintext
392 lines
12 KiB
Plaintext
name: streamly
|
|
version: 0.2.0
|
|
synopsis: Beautiful Streaming, Concurrent and Reactive Composition
|
|
description:
|
|
Streamly, short for streaming concurrently, is a simple yet powerful
|
|
streaming library with concurrent merging and concurrent nested looping
|
|
support. A stream is just like a list except that it is a list of monadic
|
|
actions rather than pure values. Streamly streams can be generated,
|
|
consumed, combined, or transformed serially or concurrently. We can loop over
|
|
a stream serially or concurrently. We can also have serial or concurrent
|
|
nesting of loops. For those familiar with list transformer concept streamly
|
|
is a concurrent list transformer. Streamly uses standard composition
|
|
abstractions. Concurrent composition is just the same as serial composition
|
|
except that we use a simple combinator to request a concurrent composition
|
|
instead of serial. The programmer does not have to be aware of threads,
|
|
locking or synchronization to write scalable concurrent programs.
|
|
.
|
|
Streamly provides functionality that is equivalent to streaming libraries
|
|
like <https://hackage.haskell.org/package/pipes pipes> and
|
|
<https://hackage.haskell.org/package/conduit conduit> but with a simple list
|
|
like API. The streaming API of streamly is close to the monadic streams API
|
|
of the <https://hackage.haskell.org/package/vector vector> package and
|
|
similar in concept to the
|
|
<https://hackage.haskell.org/package/streaming streaming> package. In
|
|
addition to the streaming functionality, streamly subsumes the functionality
|
|
of list transformer libraries like @pipes@ or
|
|
<https://hackage.haskell.org/package/list-t list-t> and also the logic
|
|
programming library <https://hackage.haskell.org/package/logict logict>. On
|
|
the concurrency side, it subsumes the functionality of the
|
|
<https://hackage.haskell.org/package/async async> package. Because it
|
|
supports streaming with concurrency we can write FRP applications similar in
|
|
concept to <https://hackage.haskell.org/package/Yampa Yampa> or
|
|
<https://hackage.haskell.org/package/reflex reflex>.
|
|
.
|
|
Streamly has excellent performance, see
|
|
<https://github.com/composewell/streaming-benchmarks streaming-benchmarks>
|
|
for a comparison of popular streaming libraries on micro-benchmarks. 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 interworks with the popular streaming libraries, see the
|
|
interworking section in "Streamly.Tutorial".
|
|
.
|
|
Where to find more information:
|
|
.
|
|
* @README@ shipped with the package for a quick overview
|
|
* "Streamly.Tutorial" module in the haddock documentation for a detailed introduction
|
|
* @examples@ directory in the package for some simple practical examples
|
|
|
|
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.2.2, GHC==8.4.2
|
|
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
|
|
bench.sh
|
|
stack-7.10.yaml
|
|
stack-8.0.yaml
|
|
stack.yaml
|
|
|
|
source-repository head
|
|
type: git
|
|
location: https://github.com/composewell/streamly
|
|
|
|
flag diag
|
|
description: Diagnostics build
|
|
manual: True
|
|
default: False
|
|
|
|
flag dev
|
|
description: Development build
|
|
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.Core
|
|
, Streamly.Streams
|
|
|
|
exposed-modules: Streamly.Prelude
|
|
, Streamly.Time
|
|
, Streamly.Tutorial
|
|
, Streamly
|
|
|
|
default-language: Haskell2010
|
|
ghc-options: -Wall
|
|
|
|
if flag(diag)
|
|
cpp-options: -DDIAGNOSTICS
|
|
|
|
if flag(dev)
|
|
cpp-options: -DDIAGNOSTICS
|
|
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
|
|
, containers >= 0.5 && < 0.6
|
|
, heaps >= 0.3 && < 0.4
|
|
|
|
-- concurrency
|
|
, atomic-primops >= 0.8 && < 0.9
|
|
, lockfree-queue >= 0.2.3 && < 0.3
|
|
|
|
-- 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
|
|
-------------------------------------------------------------------------------
|
|
|
|
test-suite test
|
|
type: exitcode-stdio-1.0
|
|
main-is: Main.hs
|
|
hs-source-dirs: test
|
|
ghc-options: -O0 -Wall -threaded -with-rtsopts=-N4
|
|
if flag(dev)
|
|
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.6
|
|
, transformers >= 0.4 && < 0.6
|
|
, mtl >= 2.2 && < 3
|
|
, exceptions >= 0.8 && < 0.11
|
|
default-language: Haskell2010
|
|
|
|
test-suite properties
|
|
type: exitcode-stdio-1.0
|
|
main-is: Prop.hs
|
|
hs-source-dirs: test
|
|
ghc-options: -O0 -Wall -threaded -with-rtsopts=-N4
|
|
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.12
|
|
, hspec >= 2.0 && < 3
|
|
default-language: Haskell2010
|
|
|
|
test-suite loops
|
|
type: exitcode-stdio-1.0
|
|
default-language: Haskell2010
|
|
main-is: loops.hs
|
|
hs-source-dirs: test
|
|
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
|
|
build-Depends:
|
|
streamly
|
|
, base >= 4.8 && < 5
|
|
, random >= 1.0.0 && < 1.2
|
|
|
|
test-suite parallel-loops
|
|
type: exitcode-stdio-1.0
|
|
default-language: Haskell2010
|
|
main-is: parallel-loops.hs
|
|
hs-source-dirs: test
|
|
build-Depends:
|
|
streamly
|
|
, base >= 4.8 && < 5
|
|
, random >= 1.0.0 && < 1.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
|
|
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.0 && < 1.5
|
|
, random >= 1.0 && < 2.0
|
|
, gauge >= 0.2.1 && < 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
|
|
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.0 && < 1.5
|
|
, random >= 1.0 && < 2.0
|
|
, gauge >= 0.2.1 && < 0.3
|
|
|
|
executable chart-linear
|
|
default-language: Haskell2010
|
|
hs-source-dirs: benchmark
|
|
main-is: ChartLinear.hs
|
|
if flag(dev)
|
|
buildable: True
|
|
build-Depends:
|
|
base >= 4.8 && < 5
|
|
, bench-graph
|
|
, split
|
|
else
|
|
buildable: False
|
|
|
|
executable chart-nested
|
|
default-language: Haskell2010
|
|
hs-source-dirs: benchmark
|
|
main-is: ChartNested.hs
|
|
if flag(dev)
|
|
buildable: True
|
|
build-Depends:
|
|
base >= 4.8 && < 5
|
|
, bench-graph
|
|
, split
|
|
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.4
|
|
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 && < 1.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
|