{-# LANGUAGE FlexibleContexts #-}

module Jikka.Core.Parse
  ( run,
    parseProgram,
    parseExpr,
    parseType,
    parseRule,
  )
where

import Data.Text (Text, unpack)
import Jikka.Common.Alpha
import Jikka.Common.Error
import Jikka.Core.Language.Expr
import qualified Jikka.Core.Parse.Alex as L
import qualified Jikka.Core.Parse.Happy as P

parseRule :: (MonadAlpha m, MonadError Error m) => String -> m (String, [(VarName, Type)], Expr, Expr)
parseRule :: String -> m (String, [(VarName, Type)], Expr, Expr)
parseRule String
input = do
  [Token']
tokens <- String -> m [Token']
forall (m :: * -> *). MonadError Error m => String -> m [Token']
L.run String
input
  [Token'] -> m (String, [(VarName, Type)], Expr, Expr)
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
[Token'] -> m (String, [(VarName, Type)], Expr, Expr)
P.runRule [Token']
tokens

parseType :: (MonadAlpha m, MonadError Error m) => String -> m Type
parseType :: String -> m Type
parseType String
input = do
  [Token']
tokens <- String -> m [Token']
forall (m :: * -> *). MonadError Error m => String -> m [Token']
L.run String
input
  [Token'] -> m Type
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
[Token'] -> m Type
P.runType [Token']
tokens

parseExpr :: (MonadAlpha m, MonadError Error m) => String -> m Expr
parseExpr :: String -> m Expr
parseExpr String
input = do
  [Token']
tokens <- String -> m [Token']
forall (m :: * -> *). MonadError Error m => String -> m [Token']
L.run String
input
  [Token'] -> m Expr
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
[Token'] -> m Expr
P.runExpr [Token']
tokens

parseProgram :: (MonadAlpha m, MonadError Error m) => String -> m Program
parseProgram :: String -> m Program
parseProgram String
input = do
  [Token']
tokens <- String -> m [Token']
forall (m :: * -> *). MonadError Error m => String -> m [Token']
L.run String
input
  [Token'] -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
[Token'] -> m Program
P.runProgram [Token']
tokens

run :: (MonadAlpha m, MonadError Error m) => FilePath -> Text -> m Program
run :: String -> Text -> m Program
run String
_ Text
input = do
  [Token']
tokens <- String -> m [Token']
forall (m :: * -> *). MonadError Error m => String -> m [Token']
L.run (String -> m [Token']) -> String -> m [Token']
forall a b. (a -> b) -> a -> b
$ Text -> String
unpack Text
input
  [Token'] -> m Program
forall (m :: * -> *).
(MonadAlpha m, MonadError Error m) =>
[Token'] -> m Program
P.runProgram [Token']
tokens