@@ -16,6 +16,7 @@ module Reflex.PerformEvent.Base where
17import Reflex.Class
17import Reflex.Class
18import Reflex.Host.Class
18import Reflex.Host.Class
19+import Reflex.PostBuild.Class
19import Reflex.PerformEvent.Class
20import Reflex.PerformEvent.Class
21import Control.Lens
22import Control.Lens
@@ -52,6 +53,10 @@ deriving instance ReflexHost t => MonadFix (PerformEventT t m)
52deriving instance (ReflexHost t, MonadIO (HostFrame t)) => MonadIO (PerformEventT t m)
53deriving instance (ReflexHost t, MonadIO (HostFrame t)) => MonadIO (PerformEventT t m)
53deriving instance (ReflexHost t, MonadException (HostFrame t)) => MonadException (PerformEventT t m)
54deriving instance (ReflexHost t, MonadException (HostFrame t)) => MonadException (PerformEventT t m)
56+instance (PrimMonad (HostFrame t), ReflexHost t) => PrimMonad (PerformEventT t m) where
57+ type PrimState (PerformEventT t m) = PrimState (HostFrame t)
58+ primitive = PerformEventT . lift . primitive
55instance (ReflexHost t, Ref m ~ Ref IO, PrimMonad (HostFrame t)) => PerformEvent t (PerformEventT t m) where
60instance (ReflexHost t, Ref m ~ Ref IO, PrimMonad (HostFrame t)) => PerformEvent t (PerformEventT t m) where
56 type Performable (PerformEventT t m) = HostFrame t
61 type Performable (PerformEventT t m) = HostFrame t
57 {-# INLINABLE performEvent_ #-}
62 {-# INLINABLE performEvent_ #-}
@@ -153,21 +158,15 @@ runRequestT (RequestT a) responses = do
153 (result, requests) <- runReaderT (runStateT a mempty) $ fan $ mapKeyValuePairsMonotonic (\(t :=> e) -> WrapArg t :=> Identity e) <$> responses
158 (result, requests) <- runReaderT (runStateT a mempty) $ fan $ mapKeyValuePairsMonotonic (\(t :=> e) -> WrapArg t :=> Identity e) <$> responses
154 return (result, mergeWith DMap.union requests)
159 return (result, mergeWith DMap.union requests)
156−requesting_ :: (Reflex t, PrimMonad m) => Event t (request a) -> RequestT t request response m ()
161+instance (Reflex t, PrimMonad m) => MonadRequest t (RequestT t request response m) where
157−requesting_ req = do
162+ type Request (RequestT t request response m) = request
159− RequestT $ modify $ (:) $ DMap.singleton t <$> req
161−withRequesting :: (Reflex t, PrimMonad m) => (Event t (response a) -> RequestT t request response m (Event t (request a), r)) -> RequestT t request response m r
163+ type Response (RequestT t request response m) = response
162−withRequesting a = do
164+ withRequesting a = do
163− t <- lift newTag
165+ t <- lift newTag
164− s <- RequestT ask
166+ s <- RequestT ask
165− (req, result) <- a $ select s $ WrapArg t
167+ (req, result) <- a $ select s $ WrapArg t
166− RequestT $ modify $ (:) $ DMap.singleton t <$> req
168+ RequestT $ modify $ (:) $ DMap.singleton t <$> req
167− return result
169+ return result
169−requesting :: (Reflex t, PrimMonad m) => Event t (request a) -> RequestT t request response m (Event t (response a))
170−requesting req = withRequesting $ return . (,) req
172data DMapTransform (a :: *) k k' v v' = forall (b :: *). DMapTransform !(k a -> k' b) !(v a -> v' b)
171data DMapTransform (a :: *) k k' v v' = forall (b :: *). DMapTransform !(k a -> k' b) !(v a -> v' b)
@@ -217,6 +216,48 @@ sequenceDMapWithAdjustRequestTWith f (dm0 :: DMap k (RequestT t request response
217-- RequestT $ modify $ (:) $ coincidence $ ffor requests' $ \(PatchDMap p) -> mergeWith DMap.union $ catMaybes $ ffor (DMap.toList p) $ \(Const2 _ :=> Compose me) -> me -- We could make it prompt like this, but this seems to be slower than just delaying the PostBuild event to allow this stuff to settle (which is more similar to the previous behavior anyway)
216-- RequestT $ modify $ (:) $ coincidence $ ffor requests' $ \(PatchDMap p) -> mergeWith DMap.union $ catMaybes $ ffor (DMap.toList p) $ \(Const2 _ :=> Compose me) -> me -- We could make it prompt like this, but this seems to be slower than just delaying the PostBuild event to allow this stuff to settle (which is more similar to the previous behavior anyway)
218 return (result0, result')
217 return (result0, result')
219+instance PerformEvent t m => PerformEvent t (RequestT t request response m) where
220+ type Performable (RequestT t request response m) = Performable m
221+ performEvent_ = lift . performEvent_
222+ performEvent = lift . performEvent
224+instance PostBuild t m => PostBuild t (RequestT t request response m) where
225+ getPostBuild = lift getPostBuild
227+instance TriggerEvent t m => TriggerEvent t (RequestT t request response m) where
228+ newTriggerEvent = lift newTriggerEvent
229+ newTriggerEventWithOnComplete = lift newTriggerEventWithOnComplete
230+ newEventWithLazyTriggerWithOnComplete = lift . newEventWithLazyTriggerWithOnComplete
232+instance MonadReader r m => MonadReader r (RequestT t request response m) where
234+ local f (RequestT a) = RequestT $ mapStateT (mapReaderT $ local f) a
235+ reader = lift . reader
238+withRequestT :: forall t m a (req :: * -> *) (req' :: * -> *).
239+ (Reflex t, MonadHold t m, MonadFix m)
240+ => (forall x. request x -> request' x)
241+ -> (forall x. response' x -> response x)
242+ -> RequestT t request response m a
243+ -> RequestT t request' response m a
244+withRequestT f g m = RequestT $ hoist (hoist (withDynamicWriterT f')) (unRequestT m)
246+ f' :: Event t [(y, Some request)] -> Event t [(y, Some request')]
247+ f' = fmap . fmap . fmap $ \(SomeRequest req) -> SomeRequest $ f req
250+instance MonadRef m => MonadRef (RequestT t request response m) where
251+ type Ref (RequestT t request response m) = Ref m
252+ newRef = lift . newRef
253+ readRef = lift . readRef
254+ writeRef r = lift . writeRef r
256+instance MonadReflexCreateTrigger t m => MonadReflexCreateTrigger t (RequestT t request response m) where
257+ newEventWithTrigger = lift . newEventWithTrigger
258+ newFanEventWithTrigger f = lift $ newFanEventWithTrigger f
220--------------------------------------------------------------------------------
261--------------------------------------------------------------------------------
221-- Helpers
262-- Helpers
222--------------------------------------------------------------------------------
263--------------------------------------------------------------------------------