{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Ext.Failure
  ( Failure (..),
  )
where

import Relude

-- Failure: for custom Morpheus GrapHQL errors
class Applicative f => Failure error (f :: * -> *) where
  failure :: error -> f v

instance Failure error (Either error) where
  failure :: error -> Either error v
failure = error -> Either error v
forall error v. error -> Either error v
Left

instance (Monad m, Failure errors m) => Failure errors (ReaderT ctx m) where
  failure :: errors -> ReaderT ctx m v
failure = m v -> ReaderT ctx m v
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m v -> ReaderT ctx m v)
-> (errors -> m v) -> errors -> ReaderT ctx m v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. errors -> m v
forall error (f :: * -> *) v. Failure error f => error -> f v
failure