packages feed

streamly-core-0.3.1: streamly-core.cabal

cabal-version:      2.4
name:               streamly-core
version:            0.3.1
synopsis:           Streaming, parsers, arrays, serialization and more
description:
  For upgrading to streamly-0.9.0+ please read the
  <https://github.com/composewell/streamly/blob/streamly-0.10.0/docs/User/Project/Upgrading-0.8-to-0.9.md Streamly-0.9.0 upgrade guide>.
  .
  Streamly is a high-performance, beginner-friendly standard library
  for Haskell. It unifies streaming with list transformers and logic
  programming; unifies streaming with concurrency and reactive
  programming; unifies arrays with ring arrays, text, bytestring
  and vector use cases; unifies arrays with builders and binary
  serialization; generalizes parsers to any input type and unifies
  attoparsec, parsec use cases with better performance; provides
  streaming fileIO — all with a clean, consistent, well-integrated and
  streaming enabled API.
  .
  Streams are designed to have a list like interface — no steep
  learning curve, no complex types. Streamly is designed to build
  general purpose applications in a truly functional manner, from
  simple hello-world to advanced high-performance systems. The design
  emphasizes simplicity, modularity, and code reuse with minimal
  building blocks. Performance is on par with C, tuning is easy, and
  it’s hard to get it wrong.
  .
  Streamly is serial by default, with seamless declarative concurrency
  that scales automatically when needed. It provides prompt and safe
  resource management, works well with other streaming libraries as well
  as core libraries like bytestring and text, and is backed by solid
  documentation.
  .
  @streamly-core@ is a Haskell standard library built on top of @base@
  and GHC boot libraries only. Stream processing abstractions include
  streams, scans, folds, parsers; and console I/O, file I/O; text
  processing.  Array abstractions include pinned, unpinned, mutable,
  immutable, boxed and unboxed arrays, and ring arrays.  Builders,
  binary serialization, and deserialization are built-in features of
  arrays.
  .
  This package provides a high-performance, unified and ergonomic
  alternative to many disparate packages, such as @streaming, pipes,
  conduit, list-t, logict, foldl, attoparsec, array, primitive,
  vector, vector-algorithms, binary, cereal, store, bytestring, text,
  stringsearch, interpolate, filepath, and path@.
  .
  Performant. Unified. Modular. Powerful. Simple.
  .
  Learn more at <https://streamly.composewell.com the streamly website>.

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.8
                   , GHC==9.4.7
                   , GHC==9.6.3
                   , GHC==9.8.1
                   , GHC==9.10.1
                   , GHC==9.12.1
author:              Composewell Technologies
maintainer:          streamly@composewell.com
copyright:           2017 Composewell Technologies
category:
    Streamly, Streaming, Dataflow, Pipes, List,
    Logic, Non-determinism, Parsing, Array, Time
stability:           Stable
build-type:          Configure

extra-source-files:
    configure
    configure.ac

   -- doctest include files
    src/doctest/*.hs

    -- This is duplicated
    src/Streamly/Internal/Data/Array/ArrayMacros.h
    src/Streamly/Internal/Data/ParserDrivers.h
    src/assert.hs
    src/inline.hs
    src/deprecation.h

    src/Streamly/Internal/Data/Time/Clock/config-clock.h
    src/config.h.in

extra-tmp-files:
    config.log
    config.status
    autom4te.cache
    src/config.h

extra-doc-files:
    Changelog.md
    docs/*.md
    docs/ApiChangelogs/*.txt

source-repository head
    type: git
    location: https://github.com/composewell/streamly

flag debug
  description: Debug build with asserts enabled
  manual: True
  default: False

flag internal-dev
  description: DO NOT USE, ONLY FOR INTERNAL USE.
  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 internal-use-unliftio
  description: DO NOT USE, ONLY FOR INTERNAL USE.
  manual: True
  default: False

flag use-unfolds
  description: Use unfolds for generation everywhere
  manual: True
  default: False

flag use-folds
  description: Use folds for elimination everywhere
  manual: True
  default: False

flag force-lstat-readdir
  description: Use lstat instead of checking for dtype in ReadDir
  manual: True
  default: False

-------------------------------------------------------------------------------
-- Common stanzas
-------------------------------------------------------------------------------

common compile-options
    if flag(force-lstat-readdir)
      cpp-options:    -DFORCE_LSTAT_READDIR

    if flag(internal-dev)
      cpp-options:    -DDEVBUILD

    if flag(use-unfolds)
      cpp-options:    -DUSE_UNFOLDS_EVERYWHERE

    if flag(use-folds)
      cpp-options:    -DUSE_FOLDS_EVERYWHERE

    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 impl(ghc >= 9.8)
      ghc-options:
        -Wno-missing-role-annotations

    if impl(ghc >= 9.10)
      ghc-options:
        -Wno-missing-poly-kind-signatures

    if flag(has-llvm)
      ghc-options: -fllvm

    if flag(internal-dev)
      ghc-options:    -Wmissed-specialisations
                      -Wall-missed-specialisations

    if flag(limit-build-mem)
        ghc-options: +RTS -M1000M -RTS

    if flag(internal-use-unliftio)
      cpp-options: -DUSE_UNLIFTIO

common default-extensions
    default-language: Haskell2010

    -- GHC2024 may include more extensions than we are actually using, see the
    -- full list below. We enable this to ensure that we are able to compile
    -- with this i.e. there is no interference by other extensions.

    -- Don't enforce GHC2024 and GHC2021 but We can support the build with them.

    -- if impl(ghc >= 9.10)
    --   default-language: GHC2024

    -- if impl(ghc >= 9.2) && impl(ghc < 9.10)
    --   default-language: GHC2021

    if impl(ghc >= 8.10)
      default-extensions: StandaloneKindSignatures

    -- In GHC 2024
    default-extensions:
        BangPatterns
        ConstraintKinds
        DeriveDataTypeable
        DeriveGeneric
        DeriveTraversable
        ExistentialQuantification
        FlexibleContexts
        FlexibleInstances
        GeneralizedNewtypeDeriving
        InstanceSigs
        KindSignatures
        LambdaCase
        MultiParamTypeClasses
        RankNTypes
        ScopedTypeVariables
        StandaloneDeriving
        TupleSections
        TypeApplications
        TypeOperators

        -- Not in GHC2024
        CApiFFI
        CPP
        DefaultSignatures
        MagicHash
        RecordWildCards

        -- TypeFamilies is required by IsList, IsMap type classes and
        -- Unbox generic deriving code.
        -- TypeFamilies

        -- MonoLocalBinds, enabled by TypeFamilies and GHC2024, was
        -- once found to cause runtime performance regressions which
        -- does not seem to be the case anymore, but need more testing
        -- to confirm.  It is confirmed that it requires more memory
        -- for compilation at least in some cases (Data.Fold.Window
        -- benchmark on GHC-9.10.1 macOS).  It also causes some
        -- code to not compile, so has been disabled in specific
        -- modules. Disabling this must come after TypeFamilies,
        -- otherwise TypeFamilies will enable it again.
        -- NoMonoLocalBinds

        -- UndecidableInstances -- Does not show any perf impact
        -- UnboxedTuples        -- interferes with (#.)

    if impl(ghc >= 8.6)
      default-extensions: QuantifiedConstraints

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(internal-dev) || flag(debug) || !flag(opt)
    cpp-options: -DDEBUG
    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

    js-sources: jsbits/clock.js

    include-dirs:
          src
        , src/doctest
        , src/Streamly/Internal/Data
        , src/Streamly/Internal/Data/Array
        , src/Streamly/Internal/Data/Stream

    c-sources: src/Streamly/Internal/Data/MutArray/Lib.c

    -- Prefer OS conditionals inside the source files rather than here,
    -- conditionals here do not work well with cabal2nix.
    if os(windows)
      c-sources:     src/Streamly/Internal/Data/Time/Clock/Windows.c

    if os(darwin)
      include-dirs:  src/Streamly/Internal
      c-sources:     src/Streamly/Internal/Data/Time/Clock/Darwin.c

    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-base
                       Streamly.Internal.BaseCompat
                     , Streamly.Internal.Control.Exception
                     , Streamly.Internal.Control.Monad
                     , Streamly.Internal.Control.ForkIO
                       Streamly.Internal.Data.IsMap
                     , Streamly.Internal.System.IO

                     -- streamly-strict-data
                     , Streamly.Internal.Data.Tuple.Strict
                     , Streamly.Internal.Data.Maybe.Strict
                     , Streamly.Internal.Data.Either.Strict

                     , Streamly.Internal.Data.IOFinalizer

                     -- streamly-time
                     , Streamly.Internal.Data.Time.TimeSpec
                     , Streamly.Internal.Data.Time.Units
                     , Streamly.Internal.Data.Time.Clock
                     , Streamly.Internal.Data.Path

                     -- streamly-core-stream-types
                     , Streamly.Internal.Data.SVar.Type
                     , Streamly.Internal.Data.Refold.Type
                     , Streamly.Internal.Data.Producer

                     -- streamly-core-array-types
                     , Streamly.Internal.Data.MutByteArray
                     , Streamly.Internal.Data.CString

                     -- streaming and parsing Haskell types to/from bytes
                     , Streamly.Internal.Data.Binary.Parser
                     , Streamly.Internal.Data.Binary.Stream

                     -- May depend on streamly-core-stream
                     , Streamly.Internal.Data.MutArray
                     , Streamly.Internal.Data.MutArray.Generic

                     -- streamly-core-streams
                     , Streamly.Internal.Data.StreamK
                     -- StreamD depends on streamly-array-types
                     , Streamly.Internal.Data.Stream

                     -- streamly-core-data
                     , Streamly.Internal.Data.Builder
                     , Streamly.Internal.Data.Unfold
                     , Streamly.Internal.Data.Parser
                     , Streamly.Internal.Data.ParserK
                     , Streamly.Internal.Data.Pipe
                     , Streamly.Internal.Data.Scanr

                     -- streamly-containers (non-base)
                     , Streamly.Internal.Data.Fold
                     , Streamly.Internal.Data.Scanl

                     -- streamly-core-data-arrays
                     , Streamly.Internal.Data.Array.Generic
                     , Streamly.Internal.Data.Array

                     -- Unboxed IORef
                     , Streamly.Internal.Data.IORef

                    -- streamly-unicode-core
                     , Streamly.Internal.Unicode.Stream
                     , Streamly.Internal.Unicode.String
                     , Streamly.Internal.Unicode.Parser
                     , Streamly.Internal.Unicode.Array

                     -- Filesystem/IO

                     , Streamly.Internal.FileSystem.Path
                     , Streamly.Internal.FileSystem.Path.Seg
                     , Streamly.Internal.FileSystem.Path.Node
                     , Streamly.Internal.FileSystem.Path.SegNode

                     , Streamly.Internal.FileSystem.PosixPath
                     , Streamly.Internal.FileSystem.PosixPath.Seg
                     , Streamly.Internal.FileSystem.PosixPath.Node
                     , Streamly.Internal.FileSystem.PosixPath.SegNode

                     , Streamly.Internal.FileSystem.WindowsPath
                     , Streamly.Internal.FileSystem.WindowsPath.Seg
                     , Streamly.Internal.FileSystem.WindowsPath.Node
                     , Streamly.Internal.FileSystem.WindowsPath.SegNode

                     , Streamly.Internal.FileSystem.Handle
                     , Streamly.Internal.FileSystem.File.Common
                     , Streamly.Internal.FileSystem.Posix.Errno
                     , Streamly.Internal.FileSystem.Posix.File
                     , Streamly.Internal.FileSystem.Posix.ReadDir
                     , Streamly.Internal.FileSystem.Windows.ReadDir
                     , Streamly.Internal.FileSystem.Windows.File
                     , Streamly.Internal.FileSystem.FileIO
                     , Streamly.Internal.FileSystem.DirIO

                    -- RingArray Arrays
                     , Streamly.Internal.Data.RingArray
                     , Streamly.Internal.Data.RingArray.Generic

                     -- streamly-console
                     , Streamly.Internal.Console.Stdio

                     -- To be implemented
                     -- , Streamly.Data.Refold

                     -- Pre-release modules
                     -- , Streamly.Data.Pipe
                     -- , Streamly.Data.RingArray.Generic
                     -- , Streamly.Data.IORef
                     -- , Streamly.Data.List
                     -- , Streamly.Data.Time.Units
                     -- , Streamly.Data.Time.Clock
                     -- , Streamly.Data.Tuple.Strict
                     -- , Streamly.Data.Maybe.Strict
                     -- , Streamly.Data.Either.Strict

                     -- streamly-core released modules in alphabetic order
                     , Streamly.Console.Stdio
                     , Streamly.Control.Exception
                     , Streamly.Data.Array
                     , Streamly.Data.Array.Generic
                     , Streamly.Data.Fold
                     , Streamly.Data.MutArray
                     , Streamly.Data.MutArray.Generic
                     , Streamly.Data.MutByteArray
                     , Streamly.Data.Parser
                     , Streamly.Data.ParserK
                     , Streamly.Data.RingArray
                     , Streamly.Data.Scanl
                     , Streamly.Data.Stream
                     , Streamly.Data.StreamK
                     , Streamly.Data.Unfold
                     , Streamly.FileSystem.DirIO
                     , Streamly.FileSystem.FileIO
                     , Streamly.FileSystem.Handle
                     , Streamly.FileSystem.Path
                     , Streamly.Unicode.Parser
                     , Streamly.Unicode.Stream
                     , Streamly.Unicode.String

                    -- Deprecated in 0.3.0
                     , Streamly.Internal.FileSystem.File
                     , Streamly.Internal.FileSystem.Dir
                     , Streamly.FileSystem.Dir
                     , Streamly.FileSystem.File

                    -- Deprecated in 0.2.0
                     , Streamly.Internal.Data.MutArray.Stream
                     , Streamly.Internal.Data.Array.Stream
                     , Streamly.Internal.Data.Stream.StreamD
                     , Streamly.Internal.Data.Fold.Chunked

    -- Only those modules should be here which are fully re-exported via some
    -- other module.
    other-modules:
                      Streamly.FileSystem.Path.Seg
                    , Streamly.FileSystem.Path.Node
                    , Streamly.FileSystem.Path.SegNode

                    , Streamly.Internal.Data.Fold.Step
                    , Streamly.Internal.Data.Fold.Type
                    , Streamly.Internal.Data.Fold.Combinators
                    , Streamly.Internal.Data.Fold.Container
                    , Streamly.Internal.Data.Fold.Exception
                    , Streamly.Internal.Data.Fold.Tee
                    , Streamly.Internal.Data.Fold.Window

                    , Streamly.Internal.Data.Scanl.Type
                    , Streamly.Internal.Data.Scanl.Window
                    , Streamly.Internal.Data.Scanl.Combinators
                    , Streamly.Internal.Data.Scanl.Container

                    , Streamly.Internal.Data.Parser.Type
                    , Streamly.Internal.Data.Parser.Tee
                    , Streamly.Internal.Data.ParserK.Type
                    , Streamly.Internal.Data.ParserDrivers

                    , Streamly.Internal.Data.Stream.Container
                    , Streamly.Internal.Data.Stream.Eliminate
                    , Streamly.Internal.Data.Stream.Exception
                    , Streamly.Internal.Data.Stream.Generate
                    , Streamly.Internal.Data.Stream.Lift
                    , Streamly.Internal.Data.Stream.Nesting
                    , Streamly.Internal.Data.Stream.Step
                    , Streamly.Internal.Data.Stream.Top
                    , Streamly.Internal.Data.Stream.Transform
                    , Streamly.Internal.Data.Stream.Transformer
                    , Streamly.Internal.Data.Stream.Type

                    , Streamly.Internal.Data.StreamK.Type
                    , Streamly.Internal.Data.StreamK.Transformer

                    , Streamly.Internal.Data.Pipe.Type

                    , Streamly.Internal.Data.Unfold.Type
                    , Streamly.Internal.Data.Unfold.Enumeration

                    , Streamly.Internal.Data.MutArray.Type

                    , Streamly.Internal.Data.Array.Type
                    , Streamly.Internal.Data.Array.Generic.Type

                    , Streamly.Internal.Data.MutByteArray.Type
                    , Streamly.Internal.Data.Unbox
                    , Streamly.Internal.Data.Unbox.TH
                    , Streamly.Internal.Data.Serialize.Type
                    , Streamly.Internal.Data.Serialize.TH
                    , Streamly.Internal.Data.Serialize.TH.RecHeader
                    , Streamly.Internal.Data.Serialize.TH.Common
                    , Streamly.Internal.Data.Serialize.TH.Bottom

                    , Streamly.Internal.Data.Producer.Type
                    , Streamly.Internal.Data.Producer.Source

                    , Streamly.Internal.Data.Time.Clock.Type
                    , Streamly.Internal.FileSystem.Path.Common
                    , Streamly.Internal.FileSystem.DirOptions

    if flag(internal-dev)
      exposed-modules:
                        Streamly.Internal.Data.StreamK.Alt
                        -- XXX Compilation needs to be fixed
                      -- , Streamly.Internal.Data.List

    build-depends:
                    -- streamly-base
                    --
                    -- These dependencies can be reversed if we want
                    -- streamly-base to depend only on base.
                    --
                    -- 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.
                       ghc-prim          >= 0.5.3 && < 0.14
                     , fusion-plugin-types >= 0.1 && < 0.2
                     , base              >= 4.12  && < 4.23
                     , exceptions        >= 0.8.0 && < 0.11
                     , transformers      >= 0.5.5 && < 0.7

                    -- streamly-unicode-core
                     , template-haskell  >= 2.14  && < 2.25

                     -- XXX to be removed
                     , filepath          >= 1.4.2 && < 1.6
                     , containers        >= 0.6.0 && < 0.9
                     , heaps             >= 0.3   && < 0.5

    if impl(ghc >= 9.0)
      build-depends:  ghc-bignum >= 1.0  && < 2
    else
      build-depends:  integer-gmp >= 1.0 && < 1.2

    if !flag(internal-use-unliftio)
      build-depends:   monad-control     >= 1.0 && < 1.1

    if os(windows)
      build-depends: Win32            >= 2.6 && < 2.15