packages feed

rerefined-0.2.0: src/Rerefined/Refine/TH.hs

module Rerefined.Refine.TH
  ( refineTH
  , refine1TH
  ) where

import Rerefined.Refine
import Rerefined.Predicate
import Language.Haskell.TH.Syntax qualified as TH

-- | Refine @a@ with predicate @p@ at compile time via Template Haskell.
refineTH
    :: forall p a m
    .  (Refine p a, TH.Lift a, TH.Quote m, MonadFail m)
    => a
    -> TH.Code m (Refined p a)
refineTH = either refineTHFail TH.liftTyped . refine @p @a

-- | Refine @f a@ with functor predicate @p@ at compile time via Template
--   Haskell.
refine1TH
    :: forall p f a m
    .  (Refine1 p f, TH.Lift (f a), TH.Quote m, MonadFail m)
    => f a
    -> TH.Code m (Refined1 p f a)
refine1TH = either refineTHFail TH.liftTyped . refine1 @p @f

-- | Template Haskell refinement failure helper.
refineTHFail :: forall a m. MonadFail m => RefineFailure String -> TH.Code m a
refineTHFail = TH.liftCode . fail . prettyRefineFailure