# Pastebin ml4glWWt -- type SourceEnv t = (Text, Behavior t (Map (Int, SomeTypeRep) Bool)) instance (MonadIO m, MonadIO (HostFrame t), ReflexHost t, Reflex t, Ref m ~ IORef) => HasSource t js ( SourceT t js (HydratableT (PostBuildT t (StaticDomBuilderT t (PerformEventT t m)) )) ) where fetchData :: forall query. (Typeable query, Fetch query, Hashable (Args query), FromJSON query) => Event t (Args query) -> SourceT t js (HydratableT (PostBuildT t (StaticDomBuilderT t (PerformEventT t m)) )) (Event t (Either String query)) fetchData queryE = do (_endpoint, cache) <- ask lookupCache :: Map (Int, SomeTypeRep) SomeTypeRep <- sample cache performEvent $ do coincidence $ ffor queryE $ \(args) -> do case Map.lookup (hash args, someTypeRep (Proxy :: Proxy query)) lookupCache of Just (rep) -> case typeRep @query `eqTypeRep` (typeOf rep) of Just HRefl -> (pure $ Right rep) <$ queryE Nothing -> fetch xhrFetch <$> queryE Nothing -> fetch xhrFetch <$> queryE where xhrFetch queryBS = do runReq defaultHttpConfig $ do r <- req POST -- method (http "graphql.localhost") -- safe by construction URL (ReqBodyLbs queryBS) -- use built-in options or add your own lbsResponse -- specify how to interpret response (port 3000) -- query params, headers, explicit port number, etc. pure $ responseBody r