ether-0.5.1.0: src/Ether/Internal/HasLens.hs
module Ether.Internal.HasLens
( LensLike
, Lens
, Lens'
, HasLens(..)
) where
import Data.Tagged
import Data.Coerce
type LensLike f s t a b = (a -> f b) -> s -> f t
type Lens s t a b = forall f. Functor f => LensLike f s t a b
type Lens' s a = Lens s s a a
class HasLens tag outer inner | tag outer -> inner where
lensOf :: Lens' outer inner
instance HasLens a a a where
lensOf = id
instance HasLens t (Tagged t a) a where
lensOf = \f -> fmap coerce . f . coerce