packages feed

vec-0.5.1.1: vec.cabal

cabal-version:      2.2
name:               vec
version:            0.5.1.1
synopsis:           Vec: length-indexed (sized) list
category:           Data, Dependent Types
description:
  This package provides length-indexed (sized) lists, also known as vectors.
  .
  @
  data Vec n a where
  \    VNil  :: Vec 'Nat.Z a
  \    (:::) :: a -> Vec n a -> Vec ('Nat.S n) a
  @
  .
  The functions are implemented in four flavours:
  .
  * __naive__: with explicit recursion. It's simple, constraint-less, yet slow.
  .
  * __pull__: using @Fin n -> a@ representation, which fuses well,
  but makes some programs hard to write. And
  .
  * __data-family__: which allows lazy pattern matching
  .
  * __inline__: which exploits how GHC dictionary inlining works, unrolling
  recursion if the size of 'Vec' is known statically.
  .
  As best approach depends on the application, @vec@ doesn't do any magic
  transformation. Benchmark your code.
  .
  This package uses [fin](https://hackage.haskell.org/package/fin), i.e. not @GHC.TypeLits@, for indexes.
  .
  For @lens@ or @optics@ support see [vec-lens](https://hackage.haskell.org/package/vec-lens) and [vec-optics](https://hackage.haskell.org/package/vec-optics) packages respectively.
  .
  See [Hasochism: the pleasure and pain of dependently typed haskell programming](https://doi.org/10.1145/2503778.2503786)
  by Sam Lindley and Conor McBride for answers to /how/ and /why/.
  Read [APLicative Programming with Naperian Functors](https://doi.org/10.1007/978-3-662-54434-1_21)
  by Jeremy Gibbons for (not so) different ones.
  .
  === Similar packages
  .
  * [linear](https://hackage.haskell.org/package/linear) has 'V' type,
  which uses 'Vector' from @vector@ package as backing store.
  @Vec@ is a real GADT, but tries to provide as many useful instances (upto @lens@).
  .
  * [vector-sized](https://hackage.haskell.org/package/vector-sized)
  Great package using @GHC.TypeLits@. Current version (0.6.1.0) uses
  @finite-typelits@ and @Int@ indexes.
  .
  * [sized-vector](https://hackage.haskell.org/package/sized-vector) depends
  on @singletons@ package. @vec@ isn't light on dependencies either,
  but try to provide wide GHC support.
  .
  * [fixed-vector](https://hackage.haskell.org/package/fixed-vector)
  .
  * [sized](https://hackage.haskell.org/package/sized) also depends
  on a @singletons@ package. The @Sized f n a@ type is generalisation of
  @linear@'s @V@ for any @ListLike@.
  .
  * [clash-prelude](https://hackage.haskell.org/package/clash-prelude)
  is a kitchen sink package, which has @CLaSH.Sized.Vector@ module.
  Also depends on @singletons@.

homepage:           https://github.com/phadej/vec
bug-reports:        https://github.com/phadej/vec/issues
license:            BSD-3-Clause
license-file:       LICENSE
author:             Oleg Grenrus <oleg.grenrus@iki.fi>
maintainer:         Oleg.Grenrus <oleg.grenrus@iki.fi>
copyright:          (c) 2017-2021 Oleg Grenrus
build-type:         Simple
extra-source-files: ChangeLog.md
tested-with:
  GHC ==8.6.5
   || ==8.8.4
   || ==8.10.7
   || ==9.0.2
   || ==9.2.8
   || ==9.4.8
   || ==9.6.6
   || ==9.8.4
   || ==9.10.3
   || ==9.12.2
   || ==9.14.1

source-repository head
  type:     git
  location: https://github.com/phadej/vec.git
  subdir:   vec

flag adjunctions
  description: Depend on @adjunctions@ to provide its instances
  manual:      True
  default:     True

flag distributive
  description:
    Depend on @distributive@ to provide its instances. Turning on, disables @adjunctions@ too.

  manual:      True
  default:     True

flag semigroupoids
  description:
    Depend on @semigroupoids@ to provide its instances, and `traverse1`.

  manual:      True
  default:     True

library
  default-language:         Haskell2010
  ghc-options:              -Wall -fprint-explicit-kinds
  hs-source-dirs:           src
  exposed-modules:
    Data.Vec.DataFamily.SpineStrict
    Data.Vec.Lazy
    Data.Vec.Lazy.Inline
    Data.Vec.Pull

  other-modules:
    Control.Lens.Yocto
    SafeCompat

  -- GHC boot libs
  build-depends:
    , base          >=4.12.0.0 && <4.23
    , deepseq       >=1.4.4.0  && <1.6

  -- siblings
  build-depends:            fin ^>=0.3.1

  -- other dependencies
  build-depends:
    , boring               ^>=0.2.2
    , hashable             ^>=1.4.4.0 || ^>=1.5.0.0
    , indexed-traversable  ^>=0.1.4
    , QuickCheck           ^>=2.14.2  || ^>=2.15.0.1 || ^>=2.18.0.0

  if flag(distributive)
    build-depends: distributive ^>=0.6.2

    if flag(adjunctions)
      build-depends: adjunctions ^>=4.4.2

  if flag(semigroupoids)
    build-depends: semigroupoids ^>=6.0.1

  other-extensions:
    CPP
    FlexibleContexts
    GADTs
    TypeOperators

  if impl(ghc >=9.0)
    -- these flags may abort compilation with GHC-8.10
    -- https://gitlab.haskell.org/ghc/ghc/-/merge_requests/3295
    ghc-options: -Winferred-safe-imports -Wmissing-safe-haskell-mode

  x-docspec-extra-packages: lens

test-suite inspection
  type:             exitcode-stdio-1.0
  main-is:          Main.hs
  other-modules:
    Inspection
    Inspection.DataFamily.SpineStrict

  ghc-options:      -Wall -fprint-explicit-kinds
  hs-source-dirs:   test
  default-language: Haskell2010
  build-depends:
    , base
    , fin
    , inspection-testing  ^>=0.5.0.3 || ^>=0.6
    , vec

benchmark bench
  type:             exitcode-stdio-1.0
  main-is:          Bench.hs
  ghc-options:      -Wall -fprint-explicit-kinds
  hs-source-dirs:   bench
  default-language: Haskell2010
  other-modules:    DotProduct
  build-depends:
    , base
    , criterion  ^>=1.6.3.0
    , fin
    , vec
    , vector