{-# LANGUAGE BlockArguments, OverloadedStrings #-} {-# LANGUAGE TypeApplications #-} {-# OPTIONS_GHC -Wall -fno-warn-tabs #-} module Plugin.TypeCheck.Nat.Simple ( -- * PLUGIN plugin ) where import Prelude hiding (log) import GHC.Plugins (Plugin, Var, ppr) import Control.Monad.Try (tell) import Data.Log (Log, (.+.), fromSDoc, SDocStr) import Data.Derivation.CanDerive (canDerive, givens, wanted) import Plugin.TypeCheck.Nat.Simple.TypeCheckWith (typeCheckWith) import Plugin.TypeCheck.Nat.Simple.Decode (decode, decodeAll) type L = Log SDocStr Var -- | > type L = Log SDocStr Var -- > -- > plugin :: Plugin -- > plugin = typeCheckWith @L "Plugin.TypeCheck.Nat.Simple" \gs _ w -> -- > tell @L $ "givens: " .+. fromSDoc (ppr gs) -- > tell @L $ "wanted: " .+. fromSDoc (ppr w) -- > uncurry canDerive -- > =<< (,) <$> (givens =<< decodeAll gs) <*> (wanted =<< decode w) plugin :: Plugin plugin = typeCheckWith @L "Plugin.TypeCheck.Nat.Simple" \occ gs d w -> do tell @L $ "givens: " .+. fromSDoc (ppr gs) tell @L $ "derived: " .+. fromSDoc (ppr d) tell @L $ "wanted: " .+. fromSDoc (ppr w) uncurry canDerive =<< (,) <$> (givens =<< decodeAll occ gs) <*> (wanted =<< decode occ w)