packages feed

queues-1.0.0: queues.cabal

cabal-version: 2.2

author: Mitchell Rosen, Travis Staton
bug-reports: https://github.com/awkward-squad/queues/issues
category: Data
copyright: Copyright (C) 2023-2024 Mitchell Rosen, Travis Staton
homepage: https://github.com/awkward-squad/queues
license: BSD-3-Clause
license-file: LICENSE
maintainer: Mitchell Rosen <mitchellwrosen@gmail.com>, Travis Staton <hello@travisstaton.com>
name: queues
synopsis: Queue data structures.
tested-with: GHC == 9.4.8, GHC == 9.6.4, GHC == 9.8.2
version: 1.0.0

description:
  Queue data structures, as described in
  .
    * Okasaki, Chris. "Simple and efficient purely functional queues and deques." /Journal of functional programming/ 5.4 (1995): 583-592.
    * Okasaki, Chris. /Purely Functional Data Structures/. Diss. Princeton University, 1996.
  .
  A queue has a \"back\" where new elements are enqueued, and a \"front\" where elements are dequeued in the order that
  they were enqueued (last in, first out).
  .
  The queues provided in this library also support an \"enqueue at front\" operation, because the underlying
  representations happen to support it, so you might technically refer to these data structures as
  /output-restricted deques/.
  .
  In this library, it is helpful to think of the \"front\" being on the /left/, because (though the direction is
  arbitrary) we are consistent throughout, where it matters:
  .
    * List conversion functions associate the head of a list with the front of a queue.
    * The append operator @xs <> ys@ creates a queue with @xs@ in front of @ys@.
    * The `Show` instances draw the front of the queue on the left.
  .
  Under \"ephemeral\" (or \"single-threaded\", or \"linear\") usage, wherein one does not need to refer to an old
  version of a data structure after mutating it:
  .
    * @EphemeralQueue@ is __2.5x faster__ than and __allocates 0.50x as much__ memory as @Queue@.
    * @Queue@ is __2.6x faster__ than and __allocates 0.40x as much__ memory as @Seq@ (from @containers@).
  .
  (These numbers vary from benchmark to benchmark and machine to machine. Always perform your own experiments!)
  .
  While it is certainly common to use a queue ephemerally, it is unusual for a Haskell data structure to require
  ephemeral usage to achieve its stated bounds. A refactoring or change in requirements might cause surprising changes
  in performance. That is why @EphemeralQueue@ has a longer name and module name. When in doubt, use @Queue@.

extra-doc-files:
  CHANGELOG.md
  README.md

source-repository head
  type: git
  location: https://github.com/awkward-squad/queues.git

common component
  default-extensions:
    BangPatterns
    BlockArguments
    ConstraintKinds
    DataKinds
    DeriveFunctor
    DerivingStrategies
    DuplicateRecordFields
    ExistentialQuantification
    GeneralizedNewtypeDeriving
    ImportQualifiedPost
    InstanceSigs
    LambdaCase
    NamedFieldPuns
    OverloadedStrings
    PatternSynonyms
    QuantifiedConstraints
    RankNTypes
    ScopedTypeVariables
    StandaloneKindSignatures
    TypeOperators
    ViewPatterns
  default-language: Haskell2010
  ghc-options:
    -Weverything
    -Wno-all-missed-specialisations
    -Wno-implicit-prelude
    -Wno-missed-specialisations
    -Wno-missing-import-lists
    -Wno-missing-safe-haskell-mode
    -Wno-prepositive-qualified-module
    -Wno-safe
    -Wno-unsafe
  if impl(ghc >= 9.2)
    ghc-options:
      -Wno-missing-kind-signatures
  if impl(ghc >= 9.8)
    ghc-options:
      -Wno-missing-role-annotations

library
  import: component
  build-depends:
    base ^>= 4.15 || ^>= 4.16 || ^>= 4.17 || ^>= 4.18 || ^>= 4.19,
  exposed-modules:
    Queue
    Queue.Ephemeral
  hs-source-dirs: src

test-suite test
  import: component
  build-depends:
    base,
    containers ^>= 0.6.7 || ^>= 0.7,
    hedgehog ^>= 1.4,
    queues,
  ghc-options: -rtsopts -threaded "-with-rtsopts=-N4"
  hs-source-dirs: test
  main-is: Main.hs
  type: exitcode-stdio-1.0

benchmark bench-ephemeral-queue
  import: component
  build-depends:
    base,
    queues,
    tasty-bench ^>= 0.3.5,
  ghc-options: -fproc-alignment=64 -rtsopts -threaded
  hs-source-dirs: bench/ephemeral-queue
  main-is: Main.hs
  type: exitcode-stdio-1.0

benchmark bench-real-time-queue
  import: component
  build-depends:
    base,
    queues,
    tasty-bench ^>= 0.3.5,
  ghc-options: -fproc-alignment=64 -rtsopts -threaded
  hs-source-dirs: bench/real-time-queue
  main-is: Main.hs
  type: exitcode-stdio-1.0

benchmark bench-sequence-queue
  import: component
  build-depends:
    base,
    containers ^>= 0.6.7 || ^>= 0.7,
    tasty-bench ^>= 0.3.5,
  ghc-options: -fproc-alignment=64 -rtsopts -threaded
  hs-source-dirs: bench/sequence-queue
  main-is: Main.hs
  type: exitcode-stdio-1.0