【发布时间】:2022-08-24 13:06:22
【问题描述】:
我有一个从reactive-banana repo 中获取的样本。这使用gloss。
但是当我处理事件时,我有自己的数据事件。这些事件不一定是 UI 事件。所以我期待 FRP 可以帮助我编写自定义事件。因此,例如,一个列表可能会改变,而改变的数据在一个事件中,而应用程序的另一部分使用改变的数据。
我初步的 Haskell 知识并没有帮助我使用reactive-banana 实现这一目标,但我确实遇到了something similar。
如何使用我自己的事件,如makeTickEvent 并触发它们?它可以保存数据吗?
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Control.Monad (when)
import Data.Maybe (isJust, fromJust)
import Data.List (nub)
import System.Random
import System.IO
import Debug.Trace
import Data.IORef
import Reactive.Banana as R
import Reactive.Banana.Frameworks as R
import Graphics.Gloss
import Graphics.Gloss.Data.Extent
import Graphics.Gloss.Interface.Pure.Game
import Graphics.Gloss.Data.Picture
main :: IO()
main = do
sources <- makeSources
network <- compile $ networkDescription sources
actuate network
eventLoop sources
display windowDisplay white drawBoard
windowDisplay :: Display
windowDisplay = InWindow \"Window\" (200, 200) (10, 10)
makeTickEvent :: MomentIO (R.Event ())
makeTickEvent = do
(etick, tick) <- newEvent
tid <- liftIO $ do
tick ()
pure etick
drawBoard :: Picture
drawBoard =
Pictures $ [ translate x y $ rectangleWire 90 90| x<-[0,90..180], y<-[0,90..180] ]
makeSources = newAddHandler
type EventSource a = (AddHandler a, a -> IO ())
addHandler :: EventSource a -> AddHandler a
addHandler = fst
eventLoop :: (EventSource ()) -> IO ()
eventLoop (displayvalueevent) =
fire displayvalueevent ()
fire :: EventSource a -> a -> IO ()
fire = snd
networkDescription :: (EventSource ()) -> MomentIO ()
networkDescription ( displayvalueevent )= do
-- Obtain events
displayvalue <- fromAddHandler (addHandler displayvalueevent)
reactimate $ putStrLn . showValue <$> displayvalue
showValue value = \"Value is \" ++ show value
这是来自文档。
plainChanges :: Behavior a -> MomentIO (Event a)
plainChanges b = do
(e, handle) <- newEvent
eb <- changes b
reactimate\' $ (fmap handle) <$> eb
return e
这会创建一个可以触发的新事件吗?
-
我发现很难理解你在问什么,但你是否在寻找
fromAddHandler? -
我正在寻找一种使用封装数据声明新事件的方法,例如 \'makeTickEvent\'。并解雇他们。我无法理解 \'newEvent\' 的工作原理。我认为。
标签: haskell frp reactive-banana