Cabal-syntax-3.12.1.0: A library for working with .cabal files

Safe Haskell | None
Language | Haskell2010

Distribution.Compat.Newtype

Description

Per Conor McBride, the `Newtype` typeclass represents the packing and unpacking of a newtype, and allows you to operate under that newtype with functions such as `ala`.

Synopsis

- class Newtype o n | n -> o where
  - pack :: o -> n
  - unpack :: n -> o
- ala :: (Newtype o n, Newtype o' n') => (o -> n) -> ((o -> n) -> b -> n') -> b -> o'
- alaf :: (Newtype o n, Newtype o' n') => (o -> n) -> ((a -> n) -> b -> n') -> (a -> o) -> b -> o'
- pack' :: Newtype o n => (o -> n) -> o -> n
- unpack' :: Newtype o n => (o -> n) -> n -> o

# Documentation

class Newtype o n | n -> o where Source #

The `FunctionalDependencies` version of `Newtype` type-class.

Since Cabal-3.0 class arguments are in a different order than in `newtype` package. This change is to allow usage with `DeriveAnyClass` (and `DerivingStrategies`, in GHC-8.2). Unfortunately one has to repeat inner type.

    newtype New = New Old
      deriving anyclass (Newtype Old)

Another approach would be to use `TypeFamilies` (and possibly compute inner type using GHC.Generics), but we think `FunctionalDependencies` version gives cleaner type signatures.

Minimal complete definition

Nothing

Methods

pack :: o -> n Source #

default pack :: Coercible o n => o -> n Source #

unpack :: n -> o Source #

default unpack :: Coercible n o => n -> o Source #

#### Instances

Instances details

Newtype CabalSpecVersion SpecVersion Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: CabalSpecVersion -> SpecVersion Source # unpack :: SpecVersion -> CabalSpecVersion Source #
Newtype String FilePathNT Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: String -> FilePathNT Source # unpack :: FilePathNT -> String Source #
Newtype String Token Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: String -> Token Source # unpack :: Token -> String Source #
Newtype String Token' Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: String -> Token' Source # unpack :: Token' -> String Source #
Newtype String CompatFilePath Source # |
Instance details Defined in Distribution.PackageDescription.FieldGrammar Methods pack :: String -> CompatFilePath Source # unpack :: CompatFilePath -> String Source #
Newtype a (MQuoted a) Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: a -> MQuoted a Source # unpack :: MQuoted a -> a Source #
Newtype a (Identity a) Source # |
Instance details Defined in Distribution.Compat.Newtype Methods pack :: a -> Identity a Source # unpack :: Identity a -> a Source #
Newtype a (Product a) Source # |
Instance details Defined in Distribution.Compat.Newtype Methods pack :: a -> Product a Source # unpack :: Product a -> a Source #
Newtype a (Sum a) Source # |
Instance details Defined in Distribution.Compat.Newtype Methods pack :: a -> Sum a Source # unpack :: Sum a -> a Source #
Newtype [SymbolicPath PackageDir LicenseFile] CompatLicenseFile Source # |
Instance details Defined in Distribution.PackageDescription.FieldGrammar Methods pack :: [SymbolicPath PackageDir LicenseFile] -> CompatLicenseFile Source # unpack :: CompatLicenseFile -> [SymbolicPath PackageDir LicenseFile] Source #
Newtype (Set a) (Set' sep wrapper a) Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: Set a -> Set' sep wrapper a Source # unpack :: Set' sep wrapper a -> Set a Source #
Newtype (NonEmpty a) (NonEmpty' sep wrapper a) Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: NonEmpty a -> NonEmpty' sep wrapper a Source # unpack :: NonEmpty' sep wrapper a -> NonEmpty a Source #
Newtype [a] (List sep wrapper a) Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: [a] -> List sep wrapper a Source # unpack :: List sep wrapper a -> [a] Source #
Newtype (Either License License) SpecLicense Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: Either License License -> SpecLicense Source # unpack :: SpecLicense -> Either License License Source #
Newtype (CompilerFlavor, VersionRange) TestedWith Source # |
Instance details Defined in Distribution.FieldGrammar.Newtypes Methods pack :: (CompilerFlavor, VersionRange) -> TestedWith Source # unpack :: TestedWith -> (CompilerFlavor, VersionRange) Source #
Newtype (a -> a) (Endo a) Source # |
Instance details Defined in Distribution.Compat.Newtype Methods pack :: (a -> a) -> Endo a Source # unpack :: Endo a -> a -> a Source #

ala :: (Newtype o n, Newtype o' n') => (o -> n) -> ((o -> n) -> b -> n') -> b -> o' Source #

    >>> ala Sum foldMap [1, 2, 3, 4 :: Int]
    10

Note: the user supplied function for the newtype is ignored.

    >>> ala (Sum . (+1)) foldMap [1, 2, 3, 4 :: Int]
    10

alaf :: (Newtype o n, Newtype o' n') => (o -> n) -> ((a -> n) -> b -> n') -> (a -> o) -> b -> o' Source #

    >>> alaf Sum foldMap length ["cabal", "install"]
    12

Note: as with `ala`, the user supplied function for the newtype is ignored.

pack' :: Newtype o n => (o -> n) -> o -> n Source #

Variant of `pack`, which takes a phantom type.

unpack' :: Newtype o n => (o -> n) -> n -> o Source #

Variant of `unpack`, which takes a phantom type.