generic-lens-2.2.1.0: Generically derive traversals, lenses and prisms.
Copyright (C) 2020 Csongor Kiss
License BSD3
Maintainer Csongor Kiss <kiss.csongor.kiss@gmail.com>
Stability experimental
Portability non-portable
Safe Haskell None
Language Haskell2010

Data.Generics.Sum.Constructors

Contents

Description

Derive constructor-name-based prisms generically.

Synopsis

Prisms

Running example:

>>> :set -XTypeApplications
>>> :set -XDataKinds
>>> :set -XDeriveGeneric
>>> :set -XFlexibleContexts
>>> :set -XTypeFamilies
>>> import GHC.Generics
>>> import Control.Lens
>>> :m +Data.Generics.Product.Fields
>>> :m +Data.Function
>>> :{
data Animal a
  = Dog (Dog a)
  | Cat Name Age
  | Duck Age
  deriving (Generic, Show)
data Dog a
  = MkDog
  { name   :: Name
  , age    :: Age
  , fieldA :: a
  }
  deriving Show
type Name = String
type Age  = Int
dog, cat, duck :: Animal Int
dog = Dog (MkDog "Shep" 3 30)
cat = Cat "Mog" 5
duck = Duck 2
:}

class AsConstructor (ctor :: Symbol ) s t a b | ctor s -> a, ctor t -> b where Source #

Sums that have a constructor with a given name.

Methods

_Ctor :: Prism s t a b Source #

A prism that projects a named constructor from a sum. Compatible with the lens package's Prism type.

>>> dog ^? _Ctor @"Dog"
Just (MkDog {name = "Shep", age = 3, fieldA = 30})
>>> dog ^? _Ctor @"Cat"
Nothing
>>> cat ^? _Ctor @"Cat"
Just ("Mog",5)
>>> _Ctor @"Cat" # ("Garfield", 6) :: Animal Int
Cat "Garfield" 6

Type errors

>>> cat ^? _Ctor @"Turtle"
...
...
... The type Animal Int does not contain a constructor named "Turtle"
...

Instances

Instances details
( Context ctor s t a b, AsConstructor0 ctor s t a b) => AsConstructor ctor s t a b Source #
Instance details

Defined in Data.Generics.Sum.Constructors

AsConstructor ctor ( Void1 a) ( Void1 b) a b Source #

See Note [Uncluttering type signatures] >>> :t +d _Ctor _Ctor :: (AsConstructor ctor s t a b, Choice p, Applicative f) => p a (f b) -> p s (f t)

Instance details

Defined in Data.Generics.Sum.Constructors

class AsConstructor_ (ctor :: Symbol ) s t a b where Source #

Sums that have a constructor with a given name.

The difference between HasConstructor and HasConstructor_ is similar to the one between HasField and HasField_ . See HasField_ .

Instances

Instances details
( Context_ ctor s t a b, AsConstructor0 ctor s t a b) => AsConstructor_ ctor s t a b Source #
Instance details

Defined in Data.Generics.Sum.Constructors

AsConstructor_ ctor ( Void1 a) ( Void1 b) a b Source #
Instance details

Defined in Data.Generics.Sum.Constructors

class AsConstructor' (ctor :: Symbol ) s a | ctor s -> a where Source #

Instances

Instances details
( Context' ctor s a, AsConstructor0 ctor s s a a) => AsConstructor' ctor s a Source #
Instance details

Defined in Data.Generics.Sum.Constructors

class AsConstructor0 (ctor :: Symbol ) s t a b where Source #

Sums that have a constructor with a given name.

This class gives the minimal constraints needed to define this prism. For common uses, see HasConstructor .

Instances

Instances details
Context0 ctor s t a b => AsConstructor0 ctor s t a b Source #
Instance details

Defined in Data.Generics.Sum.Constructors