packages feed

lambda-cube-0.1.0.0: src/LambdaCube/SystemFw/TH.hs

module LambdaCube.SystemFw.TH where

import           Control.Monad                  ((<=<))
import qualified Data.Text                      as Text
import           LambdaCube.SystemFw.Ast
import           LambdaCube.SystemFw.Elaborator
import           LambdaCube.SystemFw.Parser
import           Language.Haskell.TH.Quote      (QuasiQuoter (..))
import           Language.Haskell.TH.Syntax     (Loc (loc_start), Q, lift,
                                                 location)
import qualified Text.Megaparsec                as P
import qualified Text.Megaparsec.Error          as PE

systemFw :: QuasiQuoter
systemFw =
  QuasiQuoter
    { quoteExp = lift <=< systemFwQuoteExp
    , quotePat = undefined
    , quoteType = undefined
    , quoteDec = undefined
    }

systemFwQuoteExp :: String -> Q ExtLCTerm
systemFwQuoteExp str = do
  l <- location
  case P.parse pTopLC ("<quote at " <> show (loc_start l) <> ">") (Text.pack str) of
    Right e  -> pure e
    Left err -> fail $ PE.errorBundlePretty err

elaboratedSystemFw :: QuasiQuoter
elaboratedSystemFw =
  QuasiQuoter
    { quoteExp = lift <=< elaboratedSystemFwQuoteExp
    , quotePat = undefined
    , quoteType = undefined
    , quoteDec = undefined
    }

elaboratedSystemFwQuoteExp :: String -> Q LCTerm
elaboratedSystemFwQuoteExp str = do
  e <- systemFwQuoteExp str
  case elaborate e of
    Right e' -> pure e'
    Left err -> fail err