{-# 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)