packages feed

nirum-0.1.0: src/Nirum/Constructs/TypeExpression.hs

{-# LANGUAGE OverloadedStrings #-}
module Nirum.Constructs.TypeExpression (TypeExpression(..), toCode) where

import Data.String (IsString(fromString))

import qualified Data.Text as T

import Nirum.Constructs (Construct(toCode))
import Nirum.Constructs.Identifier (Identifier)

-- | Refers a type.
data TypeExpression
    = TypeIdentifier { identifier :: Identifier }
    | OptionModifier { type' :: TypeExpression }
    | SetModifier { elementType :: TypeExpression }
    | ListModifier { elementType :: TypeExpression }
    | MapModifier { keyType :: TypeExpression
                  , valueType :: TypeExpression
                  }
    deriving (Eq, Ord, Show)

instance Construct TypeExpression where
    toCode (TypeIdentifier id') = toCode id'
    toCode (OptionModifier type_) = toCode type_ `T.snoc` '?'
    toCode (SetModifier element) =
        '{' `T.cons` toCode element `T.snoc` '}'
    toCode (ListModifier element) =
        '[' `T.cons` toCode element `T.snoc` ']'
    toCode (MapModifier key value) =
        T.concat ["{", toCode key, ": ", toCode value, "}"]

instance IsString TypeExpression where
    fromString string = TypeIdentifier (fromString string :: Identifier)