{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
module Ivory.Language.SizeOf where
import Ivory.Language.Area
import Ivory.Language.Proxy
import qualified Ivory.Language.Syntax as AST
import Ivory.Language.Type
class IvorySizeOf (t :: Area *) where
instance IvorySizeOf ('Struct sym) where
instance (ANat len, IvorySizeOf area) => IvorySizeOf ('Array len area) where
instance IvoryType area => IvorySizeOf ('Stored area) where
sizeOf :: (IvoryArea t, IvorySizeOf t, IvoryExpr a, Num a) => Proxy t -> a
sizeOf = wrapExpr . AST.ExpSizeOf . ivoryArea