{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE NoImplicitPrelude #-} module HWM.Core.Has ( Has (..), askEnv, HasAll, ) where import Relude class Has env a where obtain :: env -> a askEnv :: (MonadReader env m, Has env a) => m a askEnv :: forall env (m :: * -> *) a. (MonadReader env m, Has env a) => m a askEnv = (env -> a) -> m a forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a asks env -> a forall env a. Has env a => env -> a obtain type family HasAll env (xs :: [Type]) :: Constraint where HasAll _ '[] = () HasAll env (x ': xs) = (Has env x, HasAll env xs)