{-# LANGUAGE FlexibleContexts, ScopedTypeVariables #-}
module Graphics.Implicit.ExtOpenScad (runOpenscad) where
import Prelude(String, Either(Left, Right), IO, ($), fmap)
import Graphics.Implicit.Definitions (SymbolicObj2, SymbolicObj3)
import Graphics.Implicit.ExtOpenScad.Definitions (VarLookup, OVal)
import Graphics.Implicit.ExtOpenScad.Parser.Statement (parseProgram)
import Graphics.Implicit.ExtOpenScad.Eval.Statement (runStatementI)
import Graphics.Implicit.ExtOpenScad.Default (defaultObjects)
import Graphics.Implicit.ExtOpenScad.Util.OVal (divideObjs)
import qualified Text.Parsec.Error as Parsec (ParseError)
import qualified Control.Monad as Monad (mapM_)
import qualified Control.Monad.State as State (runStateT)
import qualified System.Directory as Dir (getCurrentDirectory)
runOpenscad :: String -> Either Parsec.ParseError (IO (VarLookup, [SymbolicObj2], [SymbolicObj3]))
runOpenscad source =
let
initial = defaultObjects
rearrange :: forall t t1 t2 t3 t4. (t, (t4, [OVal], t1, t2, t3)) -> (t4, [SymbolicObj2], [SymbolicObj3])
rearrange (_, (varlookup, ovals, _ , _ , _)) = (varlookup, obj2s, obj3s) where
(obj2s, obj3s, _ ) = divideObjs ovals
in case parseProgram source of
Left e -> Left e
Right sts -> Right
$ fmap rearrange
$ (\sts' -> do
path <- Dir.getCurrentDirectory
State.runStateT sts' (initial, [], path, (), () )
)
$ Monad.mapM_ runStatementI sts