module Data.Apiary.Extension.Internal where
newtype Initializer i m o = Initializer
{unInitializer :: Extensions i -> m (Extensions o)}
data Extensions (es :: [*]) where
NoExtension :: Extensions '[]
AddExtension :: (e :: *) -> Extensions es -> Extensions (e ': es)
class Has a (as :: [*]) where
getExtension :: proxy a -> Extensions as -> a
instance Has a (a ': as) where
getExtension _ (AddExtension a _) = a
instance Has a as => Has a (a' ': as) where
getExtension p (AddExtension _ as) = getExtension p as