將外部事件注入庫中

這個例子並沒有繫結任何具體的 GUI 工具包,例如 reactive-banana-wx。相反,它顯示瞭如何將正式的 IO 行動注入 FRP 機制。

Control.Event.Handler 模組提供了 addHandler 功能,可以建立一對 AddHandler aa -> IO () 值。前者由反應香蕉本身用於獲得 Event a 值,而後者是用於觸發相應事件的普通函式。

import Data.Char (toUpper)

import Control.Event.Handler
import Reactive.Banana

main = do
    (inputHandler, inputFire) <- newAddHandler

在我們的例子中,處理程式的 a 引數是 String 型別,但允許編譯器推斷的程式碼將在稍後寫入。

現在我們定義描述我們的 FRP 驅動系統的 EventNetwork。這是使用 compile 函式完成的:

main = do
    (inputHandler, inputFire) <- newAddHandler
    compile $ do
        inputEvent <- fromAddHandler inputHandler

fromAddHandler 函式將 AddHandler a 值轉換為 Event a,這將在下一個示例中介紹。

最後,我們啟動事件迴圈,它會觸發使用者輸入的事件:

main = do
    (inputHandler, inputFire) <- newAddHandler
    compile $ do
        ...
    forever $ do
        input <- getLine
        inputFire input