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

-- TODO support for IMPLICIT rules