2015-09-13 2 views
1

Начиная с примера счетчика в реакционно Banana Wx, который использует нормальный Int сохранить статус счетчика:Реактивная Banana: Изменение статуса в данных

let networkDescription :: forall t. Frameworks t => Moment t() 
    networkDescription = do 
    eup <- event0 bup command 
    edown <- event0 bdown command 

    let 
     counter :: Behavior t Int 
     counter = accumB 0 $ ((+1) <$ eup) `union` (subtract 1 <$ edown) 

    sink output [text :== show <$> counter] 

network <- compile networkDescription 
actuate network 

как я могу заменить и обновить Int счетчик с более общий data как:

data Counter = Counter { 
    count :: Int 
} deriving (Show) 

let 
    counter :: Behavior t Counter 
    counter = accumB Counter { count = 0 } $ ?????? 

sink output [text :== show <$> count counter] 

Я не знаю, как относиться к внутренней count функции с чем-то вроде этого:

count = count mycounter + 1 

Любая идея?

ответ

3

Тип accumB является:

accumB :: a -> Event t (a -> a) -> Behavior t a 

Так что, если вы хотите определить Behavior t Counter с ним вы должны использовать события, которые несут Counter -> Counter функции:

-- For the sake of convenience... 
overCount :: (Int -> Int) -> Counter -> Counter 
overCount f c = c { count = f (count c) } 
counter = accumB Counter { count = 0 } $ 
    (overCount (+1) <$ eup) `union` (overCount (subtract 1) <$ edown) 
Смежные вопросы