generic-optics-lite-0.1: Monomorphic field opics like with generic-lens

Safe HaskellNone
LanguageHaskell2010

Data.Generics.Optics.Lite

Description

Derive record field lenses generically.

Usage with labels in Optics.Label

Optics.Label provides LabelOptic class which powers the OverloadedLabels instance for optics type.

It's possible to use HasField and field to derive instances generically. If we have a simple record type which has Generic instance:

data Ex = Ex { exA :: Int, exB :: Char } deriving (Generic)

We can derive LabelOptic instances for all its fields at once:

instance (HasField name Ex a, a ~ b) => LabelOptic name A_Lens Ex Ex a b where
    labelOptic = field @name

Note: GHC will ask you to enable a lot of extensions, do it. Youn need to enable UndecidableInstances in particular to make FunctionalDependencies check pass.

Synopsis

Documentation

field :: forall (name :: Symbol) (r :: Type) (a :: Type). HasField name r a => Lens' r a Source #

A lens that focuses on a field with a given name. Compatible with the optics package's Lens type.

Note: the lens is simple, i.e. doesn't allow type-changing updates. This keeps the implementation small and quick.

You also may want to specify {-# OPTIONS_GHC -funfolding-keeness-factor=100 #-} (or some other arbitrarily large number) for GHC to inline more aggressively.

class HasField (name :: Symbol) r a | name r -> a #

Type-class restricting field usage.

Minimal complete definition

field__

Instances
HasFieldInternal name r a => HasField name r a 
Instance details

Defined in Data.Generics.Lens.Lite

Methods

field__ :: Proxy name -> LensLikeYoneda' f r a

HasField name (Void1 a) a 
Instance details

Defined in Data.Generics.Lens.Lite

Methods

field__ :: Proxy name -> LensLikeYoneda' f (Void1 a) a