no-recursion-0.1.0.0: no-recursion.cabal
cabal-version: 3.0
name: no-recursion
version: 0.1.0.0
synopsis: A GHC plugin to remove support for recursion
description: General recursion can be the cause of a lot of problems. This
removes recursion from GHC, allowing you to guarantee you’re using
other mechanisms, like recursion schemes.
author: Greg Pfeil <greg@technomadic.org>
maintainer: Greg Pfeil <greg@technomadic.org>
copyright: 2024 Greg Pfeil
homepage: https://github.com/sellout/no-recursion#readme
bug-reports: https://github.com/sellout/no-recursion/issues
category: Recursion
build-type: Custom
license: AGPL-3.0-or-later
license-files:
LICENSE
tested-with:
GHC == {
-- GHCup Nixpkgs
8.0.2,
8.2.2,
8.4.1,
8.6.1,
8.8.1, 8.8.4,
8.10.1, 8.10.7,
9.0.1, 9.0.2,
9.2.1, 9.2.8,
9.4.1, 9.4.8,
9.6.1, 9.6.2,
9.8.1
}
source-repository head
type: git
location: https://github.com/sellout/no-recursion
-- This mimics the GHC2021 extension
-- (https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/control.html?highlight=doandifthenelse#extension-GHC2021),
-- but supporting compilers back to GHC 7.10. If the oldest supported compiler
-- is GHC 9.2, then this stanza can be removed and `import: GHC2021` can be
-- replaced by `default-language: GHC2021`.
common GHC2021
default-language: Haskell2010
default-extensions:
BangPatterns
BinaryLiterals
ConstraintKinds
DeriveDataTypeable
DeriveGeneric
-- DeriveLift -- uncomment if the oldest supported version is GHC 8.10.1+
DeriveTraversable
-- DerivingStrategies -- uncomment if the oldest supported version is GHC 8.2.1+
DoAndIfThenElse
EmptyCase
ExistentialQuantification
FlexibleContexts
FlexibleInstances
GADTSyntax
GeneralizedNewtypeDeriving
-- HexFloatLiterals -- uncomment if the oldest supported version is GHC 8.4.1+
-- ImportQualifiedPost -- uncomment if the oldest supported version is GHC 8.10.1+
InstanceSigs
LambdaCase
MagicHash
MonadComprehensions
MonomorphismRestriction
MultiParamTypeClasses
NamedFieldPuns
NamedWildCards
-- NumericUnderscores -- uncomment if the oldest supported version is GHC 8.6.1+
PolyKinds
PostfixOperators
RankNTypes
ScopedTypeVariables
StandaloneDeriving
-- StandaloneKindSignatures -- uncomment if the oldest supported version is GHC 8.10.1+
TupleSections
-- TypeApplications -- uncomment if the oldest supported version is GHC 8.0.1+
TypeOperators
UnicodeSyntax
NoExplicitNamespaces
flag noisy-deprecations
description:
Prior to GHC 9.10, the `DEPRECATED` pragma can’t distinguish between terms
and types. Consenquently, you can get spurious warnings when there’s a name
collision and the name in the other namespace is deprecated. Or you can
choose to not get those warnings, at the risk of not being warned when
there’s a name collision and the namespace you’re referencing is the one
that’s deprecated.
common defaults
import: GHC2021
build-depends:
base ^>= {4.9.1, 4.10.1, 4.11.0, 4.12.0, 4.13.0, 4.14.0, 4.15.0, 4.16.0, 4.17.0, 4.18.0, 4.19.0},
ghc-options:
-Weverything
-fpackage-trust
-trust base
if impl(ghc >= 8.0.1)
ghc-options:
-- This one just reports unfixable things, AFAICT.
-Wno-all-missed-specialisations
-- Type inference good.
-Wno-missing-local-signatures
-- Warns even when `Unsafe` is explicit, not inferred. See
-- https://gitlab.haskell.org/ghc/ghc/-/issues/16689
-Wno-unsafe
if impl(ghc < 8.8.1)
ghc-options:
-- This used to warn even when `Safe` was explicit.
-Wno-safe
if impl(ghc >= 8.10.1)
ghc-options:
-- If we didn’t allow inferred-safe imports, nothing would be `Safe`.
-Wno-inferred-safe-imports
-- We support GHC versions without qualified-post.
-Wno-prepositive-qualified-module
-- `-trust` triggers this warning when applied to transitive dependencies.
-Wno-unused-packages
if impl(ghc >= 9.2.1)
ghc-options:
-- We support GHC versions without kind signatures.
-Wno-missing-kind-signatures
if impl(ghc >= 9.8.1)
ghc-options:
-- We support GHC versions without kind signatures.
-Wno-missing-poly-kind-signatures
-- Inference good.
-Wno-missing-role-annotations
default-extensions:
DefaultSignatures
ExplicitNamespaces
FunctionalDependencies
LiberalTypeSynonyms
-- replace with `LexicalNegation` if the oldest supported version is GHC 9.0.1+
NegativeLiterals
PackageImports
ParallelListComp
-- QualifiedDo - uncomment if the oldest supported version is GHC 9.0.1+
RecursiveDo
-- RequiredTypeArguments - uncomment if the oldest supported version is GHC 9.10.1+
-- TemplateHaskellQuotes - uncomment if the oldest supported version is GHC 8.0.1+
TransformListComp
NoGeneralizedNewtypeDeriving
NoImplicitPrelude
NoMonomorphismRestriction
NoPatternGuards
-- NoStarIsType - uncomment if the oldest supported version is GHC 8.6.1+
-- NoTypeApplications - uncomment if the oldest supported version is GHC 8.0.1+
if impl(ghc >= 8.0.1)
default-extensions:
StrictData
if flag(noisy-deprecations)
cpp-options: -DSELLOUT_NOISY_DEPRECATIONS
custom-setup
setup-depends:
-- TODO: Remove `Cabal` dep once haskell/cabal#3751 is fixed.
Cabal ^>= {3.0.0, 3.2.0, 3.4.0, 3.6.0, 3.8.0, 3.10.0},
base ^>= {4.8.2, 4.9.0, 4.10.0, 4.11.0, 4.12.0, 4.13.0, 4.14.0, 4.15.0, 4.16.0, 4.17.0, 4.18.0, 4.19.0},
cabal-doctest ^>= 1.0.0,
library
import: defaults
hs-source-dirs: src
build-depends:
ghc ^>= {8.0.2, 8.2.2, 8.4.1, 8.6.1, 8.8.1, 8.10.1, 9.0.1, 9.2.1, 9.4.1, 9.6.1, 9.8.1},
exposed-modules:
NoRecursion
test-suite doctests
import: defaults
type: exitcode-stdio-1.0
hs-source-dirs: tests
main-is: doctests.hs
build-depends:
doctest ^>= {0.16.0, 0.18.1, 0.20.1, 0.21.1, 0.22.2},
no-recursion,
-- TODO: The sections below here are necessary because we don’t have control
-- over the generated `Build_doctests.hs` file. So we have to silence
-- all of its warnings one way or another.
ghc-options:
-Wno-missing-import-lists
-Wno-safe
if impl(ghc >= 8.4.1)
ghc-options:
-Wno-missing-export-lists
if impl(ghc >= 8.8.1)
ghc-options:
-- This used to warn even when `Safe` was explicit.
-Wno-missing-deriving-strategies
default-extensions:
-- Since we can’t add `{-# LANGUAGE Safe -#}` to the generated
-- “Build_doctests.hs”, we set it here, and that means it has to match
-- doctests.hs, which is `Unsafe`.
Unsafe