Основываясь на моем предыдущем вопросе, настройки которого я постепенно уточнял (Как создать монадическое поведение в реактивном банане):
Предположим, что есть eKey
, событие, запускаемое при каждом нажатии клавиши, b
типа Buffer
, которое модифицируется соответствующим образом всякий раз, когда поддерживаемое событие происходит в eKey
, и, наконец, есть IO
действия, которые необходимо выполнить для некоторых событий. Эти IO
действия зависят от состояния b
(для простоты предположим, что они выводят текущее состояние b
на консоль).
В настоящее время у меня есть это, чтобы выбрать действие, которое происходит в событии:
getKeyAction :: KeyVal -> Maybe (IO Buffer -> IO Buffer)
getKeyAction 65288 = Just . liftM $ backspace
getKeyAction 65293 = Just $ \mb -> do
b <- mb
print $ "PRESSED ENTER: " ++ toString b
return emptyBuffer
getKeyAction 65360 = Just . liftM $ leftMost
getKeyAction 65361 = Just . liftM $ left
...
getKeyAction _ = Nothing
и тогда я делаю:
let
eBufferActions = filterJust $ getKeyAction <$> eKey
bBuffer = accumB (return emptyBuffer) eBufferActions -- model `b`
eBuffer <- changes bBuffer
reactimate' $ fmap displayBuffer <$> eBuffer
для некоторых displayBuffer :: IO Buffer -> IO ()
.
Похоже, это не работает так, как предполагалось. Состояние bBuffer
, по-видимому, заново оценивается для каждого события (фактически выполняются все действия IO
, собранные до сих пор, каждый раз, когда происходит событие), что имеет смысл, когда я думаю об этом в ретроспективе.
Как я должен реорганизовать свой код, чтобы сделать это правильно? (т.е. IO
действий видят текущее состояние буфера, ничего кроме буфера не накапливается)
Если бы я мог построить Event
, который имеет значение bBuffer
в случае соответствующего события eKey
, тогда я мог бы просто сопоставить свое специальное действие IO
с ним и reactimate
. Как вы думаете? Как это сделать? Добьется ли <@
того, что я пытаюсь сделать? Но как мне отложить текущее изменение на b
, связанное с текущим нажатием клавиши, после того, как я сделаю снимок b
с <@
, чтобы отобразить Buffer -> IO ()
поверх него?