-- | Evaluate AST terms to types in the type representation.

module Language.Fortran.Repr.Eval.Type where

import qualified Language.Fortran.AST as F
import Language.Fortran.Repr.Type
import Language.Fortran.Repr.Eval.Common

fromExpression
    :: forall m a. (MonadEval m, EvalTo m ~ FType)
    => F.Expression a -> m (Either String FType)
fromExpression :: forall (m :: * -> *) a.
(MonadEval m, EvalTo m ~ FType) =>
Expression a -> m (Either String FType)
fromExpression = \case
  F.ExpValue a
_ SrcSpan
_ (F.ValVariable String
name) ->
    forall (m :: * -> *). MonadEval m => String -> m (Maybe (EvalTo m))
lookupFVar String
name forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Maybe FType
Nothing  -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left String
"no such variable found TODO"
      Just FType
val -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a b. b -> Either a b
Right FType
val