generic-lens-0.5.1.0: Generic data-structure operations exposed as lenses.

Copyright(C) 2017 Csongor Kiss
LicenseBSD3
MaintainerCsongor Kiss <kiss.csongor.kiss@gmail.com>
Stabilityexperimental
Portabilitynon-portable
Safe HaskellSafe
LanguageHaskell2010

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
>>> :m +Data.Generics.Internal.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 (Generic, 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.

Minimal complete definition

_Ctor

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

(Generic s, ErrorUnless ctor s (HasCtorP * ctor (Rep s)), Generic t, (~) * s' (Proxied * s), (~) * t' (Proxied * t), Generic s', Generic t', GAsConstructor' ctor (Rep s) a, GAsConstructor' ctor (Rep s') a', GAsConstructor ctor (Rep s) (Rep t) a b, (~) * t (Infer s a' b), GAsConstructor' ctor (Rep t') b', (~) * s (Infer t b' a)) => AsConstructor ctor s t a b Source # 

Methods

_Ctor :: Prism s t a b Source #