{-# LANGUAGE GADTs                 #-}
{-# LANGUAGE InstanceSigs          #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Language.Drasil.Literal.Lang where

import Language.Drasil.Space (Space (..))
import Language.Drasil.WellTyped (Typed(..), TypingContext, TypeError,
  typeCheckByInfer)

data Literal where
    Int      :: Integer -> Literal
    Str      :: String -> Literal
    Dbl      :: Double -> Literal
    ExactDbl :: Integer -> Literal
    Perc     :: Integer -> Integer -> Literal
    deriving Literal -> Literal -> Bool
(Literal -> Literal -> Bool)
-> (Literal -> Literal -> Bool) -> Eq Literal
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Literal -> Literal -> Bool
== :: Literal -> Literal -> Bool
$c/= :: Literal -> Literal -> Bool
/= :: Literal -> Literal -> Bool
Eq

instance Typed Literal Space where
  infer :: TypingContext Space -> Literal -> Either TypeError Space
  infer :: TypingContext Space -> Literal -> Either String Space
infer TypingContext Space
_ (Int Integer
_)      = Space -> Either String Space
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Space
Integer
  infer TypingContext Space
_ (Str String
_)      = Space -> Either String Space
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Space
String
  infer TypingContext Space
_ (Dbl Double
_)      = Space -> Either String Space
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Space
Real
  infer TypingContext Space
_ (ExactDbl Integer
_) = Space -> Either String Space
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Space
Real
  infer TypingContext Space
_ (Perc Integer
_ Integer
_)   = Space -> Either String Space
forall a. a -> Either String a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Space
Real

  check :: TypingContext Space -> Literal -> Space -> Either TypeError Space
  check :: TypingContext Space -> Literal -> Space -> Either String Space
check = TypingContext Space -> Literal -> Space -> Either String Space
forall e t.
Typed e t =>
TypingContext t -> e -> t -> Either String t
typeCheckByInfer