Salsa-0.1.0.1: Generator/Array.hs
--
-- Define instance members (Candidates and Invoker),
-- constructors (Candidates and Invoker),
-- properties, and
-- supertypes (SupertypesOf)
-- for all array types, in terms of the System.Array members they inherit.
--
-- Note that .NET arrays have no static members.
--
-- Instance methods for arrays are the same as the System.Array instance methods:
type instance Candidates (Obj (Arr t)) member = Candidates (Obj Array_) member
-- Delegate all array instance method invocations to System.Array:
instance Invoker (Obj Array_) m args => Invoker (Obj (Arr t)) m args where
type Result (Obj (Arr t)) m args = Result (Obj Array_) m args
rawInvoke t m args = rawInvoke (convert t :: Obj Array_) m args
-- There is one constructor for single-dimensional arrays which just calls the
-- static Array.CreateInstance method passing the appropriate type and length:
type instance Candidates (Arr t) Ctor = (Int32 ::: TNil) ::: TNil
instance Typeable t => Invoker (Arr t) Ctor (Int32) where
type Result (Arr t) Ctor (Int32) = IO (Obj (Arr t))
rawInvoke t m (len) = liftM cast $ _Array # _createInstance (typeOf (undefined :: t), len)
-- Delegate all array instance property gets/sets to System.Array:
instance Prop (Obj Array_) pn => Prop (Obj (Arr t)) pn where
type PropGT (Obj (Arr t)) pn = PropGT (Obj Array_) pn
getProp t = getProp (convert t :: Obj Array_)
type PropST (Obj (Arr t)) pn = PropST (Obj Array_) pn
setProp t = setProp (convert t :: Obj Array_)
-- All arrays derive directly from System.Array:
type instance SupertypesOf (Obj (Arr t)) = (Obj Array_) ::: SupertypesOf (Obj Array_)
-- Define the type code of single-dimension arrays in terms of the underlying
-- element type:
type instance TyCode (Obj (Arr t)) = D0 ::: DF ::: TyCode t
-- (Note the use of 'DF' to separate the type code of the element from the type code
-- of arrays in general.)
-- EXPERIMENTAL:
type instance FromTyCode (D0 ::: DF ::: t) = Obj (Arr (FromTyCode t))