2016-10-20 4 views
4

Reactive-banana는 동작 유형이 마지막 이벤트의 값인 경우 동작을 이벤트로 변환하는 (유형이 MonadMoment m => a -> Event a -> m (Behavior a) 인) 함수를 가지고 있습니다. 이벤트가 아직 발생하지 않은 경우 초기 값입니다.스테퍼와 동일한 네트워크가 있습니까?

내가 기억할 수없는 이름 인 Conal Elliott의 이야기에서 그는 사건과 행동에 대한 근본적인 조작 중 하나라고 표현합니다. 그러나, netwire에서 비슷한 기능을 찾을 수 없습니다.

a -> Wire s e m (Event a) a

  • 가 동등한 기능이 netwire 않습니다 netwire의 내 제한된 이해를 바탕으로, 나는 그것이 유형이 기대?
  • 그렇지 않은 경우 이것이 가능하지 않은 이유가 있습니까?
  • 비슷한 일이 가능한가? 즉, 이벤트를 행동으로 변환하는 방법이 있습니까?

답변

2

내가 찾고 있던 기능을 hold, in Control.Wire.Interval이라고합니다.

첫 번째 이벤트가 수신 될 때까지 와이어가 금지되므로 초기 값이 필요하지 않습니다. 이 동작이 필요한 경우이를 구현할 수 있습니다.

stepper init = hold <|> pure init 
0

Netwire가 제공하지 않는 이유는 추측 할 수 있습니다. Control.Wire.Event의 모든 내용은 언제 발생했는지에 대한 지식을 보존하는 Event의 결과를 유지합니다.

전환 방법 중 하나를 사용하여 Event을 벗어날 수 있습니다. Control.Wire.Switch. 당신은 rSwitch을 찾고 있습니다. pure 위 코드에서

-- Beware: untested, untype-checked code 
stepper :: (Monad m) => a -> Wire s e m (Event a) a 
stepper init = switcher . source 
    where 
    -- source :: Wire s e m (Event a) ((), Event (Wire s e m() a)) 
    source = arr (\e -> ((), pure <$> e)) 
    -- switcher :: Wire s e m ((), Event (Wire s e m() a)) a 
    switcher = rSwitch (pure init) 

은 사소한 배선을 만들 a -> Wire s e m() a로서 사용된다.