реактивный банан: как создать AddHandler? - PullRequest
14 голосов
/ 26 декабря 2011

В настоящее время я пытаюсь познакомиться с FRP через реактивный банан Генриха Апфельма , который, по-видимому, довольно хорошо документирован и прост, по сравнению с другими, на которые я смотрел.

Однако я не могу обернуть голову вокруг типа AddHandler . Допустим, я хочу использовать GLFW для получения щелчков мышью, чтобы у меня было что-то вроде eMouseButton :: Event (). Глядя на примеры, кажется, что мне как-то нужно было бы использовать fromAddHandler , но я понятия не имею, как собрать этот аргумент AddHandler. Я думаю, мне придется как-то использовать newAddHandler, но как?

Полагаю, пример того, как подключить reactive-banana к чему-то другому, чем wx, очень помог бы.

1 Ответ

14 голосов
/ 26 декабря 2011

newAddHandler используется следующим образом:

do (addHandler, fire) <- newAddHandler
   ...

addHandler - это AddHandler для передачи на reactive-banana, а fire - это функция типа a -> IO () (где - это тип вашего события), который вызывает событие.

Например, вы, вероятно, установите fire в качестве обратного вызова для события кнопки мыши GLFW, например:

registerMouseButton :: IO (Event MouseButton)
registerMouseButton = do
  (addHandler, fire) <- newAddHandler
  setMouseButtonCallback $ \button _ -> fire button
  fromAddHandler addHandler

(У меня нет опыта работы с GLFW, поэтому я не уверен, что является вторым аргументом для обратного вызова setMouseButtonCallback - если это важно, вам нужно соответствующим образом изменить эту реализацию.)

AddHandler - это просто функция, которая принимает обратный вызов - a -> IO () - и регистрирует его для рассматриваемого события;затем возвращает (из IO) действие IO (), используемое для отмены регистрации этого обработчика, в результате чего полное определение AddHandler читается следующим образом:

type AddHandler a = (a -> IO ()) -> IO (IO ())

Так откуда же появляется newAddHandler?Просто: newAddHandler поддерживает список обработчиков для события и активирует их при выполнении fire x.

Вам не нужно newAddHandler, если, как и GTK +, и многие другие распространенные наборы инструментов, ваш инструментарийуже есть средства для регистрации и отмены регистрации нескольких обработчиков событий;если это так, вы должны написать свою собственную реализацию AddHandler.Но если все, что он поддерживает, это один обратный вызов, вы должны использовать newAddHandler.

Обратите внимание, что вам никогда не нужно выставлять AddHandler s для самого кода, использующего FRP;это просто внутренний клей, используемый для создания Event s из внешних входов.

...