packages feed

formura-1.0: src/Formura/Type.hs

{-# LANGUAGE DataKinds, FlexibleInstances, TypeSynonymInstances #-}
module Formura.Type where

import Algebra.Lattice
import Data.Tuple(swap)

import Formura.Language.Combinator
import Formura.Syntax


type ElementalType = Lang '[TopTypeF, ElemTypeF]

instance MeetSemiLattice ElementalType where
  (ElemType ea) /\ (ElemType eb) =
    case elementTypenameDecode(max (elementTypenameEncode ea) (elementTypenameEncode eb)) of
     "top" -> TopType
     str   -> ElemType str
  _ /\ _ = TopType

elementTypenameTable :: [(String,Int)]
elementTypenameTable =
      [("Rational", 0)
      ,("float", 1)
      ,("double", 2)
      ,("real", 3)
      ,("Real", 4)]


elementTypenameEncode :: String -> Int
elementTypenameEncode str = case lookup str elementTypenameTable of
  Just i -> i
  Nothing -> maxBound



elementTypenameDecode :: Int -> String
elementTypenameDecode i = case lookup i (map swap elementTypenameTable) of
  Just n -> n
  Nothing -> "top"