| | 27 | class (Typeable a, Ord a, Typeable1 m, Monad m) => Boxable m a | a -> m where |
| | 28 | classOfBox :: a -> MI m |
| | 29 | fromObjBox :: Invocant m -> m a |
| | 30 | |
| | 31 | (...) :: forall t a b (m :: * -> *). (Show b, Boxable m b) => t -> (a -> b) -> (t, a -> m (Invocant m)) |
| | 32 | (...) x y = (x, mkObj . y) |
| | 33 | |
| | 34 | (!!!) :: forall t a1 (m :: * -> *) a. (Show a, Boxable m a) => t -> (a1 -> m a) -> (t, a1 -> m (Invocant m)) |
| | 35 | (!!!) x y = (x, mkObjM . y) |
| | 36 | |
| | 37 | mkObj :: (Show a, Boxable m a) => a -> m (Invocant m) |
| | 38 | mkObj x = return $ MkInvocant x (class_interface (classOfBox x)) |
| | 39 | |
| | 40 | mkObjM :: (Show a, Boxable m a) => m a -> m (Invocant m) |
| | 41 | mkObjM x = do |
| | 42 | x' <- x |
| | 43 | return $ MkInvocant x' (class_interface (classOfBox x')) |
| | 44 | |
| | 45 | mkBoxClass :: forall t (m :: * -> *) (m1 :: * -> *). |
| | 46 | ( Method m1 (AnyMethod m1) |
| | 47 | , Code m1 (HsCode m) |
| | 48 | , Typeable t |
| | 49 | , Typeable1 m |
| | 50 | , Monad m |
| | 51 | , Typeable1 m1 |
| | 52 | , Method m1 (SimpleMethod m1) |
| | 53 | ) => String -> [(String, t -> m (Invocant m))] -> MI m1 |
| | 54 | mkBoxClass cls methods = newMI MkMI |
| | 55 | { clsParents = [] |
| | 56 | , clsRoles = [] |
| | 57 | , clsAttributes = [] |
| | 58 | , clsPublicMethods = newCollection' methodName $ map mkBoxMethod methods |
| | 59 | , clsPrivateMethods = newCollection [] |
| | 60 | , clsName = cls |
| | 61 | } |
| | 62 | |
| | 63 | mkBoxMethod :: forall t (m1 :: * -> *) (m :: * -> *). |
| | 64 | ( Method m (SimpleMethod m) |
| | 65 | , Code m (HsCode m1) |
| | 66 | , Typeable t |
| | 67 | , Typeable1 m1 |
| | 68 | , Monad m1 |
| | 69 | ) => (String, t -> m1 (Invocant m1)) -> AnyMethod m |
| | 70 | mkBoxMethod (meth, fun) = AnyMethod $ MkSimpleMethod |
| | 71 | { smName = meth |
| | 72 | , smDefinition = MkMethodCompiled $ HsCode $ \args -> do |
| | 73 | str <- fromInvocant args |
| | 74 | fun str -- Note that we expect "fun" to be monadic |
| | 75 | } |