content: {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE LambdaCase #-}
  
  -- | Main library entry point.
  
  module JL where
  
  import           Data.Aeson
  import           Data.ByteString.Lazy (ByteString)
  import qualified Data.Map.Strict as M
  import           Data.Text (Text)
  import qualified Data.Text.IO as T
  import           JL.Functions
  import           JL.Inferer
  import           JL.Interpreter
  import           JL.Parser
  import           JL.Printer
  import           JL.Serializer
  import           JL.Types
  
  repl :: Text -> ByteString -> IO ()
  repl inp js =
    case decode js of
      Nothing -> error "Invalid JSON"
      Just j ->
        case parseText "" inp of
          Left err -> error (show err)
          Right expr0 -> do
            T.putStrLn
              (prettyExp expr <> " : " <>
               prettyType (infer context expr (map TypeVariable [1 ..])))
            T.putStrLn
              (prettyCore
                 (eval (foldl (\e (v, f) -> subst v f e) (desugar expr) (M.toList scope))))
            where expr = ApplicationExpression expr0 (valueToExpression j)
  