mirror of
https://github.com/composewell/streamly.git
synced 2024-11-11 00:53:46 +03:00
1039 lines
32 KiB
Plaintext
1039 lines
32 KiB
Plaintext
cabal-version: 2.2
|
||
name: streamly
|
||
version: 0.7.0
|
||
synopsis: Beautiful Streaming, Concurrent and Reactive Composition
|
||
description:
|
||
Streamly is a framework for writing programs in a high level, declarative
|
||
data flow programming paradigm. It provides a simple API, very close to
|
||
standard Haskell lists. A program is expressed as a composition of data
|
||
processing pipes, generally known as streams. Streams can be generated,
|
||
merged, chained, mapped, zipped, and consumed concurrently – enabling a high
|
||
level, declarative yet concurrent composition of programs. Programs can be
|
||
concurrent or non-concurrent without any significant change. Concurrency is
|
||
auto scaled based on consumption rate. Programmers do not have to be aware
|
||
of threads, locking or synchronization to write scalable concurrent programs.
|
||
Streamly provides C like performance, orders of magnitude better compared to
|
||
existing streaming libraries.
|
||
.
|
||
Streamly is designed to express the full spectrum of programs with highest
|
||
performance. Do not think that if you are writing a small and simple program
|
||
it may not be for you. It expresses a small "hello world" program with the
|
||
same efficiency, simplicity and elegance as a large scale concurrent
|
||
application. It unifies many different aspects of special purpose libraries
|
||
into a single yet simple framework.
|
||
.
|
||
Streamly covers the functionality provided by Haskell lists as well as the
|
||
functionality provided by streaming libraries like
|
||
<https://hackage.haskell.org/package/streaming streaming>,
|
||
<https://hackage.haskell.org/package/pipes pipes>, and
|
||
<https://hackage.haskell.org/package/conduit conduit> with a simpler API and
|
||
better performance. Streamly provides
|
||
advanced stream composition including various ways of appending, merging,
|
||
zipping, splitting, grouping, distributing, partitioning and unzipping of
|
||
streams with true streaming and with concurrency. 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>.
|
||
The grouping, splitting and windowing combinators in streamly can be compared
|
||
to the window operators in <https://flink.apache.org/ Apache Flink>.
|
||
However, compared to Flink streamly has a pure functional, succinct and
|
||
expressive API.
|
||
.
|
||
The concurrency capabilities of streamly are much more advanced and powerful
|
||
compared to the basic concurrency functionality provided by the
|
||
<https://hackage.haskell.org/package/async async> package. Streamly is a
|
||
first class reactive programming library. If you are familiar with
|
||
<http://reactivex.io/ Reactive Extensions> you will find that it is very
|
||
similar. For most RxJs combinators you can find or write corresponding ones
|
||
in streamly. Streamly can be used as an alternative to
|
||
<https://hackage.haskell.org/package/Yampa Yampa> or
|
||
<https://hackage.haskell.org/package/reflex reflex> as well.
|
||
.
|
||
Streamly focuses on practical engineering with high performance. From well
|
||
written streamly programs one can expect performance competitive to C. High
|
||
performance streaming eliminates the need for string and text libraries like
|
||
<https://hackage.haskell.org/package/bytestring bytestring>,
|
||
<https://hackage.haskell.org/package/text text> and their lazy and strict
|
||
flavors. The confusion and cognitive overhead arising from different
|
||
string types is eliminated. The two fundamental types in streamly are arrays
|
||
for storage and streams for processing. Strings and text are simply streams
|
||
or arrays of 'Char' as they should be. Arrays in streamly have performance
|
||
at par with the vector library.
|
||
.
|
||
Where to find more information:
|
||
.
|
||
* /Quick Overview/: <src/README.md README file> in the package
|
||
* /Building/: <src/docs/Build.md Build guide> for optimal performance
|
||
* /Detailed Tutorial/: "Streamly.Tutorial" module in the haddock documentation
|
||
* /Interoperation/: "Streamly.Tutorial" module for interop with other
|
||
streaming libraries
|
||
* /Reference Documentation/: Haddock documentation for the respective modules
|
||
* /Examples/: <src/examples examples directory> in the package
|
||
* /Guides/: <src/docs docs directory> in the package, for documentation on
|
||
advanced topics, limitations, semantics of the library or on specific use
|
||
cases.
|
||
* <https://github.com/composewell/streaming-benchmarks Streaming Benchmarks>
|
||
* <https://github.com/composewell/concurrency-benchmarks Concurrency Benchmarks>
|
||
.
|
||
For additional unreleased/experimental APIs, build the haddock docs using:
|
||
.
|
||
> $ cabal haddock --haddock-option="--show-all"
|
||
> $ stack haddock --haddock-arguments "--show-all" --no-haddock-deps
|
||
|
||
|
||
homepage: https://github.com/composewell/streamly
|
||
bug-reports: https://github.com/composewell/streamly/issues
|
||
license: BSD-3-Clause
|
||
license-file: LICENSE
|
||
tested-with: GHC==7.10.3
|
||
, GHC==8.0.2
|
||
, GHC==8.4.4
|
||
, GHC==8.6.5
|
||
, GHC==8.8.1
|
||
author: Harendra Kumar
|
||
maintainer: streamly@composewell.com
|
||
copyright: 2017 Harendra Kumar
|
||
category: Control, Concurrency, Streaming, Reactivity
|
||
stability: Experimental
|
||
build-type: Configure
|
||
|
||
extra-source-files:
|
||
Changelog.md
|
||
credits/*.md
|
||
credits/base-4.12.0.0.txt
|
||
credits/bjoern-2008-2009.txt
|
||
credits/clock-0.7.2.txt
|
||
credits/foldl-1.4.5.txt
|
||
credits/pipes-concurrency-2.0.8.txt
|
||
credits/pipes-concurrency.txt
|
||
credits/transient-0.5.5.txt
|
||
credits/vector-0.12.0.2.txt
|
||
credits/Yampa-0.10.6.2.txt
|
||
README.md
|
||
docs/streamly-vs-async.md
|
||
docs/streamly-vs-lists.md
|
||
docs/transformers.md
|
||
docs/Build.md
|
||
design/*.md
|
||
design/*.png
|
||
bench.sh
|
||
stack.yaml
|
||
src/Streamly/Streams/Instances.hs
|
||
src/Streamly/Streams/inline.hs
|
||
configure.ac
|
||
configure
|
||
src/Streamly/Internal/Data/Time/config.h.in
|
||
|
||
extra-tmp-files:
|
||
config.log
|
||
config.status
|
||
autom4te.cache
|
||
src/Streamly/Internal/Data/Time/config.h
|
||
|
||
source-repository head
|
||
type: git
|
||
location: https://github.com/composewell/streamly
|
||
|
||
flag benchmark
|
||
description: Benchmark build
|
||
manual: True
|
||
default: False
|
||
|
||
flag inspection
|
||
description: Enable inspection testing
|
||
manual: True
|
||
default: False
|
||
|
||
flag debug
|
||
description: Debug build with asserts enabled
|
||
manual: True
|
||
default: False
|
||
|
||
flag dev
|
||
description: Development build
|
||
manual: True
|
||
default: False
|
||
|
||
flag has-llvm
|
||
description: Use llvm backend for better performance
|
||
manual: True
|
||
default: False
|
||
|
||
flag no-charts
|
||
description: Disable chart generation
|
||
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
|
||
|
||
-------------------------------------------------------------------------------
|
||
-- Common stanzas
|
||
-------------------------------------------------------------------------------
|
||
|
||
common compile-options
|
||
default-language: Haskell2010
|
||
if flag(streamk)
|
||
cpp-options: -DUSE_STREAMK_ONLY
|
||
|
||
if flag(no-fusion)
|
||
cpp-options: -DDISABLE_FUSION
|
||
|
||
if flag(dev)
|
||
cpp-options: -DDEVBUILD
|
||
|
||
if flag(inspection)
|
||
cpp-options: -DINSPECTION
|
||
|
||
ghc-options: -Wall
|
||
|
||
if flag(has-llvm)
|
||
ghc-options: -fllvm
|
||
|
||
if flag(dev)
|
||
ghc-options: -Wmissed-specialisations
|
||
-Wall-missed-specialisations
|
||
|
||
if flag(dev) || flag(debug)
|
||
ghc-options: -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
|
||
|
||
common optimization-options
|
||
ghc-options: -O2
|
||
-fspec-constr-recursive=16
|
||
-fmax-worker-args=16
|
||
|
||
common threading-options
|
||
ghc-options: -threaded
|
||
-with-rtsopts=-N
|
||
|
||
-- We need optimization options here to optimize internal (non-inlined)
|
||
-- versions of functions. Also, we have some benchmarking inspection tests
|
||
-- part of the library when built with --benchmarks flag. Thos tests fail
|
||
-- if we do not use optimization options here. It was observed that due to
|
||
-- -O2 here some concurrent/nested benchmarks improved and others regressed.
|
||
-- We can investigate a bit more here why the regression occurred.
|
||
common lib-options
|
||
import: compile-options, optimization-options
|
||
|
||
-- Compilation for coverage builds on CI machines takes too long without -O0
|
||
-- XXX we should use coverage flag for that, -O0 may take too long to run tests
|
||
-- in general.
|
||
common test-options
|
||
import: compile-options, threading-options
|
||
ghc-options: -O0
|
||
-fno-ignore-asserts
|
||
|
||
-- Used by maxrate test, benchmarks and executables
|
||
common exe-options
|
||
import: compile-options, optimization-options, threading-options
|
||
|
||
-- Some benchmarks are threaded some are not
|
||
common bench-options
|
||
import: compile-options, optimization-options
|
||
ghc-options: -with-rtsopts "-T"
|
||
|
||
-------------------------------------------------------------------------------
|
||
-- Library
|
||
-------------------------------------------------------------------------------
|
||
|
||
library
|
||
import: lib-options
|
||
js-sources: jsbits/clock.js
|
||
include-dirs: src/Streamly/Internal/Data/Time
|
||
, src/Streamly/Streams
|
||
if os(windows)
|
||
c-sources: src/Streamly/Internal/Data/Time/Windows.c
|
||
if os(darwin)
|
||
c-sources: src/Streamly/Internal/Data/Time/Darwin.c
|
||
hs-source-dirs: src
|
||
other-modules:
|
||
-- Memory storage
|
||
Streamly.Memory.Malloc
|
||
, Streamly.Memory.Ring
|
||
|
||
-- Base streams
|
||
, Streamly.Internal.Data.Stream.StreamK.Type
|
||
, Streamly.Internal.Data.Stream.StreamK
|
||
, Streamly.Internal.Data.Stream.StreamDK.Type
|
||
, Streamly.Internal.Data.Stream.StreamDK
|
||
, Streamly.Internal.Data.Stream.StreamD
|
||
, Streamly.Streams.Enumeration
|
||
, Streamly.Streams.Prelude
|
||
|
||
-- Higher level streams
|
||
, Streamly.Streams.SVar
|
||
, Streamly.Streams.Serial
|
||
, Streamly.Internal.Data.Stream.Async
|
||
, Streamly.Streams.Parallel
|
||
, Streamly.Internal.Data.Stream.Ahead
|
||
, Streamly.Streams.Zip
|
||
, Streamly.Streams.Combinators
|
||
|
||
, Streamly.FileSystem.IOVec
|
||
, Streamly.FileSystem.FDIO
|
||
, Streamly.FileSystem.FD
|
||
|
||
exposed-modules: Streamly.Prelude
|
||
, Streamly
|
||
, Streamly.Data.Array
|
||
, Streamly.Data.Fold
|
||
, Streamly.Data.Unfold
|
||
, Streamly.Data.Unicode.Stream
|
||
|
||
-- IO devices
|
||
, Streamly.Memory.Array
|
||
, Streamly.FileSystem.Handle
|
||
|
||
, Streamly.Tutorial
|
||
|
||
-- Internal modules
|
||
, Streamly.Internal.Control.Monad
|
||
, Streamly.Internal.Data.Strict
|
||
, Streamly.Internal.Data.Atomics
|
||
, Streamly.Internal.Data.Time
|
||
, Streamly.Internal.Data.Time.Units
|
||
, Streamly.Internal.Data.Time.Clock
|
||
, Streamly.Internal.Data.Stream.StreamD.Type
|
||
, Streamly.Internal.Data.SVar
|
||
, Streamly.Internal.Data.Array
|
||
, Streamly.Internal.Memory.Array.Types
|
||
, Streamly.Internal.Memory.Array
|
||
, Streamly.Internal.Memory.ArrayStream
|
||
, Streamly.Internal.Data.Fold.Types
|
||
, Streamly.Internal.Data.Fold
|
||
, Streamly.Internal.Data.Sink.Types
|
||
, Streamly.Internal.Data.Sink
|
||
, Streamly.Internal.Data.Unfold.Types
|
||
, Streamly.Internal.Data.Unfold
|
||
, Streamly.Internal.Data.Pipe.Types
|
||
, Streamly.Internal.Data.Pipe
|
||
, Streamly.Internal.Data.List
|
||
, Streamly.Internal.FileSystem.Handle
|
||
, Streamly.Internal.FileSystem.Dir
|
||
, Streamly.Internal.FileSystem.File
|
||
, Streamly.Internal.Data.Unicode.Stream
|
||
, Streamly.Internal.Data.Unicode.Char
|
||
, Streamly.Internal.Memory.Unicode.Array
|
||
, Streamly.Internal.Prelude
|
||
if !impl(ghcjs)
|
||
exposed-modules:
|
||
Streamly.Network.Socket
|
||
, Streamly.Network.Inet.TCP
|
||
|
||
, Streamly.Internal.Network.Socket
|
||
, Streamly.Internal.Network.Inet.TCP
|
||
|
||
if flag(benchmark)
|
||
exposed-modules:
|
||
Streamly.Internal.Benchmark.FileIO.Array
|
||
, Streamly.Internal.Benchmark.FileIO.Stream
|
||
, Streamly.Internal.Benchmark.Prelude
|
||
|
||
build-depends: base >= 4.8 && < 5
|
||
, ghc-prim >= 0.2 && < 0.6
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, containers >= 0.5.8.2 && < 0.7
|
||
, heaps >= 0.3 && < 0.4
|
||
, directory >= 1.3 && < 1.4
|
||
, primitive >= 0.6.4.0 && < 0.8
|
||
|
||
-- 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 flag(inspection)
|
||
build-depends: template-haskell >= 2.14 && < 2.16
|
||
, inspection-testing >= 0.4 && < 0.5
|
||
|
||
if !impl(ghcjs)
|
||
build-depends:
|
||
network >= 2.6 && < 4
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
semigroups >= 0.18 && < 0.19
|
||
|
||
-------------------------------------------------------------------------------
|
||
-- Test suites
|
||
-------------------------------------------------------------------------------
|
||
|
||
test-suite test
|
||
import: test-options
|
||
type: exitcode-stdio-1.0
|
||
main-is: Main.hs
|
||
js-sources: jsbits/clock.js
|
||
hs-source-dirs: test
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, hspec >= 2.0 && < 3
|
||
, containers >= 0.5.8.2 && < 0.7
|
||
, transformers >= 0.4 && < 0.6
|
||
, mtl >= 2.2 && < 3
|
||
, exceptions >= 0.8 && < 0.11
|
||
default-language: Haskell2010
|
||
|
||
test-suite pure-streams-base
|
||
import: test-options
|
||
type: exitcode-stdio-1.0
|
||
main-is: PureStreams.hs
|
||
hs-source-dirs: test
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, hspec >= 2.0 && < 3
|
||
default-language: Haskell2010
|
||
|
||
test-suite pure-streams-streamly
|
||
import: test-options
|
||
type: exitcode-stdio-1.0
|
||
main-is: PureStreams.hs
|
||
hs-source-dirs: test
|
||
cpp-options: -DUSE_STREAMLY_LIST
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, hspec >= 2.0 && < 3
|
||
default-language: Haskell2010
|
||
|
||
test-suite properties
|
||
import: test-options
|
||
type: exitcode-stdio-1.0
|
||
main-is: Prop.hs
|
||
js-sources: jsbits/clock.js
|
||
hs-source-dirs: test
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, QuickCheck >= 2.10 && < 2.14
|
||
, hspec >= 2.0 && < 3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
default-language: Haskell2010
|
||
|
||
test-suite array-test
|
||
import: test-options
|
||
type: exitcode-stdio-1.0
|
||
main-is: Arrays.hs
|
||
js-sources: jsbits/clock.js
|
||
hs-source-dirs: test
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, QuickCheck >= 2.10 && < 2.14
|
||
, hspec >= 2.0 && < 3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
default-language: Haskell2010
|
||
|
||
test-suite unpinned-array-test
|
||
import: test-options
|
||
type: exitcode-stdio-1.0
|
||
main-is: Streamly/Test/Data/Array.hs
|
||
js-sources: jsbits/clock.js
|
||
hs-source-dirs: test
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, QuickCheck >= 2.10 && < 2.14
|
||
, hspec >= 2.0 && < 3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
default-language: Haskell2010
|
||
|
||
test-suite string-test
|
||
import: test-options
|
||
type: exitcode-stdio-1.0
|
||
main-is: String.hs
|
||
js-sources: jsbits/clock.js
|
||
hs-source-dirs: test
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, QuickCheck >= 2.10 && < 2.14
|
||
, hspec >= 2.0 && < 3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
default-language: Haskell2010
|
||
|
||
test-suite maxrate
|
||
import: exe-options
|
||
type: exitcode-stdio-1.0
|
||
default-language: Haskell2010
|
||
main-is: MaxRate.hs
|
||
js-sources: jsbits/clock.js
|
||
hs-source-dirs: test
|
||
if flag(dev)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, clock >= 0.7.1 && < 0.9
|
||
, hspec >= 2.0 && < 3
|
||
, random >= 1.0.0 && < 2
|
||
else
|
||
buildable: False
|
||
|
||
test-suite loops
|
||
import: test-options
|
||
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
|
||
import: test-options
|
||
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 && < 2
|
||
|
||
test-suite parallel-loops
|
||
import: test-options
|
||
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 && < 2
|
||
|
||
-------------------------------------------------------------------------------
|
||
-- Benchmarks
|
||
-------------------------------------------------------------------------------
|
||
|
||
benchmark linear
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
hs-source-dirs: benchmark
|
||
main-is: Linear.hs
|
||
if flag(benchmark)
|
||
buildable: True
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, random >= 1.0 && < 2.0
|
||
, gauge >= 0.2.4 && < 0.3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
else
|
||
buildable: False
|
||
|
||
benchmark linear-async
|
||
import: bench-options
|
||
cpp-options: -DLINEAR_ASYNC
|
||
type: exitcode-stdio-1.0
|
||
hs-source-dirs: benchmark
|
||
main-is: LinearAsync.hs
|
||
if flag(benchmark)
|
||
buildable: True
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, random >= 1.0 && < 2.0
|
||
, gauge >= 0.2.4 && < 0.3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
else
|
||
buildable: False
|
||
|
||
benchmark linear-rate
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
hs-source-dirs: benchmark
|
||
main-is: LinearRate.hs
|
||
if flag(benchmark)
|
||
buildable: True
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, random >= 1.0 && < 2.0
|
||
, gauge >= 0.2.4 && < 0.3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
else
|
||
buildable: False
|
||
|
||
benchmark nested
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
hs-source-dirs: benchmark
|
||
main-is: Nested.hs
|
||
other-modules: NestedOps
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, random >= 1.0 && < 2.0
|
||
, gauge >= 0.2.4 && < 0.3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
|
||
benchmark nestedUnfold
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
hs-source-dirs: benchmark
|
||
main-is: NestedUnfold.hs
|
||
other-modules: NestedUnfoldOps
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, random >= 1.0 && < 2.0
|
||
, gauge >= 0.2.4 && < 0.3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
|
||
benchmark unpinned-array
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
hs-source-dirs: benchmark
|
||
main-is: Streamly/Benchmark/Data/Array.hs
|
||
other-modules: Streamly.Benchmark.Data.ArrayOps
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, random >= 1.0 && < 2.0
|
||
, gauge >= 0.2.4 && < 0.3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
|
||
benchmark array
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
hs-source-dirs: benchmark
|
||
main-is: Array.hs
|
||
other-modules: ArrayOps
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, random >= 1.0 && < 2.0
|
||
, gauge >= 0.2.4 && < 0.3
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
|
||
benchmark fileio
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
-- A value of 400 works better for some benchmarks, however, it takes
|
||
-- extraordinary amount of time to compile with that.
|
||
-- ghc-options: -funfolding-use-threshold=150
|
||
hs-source-dirs: benchmark
|
||
main-is: FileIO.hs
|
||
if flag(benchmark)
|
||
buildable: True
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, gauge >= 0.2.4 && < 0.3
|
||
, typed-process >= 0.2.3 && < 0.3
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
else
|
||
buildable: False
|
||
|
||
benchmark concurrent
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
hs-source-dirs: benchmark
|
||
main-is: Concurrent.hs
|
||
if flag(dev)
|
||
buildable: True
|
||
build-depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, gauge >= 0.2.4 && < 0.3
|
||
else
|
||
buildable: False
|
||
|
||
-------------------------------------------------------------------------------
|
||
-- 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
|
||
import: bench-options
|
||
type: exitcode-stdio-1.0
|
||
include-dirs: src/Streamly/Internal/Data/Time
|
||
, src/Streamly/Streams
|
||
if os(windows)
|
||
c-sources: src/Streamly/Internal/Data/Time/Windows.c
|
||
if os(darwin)
|
||
c-sources: src/Streamly/Internal/Data/Time/Darwin.c
|
||
hs-source-dirs: benchmark, src
|
||
main-is: BaseStreams.hs
|
||
other-modules: Streamly.Internal.Data.Atomics
|
||
, Streamly.Internal.Data.Stream.StreamD.Type
|
||
, Streamly.Internal.Data.SVar
|
||
, Streamly.Internal.Data.Time.Units
|
||
, Streamly.Internal.Data.Time.Clock
|
||
, Streamly.Internal.Data.Stream.StreamDK.Type
|
||
, Streamly.Internal.Data.Stream.StreamDK
|
||
, Streamly.Internal.Data.Stream.StreamK.Type
|
||
, Streamly.Internal.Data.Stream.StreamK
|
||
, Streamly.Internal.Data.Stream.StreamD
|
||
, Streamly.Streams.Prelude
|
||
, Streamly.FileSystem.IOVec
|
||
|
||
, StreamDOps
|
||
, StreamKOps
|
||
, StreamDKOps
|
||
|
||
if flag(dev)
|
||
buildable: True
|
||
build-depends:
|
||
base >= 4.8 && < 5
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, random >= 1.0 && < 2.0
|
||
, gauge >= 0.2.4 && < 0.3
|
||
|
||
, ghc-prim >= 0.2 && < 0.6
|
||
, containers >= 0.5.8.2 && < 0.7
|
||
, heaps >= 0.3 && < 0.4
|
||
|
||
-- concurrency
|
||
, atomic-primops >= 0.8 && < 0.9
|
||
, lockfree-queue >= 0.2.3 && < 0.3
|
||
|
||
, 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
|
||
import: bench-options
|
||
hs-source-dirs: benchmark, src
|
||
include-dirs: src/Streamly/Internal/Data/Time
|
||
, src/Streamly/Streams
|
||
if os(windows)
|
||
c-sources: src/Streamly/Internal/Data/Time/Windows.c
|
||
if os(darwin)
|
||
c-sources: src/Streamly/Internal/Data/Time/Darwin.c
|
||
main-is: NanoBenchmarks.hs
|
||
other-modules: Streamly.Internal.Data.Atomics
|
||
, Streamly.Internal.Data.Stream.StreamD.Type
|
||
, Streamly.Internal.Data.SVar
|
||
, Streamly.Internal.Data.Time.Units
|
||
, Streamly.Internal.Data.Time.Clock
|
||
, Streamly.Internal.Data.Stream.StreamK.Type
|
||
, Streamly.Internal.Data.Stream.StreamK
|
||
, Streamly.FileSystem.IOVec
|
||
, Streamly.Internal.Data.Stream.StreamD
|
||
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.8.2 && < 0.7
|
||
, deepseq >= 1.4.1 && < 1.5
|
||
, heaps >= 0.3 && < 0.4
|
||
, random >= 1.0 && < 2.0
|
||
|
||
-- concurrency
|
||
, atomic-primops >= 0.8 && < 0.9
|
||
, lockfree-queue >= 0.2.3 && < 0.3
|
||
|
||
, 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
|
||
else
|
||
buildable: False
|
||
|
||
executable adaptive
|
||
import: bench-options
|
||
hs-source-dirs: benchmark
|
||
main-is: Adaptive.hs
|
||
default-language: Haskell2010
|
||
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
|
||
ghc-options: -Wall
|
||
hs-source-dirs: benchmark
|
||
main-is: Chart.hs
|
||
if flag(dev) && !flag(no-charts) && !impl(ghcjs)
|
||
buildable: True
|
||
build-Depends:
|
||
base >= 4.8 && < 5
|
||
, bench-show >= 0.3 && < 0.4
|
||
, split
|
||
, transformers >= 0.4 && < 0.6
|
||
else
|
||
buildable: False
|
||
|
||
-------------------------------------------------------------------------------
|
||
-- Examples
|
||
-------------------------------------------------------------------------------
|
||
|
||
executable SearchQuery
|
||
import: exe-options
|
||
main-is: SearchQuery.hs
|
||
hs-source-dirs: examples
|
||
if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, http-conduit >= 2.2.2 && < 2.4
|
||
else
|
||
buildable: False
|
||
|
||
executable ListDir
|
||
import: exe-options
|
||
main-is: ListDir.hs
|
||
hs-source-dirs: examples
|
||
if flag(examples) || flag(examples-sdl)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, directory >= 1.3 && < 1.4
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
else
|
||
buildable: False
|
||
|
||
executable MergeSort
|
||
import: exe-options
|
||
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
|
||
import: exe-options
|
||
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
|
||
import: exe-options
|
||
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
|
||
import: exe-options
|
||
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
|
||
|
||
executable HandleIO
|
||
import: exe-options
|
||
main-is: HandleIO.hs
|
||
hs-source-dirs: examples
|
||
if flag(examples) || flag(examples-sdl)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
else
|
||
buildable: False
|
||
|
||
executable FileIOExamples
|
||
import: exe-options
|
||
main-is: FileIOExamples.hs
|
||
hs-source-dirs: examples
|
||
if flag(examples) || flag(examples-sdl)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
else
|
||
buildable: False
|
||
|
||
executable EchoServer
|
||
import: exe-options
|
||
main-is: EchoServer.hs
|
||
hs-source-dirs: examples
|
||
if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, network >= 2.6 && < 4
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
else
|
||
buildable: False
|
||
|
||
executable FileSinkServer
|
||
import: exe-options
|
||
main-is: FileSinkServer.hs
|
||
hs-source-dirs: examples
|
||
if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, network >= 2.6 && < 4
|
||
if impl(ghc < 8.0)
|
||
build-depends:
|
||
transformers >= 0.4 && < 0.6
|
||
else
|
||
buildable: False
|
||
|
||
executable FromFileClient
|
||
import: exe-options
|
||
main-is: FromFileClient.hs
|
||
hs-source-dirs: examples
|
||
if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
else
|
||
buildable: False
|
||
|
||
executable WordClassifier
|
||
import: exe-options
|
||
main-is: WordClassifier.hs
|
||
hs-source-dirs: examples
|
||
if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, hashable >= 1.2 && < 1.4
|
||
, unordered-containers >= 0.2 && < 0.3
|
||
else
|
||
buildable: False
|
||
|
||
executable WordCount
|
||
import: exe-options
|
||
main-is: WordCount.hs
|
||
hs-source-dirs: examples
|
||
if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
, vector >= 0.12 && < 0.13
|
||
else
|
||
buildable: False
|
||
|
||
executable CamelCase
|
||
import: exe-options
|
||
main-is: CamelCase.hs
|
||
hs-source-dirs: examples
|
||
if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
|
||
buildable: True
|
||
build-Depends:
|
||
streamly
|
||
, base >= 4.8 && < 5
|
||
else
|
||
buildable: False
|