miso
Copyright(C) 2016-2026 David M. Johnson
LicenseBSD3-style (see the file LICENSE)
MaintainerDavid M. Johnson <code@dmj.io>
Stabilityexperimental
Portabilitynon-portable
Safe HaskellNone
LanguageHaskell2010

Miso.Lens.Generic

Description

Overview

Miso.Lens.Generic derives Lens values for record fields at compile time using GHC.Generics and GHC.Records, without Template Haskell. Fields are addressed by name via OverloadedLabels or the explicit field combinator.

Enable the required extensions:

{-# LANGUAGE OverloadedLabels, DeriveGeneric #-}
import GHC.Generics (Generic)
import Miso.Lens.Generic (HasLens, field)
import Miso.Lens         (Lens, view, set, (.=), (++=))

Quick start

data Counter = Counter { _count :: Int, _label :: MisoString }
  deriving (Generic)

-- Label syntax (requires OverloadedLabels):
countLens :: Lens Counter Int
countLens = #_count

-- Explicit syntax (works without OverloadedLabels):
labelLens :: Lens Counter MisoString
labelLens = field @"_label"

update :: Action -> Effect p props Counter Action
update Increment = #_count += 1
update (SetLabel l) = #_label .= l

How it works

The HasLens instance is resolved via HasField for the getter and a generic traversal (GSet) for the setter. A type-level TotalityCheck produces a descriptive compile error if the field name is absent from (or inconsistent across) the constructors.

Comparison with Template Haskell

Overloaded labels
Miso.Lens.Generic — no TH; derives via Generic
Template Haskell
Miso.Lens.THmakeLenses / makeClassy

See also

Documentation

class Generic s => HasLens (name :: Symbol) s a | name s -> a where Source #

Methods

getLens :: Lens s a Source #

Instances

Instances details
(HasField name s a, TotalityCheck name s a (GetFieldType name (Rep s)), GSet name a (Rep s), Generic s) => HasLens name s a Source # 
Instance details

Defined in Miso.Lens.Generic

Methods

getLens :: Lens s a Source #

field :: forall (name :: Symbol) s a. HasLens name s a => Lens s a Source #

Orphan instances

HasLens name s a => IsLabel name (Lens s a) Source # 
Instance details

Methods

fromLabel :: Lens s a #