module Control.Provide where
import Data.Proxy
import Data.Kind (Type)
type family ProviderTypeContext provider
type family ValueType (t :: Type) (a :: Type) :: Type
class provider `Provides` key where
provided :: ValueType (ProviderTypeContext provider) key
infix 4 `Provides`
providedP :: forall key provider. provider `Provides` key => Proxy provider -> ValueType (ProviderTypeContext provider) key
providedP :: forall key provider.
Provides provider key =>
Proxy provider -> ValueType (ProviderTypeContext provider) key
providedP Proxy provider
_ = forall provider key.
Provides provider key =>
ValueType (ProviderTypeContext provider) key
provided @provider @key