polysemy-1.9.2.0: src/Polysemy/Internal/CustomErrors.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_HADDOCK not-home, prune #-}
-- | Description: type-errors-pretty redefinitions
module Polysemy.Internal.CustomErrors
( WhenStuck
, FirstOrder
, type (<>)
, type (%)
) where
import Data.Kind
import Fcf
import GHC.TypeLits (Symbol)
import Type.Errors hiding (IfStuck, UnlessStuck, WhenStuck)
import Polysemy.Internal.CustomErrors.Redefined
import Polysemy.Internal.Kind
-- These are taken from type-errors-pretty because it's not in stackage for 9.0.1
-- See https://github.com/polysemy-research/polysemy/issues/401
type family ToErrorMessage (t :: k) :: ErrorMessage where
ToErrorMessage (t :: Symbol) = 'Text t
ToErrorMessage (t :: ErrorMessage) = t
ToErrorMessage t = 'ShowType t
infixl 5 <>
type family (<>) (l :: k1) (r :: k2) :: ErrorMessage where
l <> r = ToErrorMessage l ':<>: ToErrorMessage r
infixr 4 %
type family (%) (t :: k1) (b :: k2) :: ErrorMessage where
t % b = ToErrorMessage t ':$$: ToErrorMessage b
data FirstOrderErrorFcf :: k -> Symbol -> Exp Constraint
type instance Eval (FirstOrderErrorFcf e fn) = $(te[t|
UnlessPhantom
(e PHANTOM)
( "'" <> e <> "' is higher-order, but '" <> fn <> "' can help only"
% "with first-order effects."
% "Fix:"
% " use '" <> fn <> "H' instead."
) |])
------------------------------------------------------------------------------
-- | This constraint gives helpful error messages if you attempt to use a
-- first-order combinator with a higher-order type.
type FirstOrder (e :: Effect) fn = UnlessStuck e (FirstOrderErrorFcf e fn)
data DoError :: ErrorMessage -> Exp k
type instance Eval (DoError a) = TypeError a