{-# LANGUAGE CPP #-} module Main where -------------------------------------------------------------------------------- import Paths_calculator (version) -------------------------------------------------------------------------------- import Calculator.Color (Color (..), bold, color) import Calculator.Evaluator.Base (evaluate) import Calculator.Prim.Bindings (Bindings) import Calculator.Prim.Definitions (defBinds) import Calculator.Prim.Result (Result (..)) -------------------------------------------------------------------------------- import Data.Version (showVersion) import System.Console.Haskeline -------------------------------------------------------------------------------- #ifdef PLOT import Control.Monad.IO.Class (liftIO) #endif -------------------------------------------------------------------------------- type Repl a = InputT IO a -------------------------------------------------------------------------------- repl :: Bindings -> Repl () repl b = do input <- getInputLine $ color Red True "calc> " case input of Nothing -> return () Just inp -> process b inp padOut :: Bindings -> String -> String -> Repl () padOut b s m = do outputStr . unlines . map (s ++) . lines $ m repl b process :: Bindings -> String -> Repl () process b inp = case evaluate b inp of Value c -> padOut b " == " $ show c Text t -> padOut b " ~~ " t Error e -> padOut b " !! " e NewBindings b' -> repl b' #ifdef PLOT Action io -> liftIO io >> repl b #endif -------------------------------------------------------------------------------- main :: IO () main = do putStrLn $ "calculator, version " ++ showVersion version ++ ". Use :? for help." runInputT defaultSettings (repl defBinds) putStrLn $ "Please report issues at: " ++ bold "https://github.com/sumitsahrawat/calculator/issues" --------------------------------------------------------------------------------