{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
module Rerefined.Predicate.Via where
import Rerefined.Predicate.Common
import TypeLevelShow.Utils
import GHC.Exts ( Proxy# )
data Via pVia p
instance (Predicate p, Predicate pVia)
=> Predicate (Via pVia p) where
type PredicateName d (Via pVia p) = ShowParen (d > 9)
("Via " ++ PredicateName 10 p ++ " " ++ PredicateName 10 pVia)
instance (Refine pVia a, Predicate p, KnownPredicateName p)
=> Refine (Via pVia p) a where
validate :: Proxy# (Via pVia p) -> a -> Maybe RefineFailure
validate Proxy# (Via pVia p)
_p a
a =
case Proxy# pVia -> a -> Maybe RefineFailure
forall {k} (p :: k) a.
Refine p a =>
Proxy# p -> a -> Maybe RefineFailure
validate (forall (a :: k). Proxy# a
forall {k} (a :: k). Proxy# a
proxy# @pVia) a
a of
Maybe RefineFailure
Nothing -> Maybe RefineFailure
forall a. Maybe a
Nothing
Just RefineFailure
e -> Proxy# p -> Builder -> [RefineFailure] -> Maybe RefineFailure
forall {k} (p :: k).
(Predicate p, KnownPredicateName p) =>
Proxy# p -> Builder -> [RefineFailure] -> Maybe RefineFailure
validateFail (forall (a :: k). Proxy# a
forall {k} (a :: k). Proxy# a
proxy# @p) Builder
"via" [RefineFailure
e]
validateVia
:: forall pVia p a
. (Refine pVia a, Predicate p, KnownPredicateName p)
=> Proxy# p -> a -> Maybe RefineFailure
validateVia :: forall {k} {k} (pVia :: k) (p :: k) a.
(Refine pVia a, Predicate p, KnownPredicateName p) =>
Proxy# p -> a -> Maybe RefineFailure
validateVia Proxy# p
_p = Proxy# (Via pVia p) -> a -> Maybe RefineFailure
forall {k} (p :: k) a.
Refine p a =>
Proxy# p -> a -> Maybe RefineFailure
validate (forall a. Proxy# a
forall {k} (a :: k). Proxy# a
proxy# @(Via pVia p))