{-# LANGUAGE TypeInType, FlexibleInstances, MultiParamTypeClasses, TypeFamilies, AllowAmbiguousTypes, ScopedTypeVariables, TypeApplications, TypeOperators #-} module Instances where import Clr import Clr.Bridge import Clr.Resolver import Clr.TypeString import Clr.Marshal import Data.Coerce import Data.Int import Data.Word import Foreign.ForeignPtr import Data.Text -- Just for testing. Actual use is BStr type instance BridgeTypePrim T_string = String -- Also just for this test. newtype ObjectID t = ObjectID (ForeignPtr Int) type instance BridgeTypeObject t = ObjectID t instance {-# OVERLAPS #-} Marshal (Object t) (ObjectID t) where marshal (Object x) f = f $ coerce x instance {-# OVERLAPS #-} (TString t) => Marshal (ObjectID t) (Object t) where marshal x f = f (Object $ coerce x) instance {-# OVERLAPPING #-} (TString t) => Unmarshal (ObjectID t) (Object t) where unmarshal oid = return $ Object $ coerce oid -- Synonyms while we have to still write this manually type T_Console = T "System.Console" '[] type T_BaseType = T "BaseType" '[] type T_DerivedType = T "DerivedType" '[] type T_StringIntDel = T "StringIntDel" '[] -- Synonyms for methods type T_WriteLine = T "WriteLine" '[] type T_Foo = T "Foo" '[] type T_Bar = T "Bar" '[] type T_Add = T "Add" '[] type instance SuperTypes T_BaseType = '[ T_object ] type instance SuperTypes T_DerivedType = '[ T_BaseType ] type instance SuperTypes (T "MyGenType" '[gt0]) = '[ T_object, T "IEnumerable" '[], T "IEnumerable" '[gt0] ] type instance Members T_BaseType = '[T_Foo, T_Bar] type instance Members T_DerivedType = '[T_Foo] type instance Members (T "MyGenType" '[gt0]) = '[T_Add] type instance Candidates T_Console T_WriteLine = '[ '[T_string], '[T_string, T_string] ] type instance Candidates T_BaseType T_BaseType = '[ '[] ] type instance Candidates T_BaseType T_Foo = '[ '[ T_string ], '[ T_long ], '[ T_int ] ] type instance Candidates T_BaseType T_Bar = '[ '[ T_string ], '[ T_long ], '[ T_int ] ] type instance Candidates T_DerivedType T_DerivedType = '[ '[] ] type instance Candidates T_DerivedType T_Foo = '[ '[ T_string ], '[ T_long ], '[ T_int ]] type instance Candidates (T "MyGenType" '[gt0]) (T "MyGenType" '[gt0]) = '[ '[] ] type instance Candidates (T "MyGenType" '[gt0]) (T_Add) = '[ '[ gt0 ] ] writeLineRaw1 :: String -> IO String writeLineRaw1 cs = return "Console.WriteLine(String)" writeLineRaw2 :: String -> String -> IO String writeLineRaw2 cs1 cs2 = return "Console.WriteLine(String,String)" rawInvokeBaseTypeFooStr :: ObjectID t -> String -> IO String rawInvokeBaseTypeFooStr d s = return "BaseType.Foo(String)" rawInvokeBaseTypeFooInt64 :: ObjectID t -> Int64 -> IO String rawInvokeBaseTypeFooInt64 d s = return "BaseType.Foo(Int64)" rawInvokeBaseTypeFooInt32 :: ObjectID t -> Int32 -> IO String rawInvokeBaseTypeFooInt32 d s = return "BaseType.Foo(Int32)" rawInvokeDerivedTypeStr :: ObjectID t -> String -> IO String rawInvokeDerivedTypeStr d s = return "DerivedType.Foo(String)" rawInvokeDerivedTypeInt64 :: ObjectID t -> Int64 -> IO String rawInvokeDerivedTypeInt64 d s = return "DerivedType.Foo(Int64)" rawInvokeDerivedTypeInt32 :: ObjectID t -> Int32 -> IO String rawInvokeDerivedTypeInt32 d s = return "DerivedType.Foo(Int32)" rawInvokeBaseTypeBarStr :: ObjectID t -> String -> IO String rawInvokeBaseTypeBarStr d s = return "BaseType.Bar(String)" rawInvokeBaseTypeBarInt64 :: ObjectID t -> Int64 -> IO String rawInvokeBaseTypeBarInt64 d s = return "BaseType.Bar(Int64)" rawInvokeBaseTypeBarInt32 :: ObjectID t -> Int32 -> IO String rawInvokeBaseTypeBarInt32 d s = return "BaseType.Bar(Int32)" rawInvokeMyGenTypeAddStr :: ObjectID t -> String -> IO String rawInvokeMyGenTypeAddStr oid s = return "MyGenType.Add(String)" rawInvokeMyGenTypeAddInt :: ObjectID t -> Int32 -> IO String rawInvokeMyGenTypeAddInt oid s = return "MyGenType.Add(Int32)" instance MethodResultS1 T_Console T_WriteLine T_string where type ResultTypeS1 T_Console T_WriteLine T_string = T_string instance MethodInvokeS1 T_Console T_WriteLine T_string where rawInvokeS1 = writeLineRaw1 instance MethodResultS2 T_Console T_WriteLine T_string T_string where type ResultTypeS2 T_Console T_WriteLine T_string T_string = T_string instance MethodInvokeS2 T_Console T_WriteLine T_string T_string where rawInvokeS2 = writeLineRaw2 instance Constructor1 T_BaseType () where rawNew1 () = return (ObjectID undefined) instance MethodResultI1 T_BaseType T_Foo T_string where type ResultTypeI1 T_BaseType T_Foo T_string = T_string instance MethodInvokeI1 T_BaseType T_Foo T_string where rawInvokeI1 = rawInvokeBaseTypeFooStr instance MethodResultI1 T_BaseType T_Foo T_long where type ResultTypeI1 T_BaseType T_Foo T_long = T_string instance MethodInvokeI1 T_BaseType T_Foo T_long where rawInvokeI1 = rawInvokeBaseTypeFooInt64 instance MethodResultI1 T_BaseType T_Foo T_int where type ResultTypeI1 T_BaseType T_Foo T_int = T_string instance MethodInvokeI1 T_BaseType T_Foo T_int where rawInvokeI1 = rawInvokeBaseTypeFooInt32 instance MethodResultI1 T_BaseType T_Bar T_string where type ResultTypeI1 T_BaseType T_Bar T_string = T_string instance MethodInvokeI1 T_BaseType T_Bar T_string where rawInvokeI1 = rawInvokeBaseTypeBarStr instance MethodResultI1 T_BaseType T_Bar T_long where type ResultTypeI1 T_BaseType T_Bar T_long = T_string instance MethodInvokeI1 T_BaseType T_Bar T_long where rawInvokeI1 = rawInvokeBaseTypeBarInt64 instance MethodResultI1 T_BaseType T_Bar T_int where type ResultTypeI1 T_BaseType T_Bar T_int = T_string instance MethodInvokeI1 T_BaseType T_Bar T_int where rawInvokeI1 = rawInvokeBaseTypeBarInt32 instance Constructor1 T_DerivedType () where rawNew1 () = return (ObjectID undefined) instance MethodResultI1 T_DerivedType T_Foo T_string where type ResultTypeI1 T_DerivedType T_Foo T_string = T_string instance MethodInvokeI1 T_DerivedType T_Foo T_string where rawInvokeI1 = rawInvokeDerivedTypeStr instance MethodResultI1 T_DerivedType T_Foo T_long where type ResultTypeI1 T_DerivedType T_Foo T_long = T_string instance MethodInvokeI1 T_DerivedType T_Foo T_long where rawInvokeI1 = rawInvokeDerivedTypeInt64 instance MethodResultI1 T_DerivedType T_Foo T_int where type ResultTypeI1 T_DerivedType T_Foo T_int = T_string instance MethodInvokeI1 T_DerivedType T_Foo T_int where rawInvokeI1 = rawInvokeDerivedTypeInt32 instance Constructor1 (T "MyGenType" '[gt0]) () where rawNew1 () = return (ObjectID undefined) instance MethodResultI1 (T "MyGenType" '[T_string]) T_Add T_string where type ResultTypeI1 (T "MyGenType" '[T_string]) T_Add T_string = T_string instance MethodInvokeI1 (T "MyGenType" '[T_string]) T_Add T_string where rawInvokeI1 = rawInvokeMyGenTypeAddStr instance MethodResultI1 (T "MyGenType" '[T_int]) T_Add T_int where type ResultTypeI1 (T "MyGenType" '[T_int]) T_Add T_int = T_string instance MethodInvokeI1 (T "MyGenType" '[T_int]) T_Add T_int where rawInvokeI1 = rawInvokeMyGenTypeAddInt instance Delegate T_StringIntDel where type DelegateArgTypes T_StringIntDel = '[ T_string ] type DelegateResultType T_StringIntDel = T_int instance DelegateConstructor1 T_StringIntDel where rawConstructDelegate1 f = return (ObjectID undefined :: ObjectID T_StringIntDel) instance Marshal String Text where marshal s f = f $ pack s