{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Ivory.Language.CArray where
import Ivory.Language.Area
import Ivory.Language.Proxy
import Ivory.Language.Ref
import Ivory.Language.Struct
import Ivory.Language.Type
import qualified Ivory.Language.Syntax as I
instance IvoryArea a => IvoryArea ('CArray a) where
ivoryArea _ = I.TyCArray (ivoryArea (Proxy :: Proxy a))
class (IvoryArea area, IvoryArea rep)
=> ToCArray (area :: Area *) (rep :: Area *) | area -> rep
instance (ANat len, ToCArray area rep)
=> ToCArray ('Array len area) ('CArray rep)
instance IvoryType a => ToCArray ('Stored a) ('Stored a)
instance IvoryStruct sym => ToCArray ('Struct sym) ('Struct sym)
toCArray :: forall s len area rep ref.
( ANat len, ToCArray area rep, IvoryRef ref
, IvoryExpr (ref s ('Array len area))
, IvoryExpr (ref s ('CArray rep)))
=> ref s ('Array len area) -> ref s ('CArray rep)
toCArray ref = wrapExpr $ I.ExpSafeCast ty (unwrapExpr ref)
where ty = ivoryType (Proxy :: Proxy (ref s ('CArray rep)))