module Data.Extensible.Class (
Extensible(..)
, piece
, pieceAssoc
, itemAt
, item
, itemAssoc
, Membership
, mkMembership
, Member(..)
, remember
#if __GLASGOW_HASKELL__ >= 800
, type (∈)
#else
, (∈)()
#endif
, FindType
, Assoc(..)
, Associate(..)
, FindAssoc
, Elaborate
, Elaborated(..)
) where
import Data.Extensible.Internal
import Data.Extensible.Internal.Rig (Optic')
import Data.Extensible.Wrapper
import Data.Profunctor
class (Functor f, Profunctor p) => Extensible f p (t :: (k -> *) -> [k] -> *) where
pieceAt :: Membership xs x -> Optic' p f (t h xs) (h x)
piece :: (x ∈ xs, Extensible f p t) => Optic' p f (t h xs) (h x)
piece = pieceAt membership
pieceAssoc :: (Associate k v xs, Extensible f p t) => Optic' p f (t h xs) (h (k ':> v))
pieceAssoc = pieceAt association
itemAt :: (Wrapper h, Extensible f p t) => Membership xs x -> Optic' p f (t h xs) (Repr h x)
itemAt m = pieceAt m . _Wrapper
item :: (Wrapper h, Extensible f p t, x ∈ xs) => proxy x -> Optic' p f (t h xs) (Repr h x)
item p = piece . _WrapperAs p
itemAssoc :: (Wrapper h, Extensible f p t, Associate k v xs)
=> proxy k -> Optic' p f (t h xs) (Repr h (k ':> v))
itemAssoc p = pieceAssoc . _WrapperAs (proxyKey p)
proxyKey :: proxy k -> Proxy (k ':> v)
proxyKey _ = Proxy