ivory-0.1.0.0: src/Ivory/Language/SizeOf.hs
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
module Ivory.Language.SizeOf where
import Ivory.Language.Area
import Ivory.Language.Proxy
import Ivory.Language.Type
import GHC.TypeLits (SingI,Sing,sing)
class IvoryArea t => IvorySizeOf (t :: Area *) where
sizeOfBytes :: Proxy t -> Integer
instance (SingI len, IvorySizeOf area) => IvorySizeOf (Array len area) where
sizeOfBytes _ =
fromTypeNat (sing :: Sing len) * sizeOfBytes (Proxy :: Proxy area)
-- | Get the size of an ivory type.
sizeOf :: (IvorySizeOf t, IvoryExpr a, Num a) => Proxy t -> a
sizeOf = fromInteger . sizeOfBytes