mirror of
https://github.com/composewell/streamly.git
synced 2024-08-16 15:00:25 +03:00
Basically remove depdency on GHC rewrite rules. The reason for separating StreamD and StreamK instead of using rewrite rules: * Separate types provide better reasoning for the programmer about performance. Each type has its own pros and cons and the programmer can choose the best one based on the use case. * rewrite rules are fragile, led to broken performance in the past dues to change in GHC. * Rewrite rules lead to optimization problems, blocking fusion in some cases, specifically when combining multiple operations e.g. (filter . drop). * Rewrite rules lead to problems when calling a function recursively. For example, the StreamD version of foldBreak cannot be used recursively when wrapped in rewrite rules because each recursive call adds a roundtrip conversion from D to K and back to D. We can use the StreamK versions of these though because the rewrite rule gets eliminated in that case. * If we have a unified module, we need two different versions of several operations e.g. appendK and appendD, both are useful in different cases.
533 lines
19 KiB
Plaintext
533 lines
19 KiB
Plaintext
cabal-version: 2.2
|
|
name: streamly
|
|
version: 0.9.0
|
|
synopsis: Streaming, dataflow programming and declarative concurrency
|
|
description:
|
|
Streamly comprises two packages, the
|
|
<https://hackage.haskell.org/package/streamly-core streamly-core> package
|
|
provides functionality that depends only on boot libraries, and
|
|
the <https://hackage.haskell.org/package/streamly streamly> package
|
|
provides additional functionality like concurrency, time, lifted
|
|
exceptions, and networking. For unified documentation visit
|
|
<https://streamly.composewell.com the streamly website>.
|
|
.
|
|
Streamly provides unified, modular building blocks to build
|
|
high-performance, concurrent, scalable applications in Haskell. Stream
|
|
fusion optimizations in streamly enable exceptional modularity with
|
|
high performance comparable to C. Streamly complements the Haskell
|
|
<https://hackage.haskell.org/package/base base> package, supplying the
|
|
missing functionality to quickly build general-purpose applications
|
|
in Haskell. For high-level functionality built over streamly like
|
|
streaming system processes, shell programming, GNU coreutils,
|
|
statistics, and compression libraries please see the
|
|
<https://streamly.composewell.com/ecosystem.html streamly ecosystem packages>.
|
|
.
|
|
Performance with modularity:
|
|
.
|
|
* Performance on par with C (<https://github.com/composewell/streaming-benchmarks Benchmarks>)
|
|
* API close to standard Haskell lists (<https://github.com/composewell/streamly-examples Examples>)
|
|
* Declarative concurrency with automatic scaling
|
|
* Filesystem, fsnotify, network, and Unicode support included
|
|
* More functionality is provided via many (<https://streamly.composewell.com/ecosystem.html ecosystem packages>)
|
|
.
|
|
Unified and powerful abstractions:
|
|
.
|
|
* Unifies streams, arrays, folds, and parsers
|
|
* Unifies @Data.List@, @list-t@, and @logict@ with streaming
|
|
* Unifies concurrency with standard streaming abstractions
|
|
* Unifies reactive, time-domain programming with streaming
|
|
* Interworks with other streaming libraries
|
|
|
|
homepage: https://streamly.composewell.com
|
|
bug-reports: https://github.com/composewell/streamly/issues
|
|
license: BSD-3-Clause
|
|
license-file: LICENSE
|
|
tested-with: GHC==8.6.5
|
|
, GHC==8.8.4
|
|
, GHC==8.10.7
|
|
, GHC==9.0.2
|
|
, GHC==9.2.4
|
|
, GHC==9.4.2
|
|
author: Composewell Technologies
|
|
maintainer: streamly@composewell.com
|
|
copyright: 2017 Composewell Technologies
|
|
category:
|
|
Streamly, Concurrency, Streaming, Dataflow, Pipes, Reactivity, List,
|
|
Logic, Non-determinism, Parsing, Array, Time, Unicode, Filesystem,
|
|
Network
|
|
stability: Stable
|
|
build-type: Configure
|
|
|
|
extra-source-files:
|
|
benchmark/*.hs
|
|
benchmark/bench-runner/Main.hs
|
|
benchmark/bench-runner/bench-runner.cabal
|
|
benchmark/Streamly/Benchmark/Data/*.hs
|
|
benchmark/Streamly/Benchmark/Data/Array/Common.hs
|
|
benchmark/Streamly/Benchmark/Data/Array/CommonImports.hs
|
|
benchmark/Streamly/Benchmark/Data/Array/Generic.hs
|
|
benchmark/Streamly/Benchmark/Data/Array/SmallArray.hs
|
|
benchmark/Streamly/Benchmark/Data/Array.hs
|
|
benchmark/Streamly/Benchmark/Data/Ring/Unboxed.hs
|
|
benchmark/Streamly/Benchmark/Data/Array/Mut.hs
|
|
benchmark/Streamly/Benchmark/Data/Array/Stream.hs
|
|
benchmark/Streamly/Benchmark/Data/Fold/Window.hs
|
|
benchmark/Streamly/Benchmark/Data/Parser/*.hs
|
|
benchmark/Streamly/Benchmark/Data/Stream/*.hs
|
|
benchmark/Streamly/Benchmark/FileSystem/*.hs
|
|
benchmark/Streamly/Benchmark/FileSystem/Handle/*.hs
|
|
benchmark/Streamly/Benchmark/Prelude/*.hs
|
|
benchmark/Streamly/Benchmark/Unicode/*.hs
|
|
benchmark/lib/Streamly/Benchmark/*.hs
|
|
benchmark/lib/Streamly/Benchmark/Common/*.hs
|
|
benchmark/streamly-benchmarks.cabal
|
|
bin/mk-hscope.sh
|
|
bin/mk-tags.sh
|
|
configure
|
|
configure.ac
|
|
docs/*.hs
|
|
docs/streamly-docs.cabal
|
|
targets/streamly-targets.cabal
|
|
targets/Targets.hs
|
|
test/test-runner/Main.hs
|
|
test/test-runner/test-runner.cabal
|
|
|
|
-- This is duplicated
|
|
src/Streamly/Internal/Data/Stream/Instances.hs
|
|
src/Streamly/Internal/Data/Array/ArrayMacros.h
|
|
|
|
src/Streamly/Internal/FileSystem/Event/Darwin.h
|
|
src/assert.hs
|
|
src/config.h.in
|
|
src/inline.hs
|
|
test/Streamly/Test/Data/*.hs
|
|
test/Streamly/Test/Data/Array/CommonImports.hs
|
|
test/Streamly/Test/Data/Array/Common.hs
|
|
test/Streamly/Test/Data/Array/Generic.hs
|
|
test/Streamly/Test/Data/Array.hs
|
|
test/Streamly/Test/Data/Array/Mut.hs
|
|
test/Streamly/Test/Data/Ring/Unboxed.hs
|
|
test/Streamly/Test/Data/Array/Stream.hs
|
|
test/Streamly/Test/Data/Parser/ParserD.hs
|
|
test/Streamly/Test/Data/Parser/Chunked.hs
|
|
test/Streamly/Test/Data/Stream/Concurrent.hs
|
|
test/Streamly/Test/FileSystem/Event.hs
|
|
test/Streamly/Test/FileSystem/Event/Common.hs
|
|
test/Streamly/Test/FileSystem/Event/Darwin.hs
|
|
test/Streamly/Test/FileSystem/Event/Windows.hs
|
|
test/Streamly/Test/FileSystem/Event/Linux.hs
|
|
test/Streamly/Test/FileSystem/Handle.hs
|
|
test/Streamly/Test/Network/Socket.hs
|
|
test/Streamly/Test/Network/Inet/TCP.hs
|
|
test/Streamly/Test/Prelude.hs
|
|
test/Streamly/Test/Prelude/*.hs
|
|
test/Streamly/Test/Unicode/*.hs
|
|
test/Streamly/Test/Data/Fold/*.hs
|
|
test/lib/Streamly/Test/Common.hs
|
|
test/lib/Streamly/Test/Prelude/Common.hs
|
|
test/streamly-tests.cabal
|
|
test/version-bounds.hs
|
|
test/Streamly/Test/Unicode/ucd/NormalizationTest.txt
|
|
test/Streamly/Test/Unicode/extra/NormalizationTest.txt
|
|
test/Streamly/Test/Data/Unbox.hs
|
|
benchmark/Streamly/Benchmark/Unicode/data/AllChars.txt
|
|
benchmark/Streamly/Benchmark/Unicode/data/Devanagari.txt
|
|
benchmark/Streamly/Benchmark/Unicode/data/Japanese.txt
|
|
benchmark/Streamly/Benchmark/Unicode/data/Vietnamese.txt
|
|
benchmark/Streamly/Benchmark/Unicode/data/Deutsch.txt
|
|
benchmark/Streamly/Benchmark/Unicode/data/English.txt
|
|
benchmark/Streamly/Benchmark/Unicode/data/Korean.txt
|
|
|
|
extra-doc-files:
|
|
CONTRIBUTING.md
|
|
CHANGELOG.md
|
|
README.md
|
|
benchmark/README.md
|
|
docs/Developer/Benchmarks.md
|
|
docs/Developer/*.png
|
|
docs/Developer/*.md
|
|
docs/Developer/*.rst
|
|
docs/Developer/*.png
|
|
docs/Developer/*.md
|
|
docs/Developer/*.rst
|
|
docs/Developer/*.link
|
|
docs/User/*.md
|
|
docs/User/Tutorials/*.md
|
|
docs/User/Tutorials/*.link
|
|
docs/User/Tutorials/*.hs
|
|
docs/User/HowTo/*.md
|
|
docs/User/HowTo/*.link
|
|
docs/User/HowTo/*.svg
|
|
docs/User/Explanatory/*.md
|
|
docs/User/Explanatory/streaming-pradigms.rst
|
|
docs/User/ProjectRelated/*.md
|
|
docs/User/ProjectRelated/*.link
|
|
docs/User/ProjectRelated/API-changelog.txt
|
|
test/README.md
|
|
docs/Developer/Tests.md
|
|
|
|
extra-tmp-files:
|
|
config.log
|
|
config.status
|
|
autom4te.cache
|
|
src/config.h
|
|
|
|
source-repository head
|
|
type: git
|
|
location: https://github.com/composewell/streamly
|
|
|
|
flag fusion-plugin
|
|
description: Use fusion plugin for benchmarks and executables
|
|
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 code generation
|
|
manual: True
|
|
default: False
|
|
|
|
flag opt
|
|
description: off=GHC default, on=-O2
|
|
manual: True
|
|
default: True
|
|
|
|
flag limit-build-mem
|
|
description: Limits memory when building
|
|
manual: True
|
|
default: False
|
|
|
|
flag use-unliftio
|
|
description: Use unliftio-core instead of monad-control
|
|
manual: True
|
|
default: False
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Common stanzas
|
|
-------------------------------------------------------------------------------
|
|
|
|
common compile-options
|
|
default-language: Haskell2010
|
|
|
|
if os(darwin)
|
|
cpp-options: -DCABAL_OS_DARWIN
|
|
|
|
if os(linux)
|
|
cpp-options: -DCABAL_OS_LINUX
|
|
|
|
if os(windows)
|
|
cpp-options: -DCABAL_OS_WINDOWS
|
|
|
|
if flag(dev)
|
|
cpp-options: -DDEVBUILD
|
|
|
|
if flag(inspection)
|
|
cpp-options: -DINSPECTION
|
|
|
|
ghc-options: -Weverything
|
|
-Wno-implicit-prelude
|
|
-Wno-missing-deriving-strategies
|
|
-Wno-missing-exported-signatures
|
|
-Wno-missing-import-lists
|
|
-Wno-missing-local-signatures
|
|
-Wno-missing-safe-haskell-mode
|
|
-Wno-missed-specialisations
|
|
-Wno-all-missed-specialisations
|
|
-Wno-monomorphism-restriction
|
|
-Wno-prepositive-qualified-module
|
|
-Wno-unsafe
|
|
-Rghc-timing
|
|
|
|
if impl(ghc >= 9.2)
|
|
ghc-options:
|
|
-Wno-missing-kind-signatures
|
|
-Wno-redundant-bang-patterns
|
|
-Wno-operator-whitespace
|
|
|
|
if flag(has-llvm)
|
|
ghc-options: -fllvm
|
|
|
|
if flag(dev)
|
|
ghc-options: -Wmissed-specialisations
|
|
-Wall-missed-specialisations
|
|
|
|
if flag(limit-build-mem)
|
|
ghc-options: +RTS -M1000M -RTS
|
|
|
|
if flag(use-unliftio)
|
|
cpp-options: -DUSE_UNLIFTIO
|
|
|
|
common default-extensions
|
|
default-extensions:
|
|
BangPatterns
|
|
CApiFFI
|
|
CPP
|
|
ConstraintKinds
|
|
DeriveDataTypeable
|
|
DeriveGeneric
|
|
DeriveTraversable
|
|
ExistentialQuantification
|
|
FlexibleContexts
|
|
FlexibleInstances
|
|
GeneralizedNewtypeDeriving
|
|
InstanceSigs
|
|
KindSignatures
|
|
LambdaCase
|
|
MagicHash
|
|
MultiParamTypeClasses
|
|
PatternSynonyms
|
|
RankNTypes
|
|
RecordWildCards
|
|
ScopedTypeVariables
|
|
TupleSections
|
|
TypeApplications
|
|
TypeFamilies
|
|
TypeOperators
|
|
ViewPatterns
|
|
|
|
-- MonoLocalBinds, enabled by TypeFamilies, causes performance
|
|
-- regressions. Disable it. This must come after TypeFamilies,
|
|
-- otherwise TypeFamilies will enable it again.
|
|
NoMonoLocalBinds
|
|
|
|
-- UndecidableInstances -- Does not show any perf impact
|
|
-- UnboxedTuples -- interferes with (#.)
|
|
|
|
common optimization-options
|
|
if flag(opt)
|
|
ghc-options: -O2
|
|
-fdicts-strict
|
|
-fspec-constr-recursive=16
|
|
-fmax-worker-args=16
|
|
|
|
-- For this to be effective it must come after the -O2 option
|
|
if flag(dev) || flag(debug) || !flag(opt)
|
|
ghc-options: -fno-ignore-asserts
|
|
|
|
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, default-extensions
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Library
|
|
-------------------------------------------------------------------------------
|
|
|
|
library
|
|
import: lib-options
|
|
|
|
if impl(ghc >= 8.6)
|
|
default-extensions: QuantifiedConstraints
|
|
|
|
include-dirs:
|
|
src
|
|
, src/Streamly/Internal/Data/Stream
|
|
, src/Streamly/Internal/Data/Array
|
|
|
|
hs-source-dirs: src
|
|
exposed-modules:
|
|
-- Internal modules, listed roughly in bottom up
|
|
-- dependency order To view dependency graph:
|
|
-- graphmod | dot -Tps > deps.ps
|
|
|
|
Streamly.Internal.Data.IsMap.HashMap
|
|
, Streamly.Internal.Data.Cont
|
|
, Streamly.Internal.Data.Stream.MkType
|
|
|
|
-- streamly-concurrent
|
|
, Streamly.Internal.Control.Concurrent
|
|
, Streamly.Internal.Control.ForkLifted
|
|
, Streamly.Internal.Data.Atomics
|
|
, Streamly.Internal.Data.IOFinalizer.Lifted
|
|
, Streamly.Internal.Data.Stream.Channel.Types
|
|
, Streamly.Internal.Data.Stream.Channel.Dispatcher
|
|
, Streamly.Internal.Data.Stream.Channel.Worker
|
|
|
|
, Streamly.Internal.Data.Unfold.Exception
|
|
, Streamly.Internal.Data.Fold.Concurrent.Channel.Type
|
|
, Streamly.Internal.Data.Fold.Concurrent.Channel
|
|
, Streamly.Internal.Data.Fold.Concurrent
|
|
, Streamly.Data.Fold.Tee
|
|
|
|
, Streamly.Internal.Data.Stream.Concurrent.Channel.Type
|
|
, Streamly.Internal.Data.Stream.Concurrent.Channel.Dispatcher
|
|
, Streamly.Internal.Data.Stream.Concurrent.Channel.Consumer
|
|
, Streamly.Internal.Data.Stream.Concurrent.Channel.Append
|
|
, Streamly.Internal.Data.Stream.Concurrent.Channel.Interleave
|
|
, Streamly.Internal.Data.Stream.Concurrent.Channel.Operations
|
|
, Streamly.Internal.Data.Stream.Concurrent.Channel
|
|
, Streamly.Internal.Data.Stream.Concurrent
|
|
, Streamly.Internal.Data.Stream.Zip.Concurrent
|
|
, Streamly.Internal.Data.Stream.Time
|
|
, Streamly.Internal.Data.Stream.Exception.Lifted
|
|
|
|
-- streamly-unicode (depends on unicode-data)
|
|
, Streamly.Internal.Unicode.Utf8
|
|
, Streamly.Internal.Unicode.Char
|
|
|
|
-- streamly-network
|
|
, Streamly.Internal.Network.Socket
|
|
, Streamly.Internal.Network.Inet.TCP
|
|
|
|
-- Exposed modules
|
|
, Streamly.Data.Stream.MkType
|
|
, Streamly.Data.Stream.Prelude
|
|
|
|
-- Network/IO
|
|
, Streamly.Network.Socket
|
|
, Streamly.Network.Inet.TCP
|
|
|
|
-- Deprecated
|
|
, Streamly
|
|
, Streamly.Data.Unicode.Stream
|
|
, Streamly.Memory.Array
|
|
, Streamly.Data.Array.Foreign
|
|
, Streamly.Prelude
|
|
|
|
-- Deprecated Internal modules
|
|
, Streamly.Internal.Data.SVar.Worker
|
|
, Streamly.Internal.Data.SVar.Dispatch
|
|
, Streamly.Internal.Data.SVar.Pull
|
|
, Streamly.Internal.Data.SVar
|
|
|
|
, Streamly.Internal.Data.Unfold.SVar
|
|
, Streamly.Internal.Data.Fold.SVar
|
|
, Streamly.Internal.Data.Fold.Async
|
|
, Streamly.Internal.Data.Stream.SVar.Generate
|
|
, Streamly.Internal.Data.Stream.SVar.Eliminate
|
|
|
|
, Streamly.Internal.Data.Stream.Serial
|
|
, Streamly.Internal.Data.Stream.Zip
|
|
, Streamly.Internal.Data.Stream.Async
|
|
, Streamly.Internal.Data.Stream.Parallel
|
|
, Streamly.Internal.Data.Stream.Ahead
|
|
, Streamly.Internal.Data.Stream.ZipAsync
|
|
|
|
, Streamly.Internal.Data.Stream.IsStream.Type
|
|
, Streamly.Internal.Data.Stream.IsStream.Combinators
|
|
, Streamly.Internal.Data.Stream.IsStream.Common
|
|
, Streamly.Internal.Data.Stream.IsStream.Enumeration
|
|
, Streamly.Internal.Data.Stream.IsStream.Generate
|
|
, Streamly.Internal.Data.Stream.IsStream.Eliminate
|
|
, Streamly.Internal.Data.Stream.IsStream.Transform
|
|
, Streamly.Internal.Data.Stream.IsStream.Expand
|
|
, Streamly.Internal.Data.Stream.IsStream.Reduce
|
|
, Streamly.Internal.Data.Stream.IsStream.Exception
|
|
, Streamly.Internal.Data.Stream.IsStream.Lift
|
|
, Streamly.Internal.Data.Stream.IsStream.Top
|
|
, Streamly.Internal.Data.Stream.IsStream
|
|
|
|
if !impl(ghcjs) && flag(dev)
|
|
exposed-modules:
|
|
Streamly.Internal.System.IOVec.Type
|
|
, Streamly.Internal.System.IOVec
|
|
, Streamly.Internal.FileSystem.FDIO
|
|
, Streamly.Internal.FileSystem.FD
|
|
|
|
if flag(dev)
|
|
exposed-modules: Streamly.Data.SmallArray
|
|
, Streamly.Internal.Data.SmallArray
|
|
, Streamly.Internal.Data.SmallArray.Type
|
|
|
|
if os(windows)
|
|
exposed-modules: Streamly.Internal.FileSystem.Event.Windows
|
|
|
|
if os(darwin)
|
|
include-dirs: src/Streamly/Internal
|
|
c-sources: src/Streamly/Internal/FileSystem/Event/Darwin.m
|
|
exposed-modules: Streamly.Internal.FileSystem.Event.Darwin
|
|
|
|
if os(linux)
|
|
exposed-modules: Streamly.Internal.FileSystem.Event.Linux
|
|
|
|
if os(linux) || os(darwin) || os(windows)
|
|
exposed-modules: Streamly.Internal.FileSystem.Event
|
|
|
|
other-modules:
|
|
Streamly.Data.Stream.Exception
|
|
, Streamly.Data.Stream.Concurrent
|
|
, Streamly.Data.Stream.Time
|
|
|
|
build-depends:
|
|
-- Core libraries shipped with ghc, the min and max
|
|
-- constraints of these libraries should match with
|
|
-- the GHC versions we support. This is to make sure that
|
|
-- packages depending on the "ghc" package (packages
|
|
-- depending on doctest is a common example) can
|
|
-- depend on streamly.
|
|
base >= 4.12 && < 4.18
|
|
, containers >= 0.6.0 && < 0.7
|
|
, deepseq >= 1.4.4 && < 1.5
|
|
, exceptions >= 0.8.0 && < 0.11
|
|
, mtl >= 2.2.2 && < 2.4
|
|
, transformers >= 0.5.5 && < 0.7
|
|
, template-haskell >= 2.14 && < 2.20
|
|
|
|
-- The core streamly package
|
|
, streamly-core == 0.1.0
|
|
|
|
, hashable >= 1.3 && < 1.5
|
|
, unordered-containers >= 0.2 && < 0.3
|
|
|
|
-- XXX to be removed
|
|
, transformers-base >= 0.4 && < 0.5
|
|
, heaps >= 0.3 && < 0.5
|
|
|
|
-- concurrency
|
|
, atomic-primops >= 0.8 && < 0.9
|
|
, lockfree-queue >= 0.2.4 && < 0.3
|
|
|
|
, unicode-data >= 0.1 && < 0.5
|
|
|
|
-- Network
|
|
, network >= 2.6 && < 3.2
|
|
|
|
if flag(use-unliftio)
|
|
build-depends: unliftio-core >= 0.2 && < 0.3
|
|
else
|
|
build-depends: monad-control >= 1.0 && < 1.1
|
|
|
|
if flag(dev)
|
|
build-depends: primitive >= 0.5.4 && < 0.8
|
|
|
|
-- For FileSystem.Event module
|
|
if os(linux)
|
|
build-depends: directory >= 1.2.2 && < 1.4
|
|
|
|
if os(windows)
|
|
build-depends: Win32 >= 2.6 && < 2.13
|
|
|
|
if os(darwin)
|
|
build-depends: directory >= 1.2.2 && < 1.4
|
|
frameworks: Cocoa
|
|
|
|
if flag(inspection)
|
|
build-depends: inspection-testing >= 0.4 && < 0.5
|
|
|
|
-- Array uses a Storable constraint in dev build making several inspection
|
|
-- tests fail
|
|
if flag(dev) && flag(inspection)
|
|
build-depends: inspection-and-dev-flags-cannot-be-used-together
|