proto-lens-0.7.1.7: src/Data/ProtoLens/Field.hs
{- | An implementation of overloaded record fields. This module
enables different types in the same module to have fields of the
same name.
To use instances from this class, either:
* Enable the @OverloadedLabels@ extension and
@import Data.ProtoLens.Labels ()@;
* Use the 'field' function along with the @TypeApplications@ extension; or,
* Import the corresponding names from the autogenerated @*_Fields@ module.
For more information, see <https://google.github.io/proto-lens/tutorial.html#field-overloading>.
-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.ProtoLens.Field
( HasField(..)
, field
) where
import GHC.Prim (Proxy#, proxy#)
import GHC.TypeLits (Symbol)
-- | A lens for a given field. For example:
--
-- > view field@"abc" x
-- > set field@"abc" 42 x
field :: forall x s a f . (HasField s x a, Functor f) => (a -> f a) -> s -> f s
field = fieldOf (proxy# :: Proxy# x)
-- | A type class for lens fields.
--
-- The instance @HasField s x a@ can be understood as "@s@ has a field named @x@
-- of type @a@".
class HasField s (x :: Symbol) a | s x -> a where
fieldOf :: Functor f => Proxy# x -> (a -> f a) -> s -> f s