packages feed

hakaru-0.3.0: commands/Disintegrate.hs

{-# LANGUAGE OverloadedStrings, PatternGuards, DataKinds, GADTs #-}

module Main where

import           Language.Hakaru.Pretty.Concrete
import           Language.Hakaru.Syntax.TypeCheck
import           Language.Hakaru.Syntax.IClasses

import           Language.Hakaru.Types.Sing
import           Language.Hakaru.Disintegrate
import           Language.Hakaru.Evaluation.ConstantPropagation
import           Language.Hakaru.Command

import           Data.Text
import qualified Data.Text.IO as IO
import           System.IO (stderr)

import           System.Environment

main :: IO ()
main = do
  args  <- getArgs
  progs <- mapM readFromFile args
  case progs of
      [prog] -> runDisintegrate prog
      _      -> IO.hPutStrLn stderr "Usage: disintegrate <file>"

runDisintegrate :: Text -> IO ()
runDisintegrate prog =
    case parseAndInfer prog of
    Left  err                -> IO.hPutStrLn stderr err
    Right (TypedAST typ ast) ->
        case typ of
          SMeasure (SData (STyCon sym `STyApp` _ `STyApp` _) _)
            | Just Refl <- jmEq1 sym sSymbol_Pair
            -> case determine (disintegrate ast) of
               Just ast' -> print . pretty $ constantPropagation ast'
               Nothing   -> IO.hPutStrLn stderr "No disintegration found"
          _ -> IO.hPutStrLn stderr "Can only disintegrate a measure over pairs"