{-# LANGUAGE AllowAmbiguousTypes #-}
module Rerefined.Predicate
( Refine(validate)
, Refine1(validate1)
, RefineFailure(..)
, Predicate(..)
, KnownPredicateName
, predicateName
) where
import GHC.Exts ( Proxy#, proxy# )
import Data.Text.Builder.Linear qualified as TBL
import GHC.TypeLits ( Natural, Symbol, KnownSymbol, symbolVal' )
class Predicate p where
type PredicateName (d :: Natural) p :: Symbol
type KnownPredicateName p = KnownSymbol (PredicateName 0 p)
predicateName :: forall p. KnownPredicateName p => String
predicateName :: forall {k} (p :: k). KnownPredicateName p => String
predicateName = Proxy# (PredicateName 0 p) -> String
forall (n :: Symbol). KnownSymbol n => Proxy# n -> String
symbolVal' (forall {k} (a :: k). Proxy# a
forall (a :: Symbol). Proxy# a
proxy# @(PredicateName 0 p))
class Predicate p => Refine p a where
validate :: Proxy# p -> a -> Maybe RefineFailure
class Predicate p => Refine1 p f where
validate1 :: Proxy# p -> f a -> Maybe RefineFailure
data RefineFailure = RefineFailure
{ RefineFailure -> Builder
refineFailurePredicate :: TBL.Builder
, RefineFailure -> Builder
refineFailureDetail :: TBL.Builder
, RefineFailure -> [RefineFailure]
refineFailureInner :: [RefineFailure]
} deriving stock Int -> RefineFailure -> ShowS
[RefineFailure] -> ShowS
RefineFailure -> String
(Int -> RefineFailure -> ShowS)
-> (RefineFailure -> String)
-> ([RefineFailure] -> ShowS)
-> Show RefineFailure
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RefineFailure -> ShowS
showsPrec :: Int -> RefineFailure -> ShowS
$cshow :: RefineFailure -> String
show :: RefineFailure -> String
$cshowList :: [RefineFailure] -> ShowS
showList :: [RefineFailure] -> ShowS
Show