2016-10-20 5 views
4

リアクションバナナには、stepper(タイプはMonadMoment m => a -> Event a -> m (Behavior a))という名前の関数があります。この関数は、ビヘイビアの値が最後のイベントの値であるビヘイビアまたはまだイベントが発生していない場合の初期値に変換します。ステッパーと同等のネットワーキングはありますか?

私が覚えていない名前のConal Elliottのトークでは、これはイベントと行動に関する基本的な操作の1つであることを示しています。しかし、私はネットワークで同様の機能を見つけることはできません。

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

  • は、同等の機能を持っていnetwire:netwireの私の限られた理解では、私はそれが型を持つことを期待しますか?
  • そうでない場合、これが不可能な理由はありますか?
  • 似たようなもの、つまりイベントを行動に変換する方法はありますか?

答えて

2

私が探していた機能は、hold, in Control.Wire.Intervalと呼ばれていました。

最初のイベントが受信されるまでワイヤが禁止されるため、これは初期値を必要としません。この動作が必要な場合は、同様に実装できます。

stepper init = hold <|> pure init 
0

なぜ私はネットワイヤがそれを提供しないのか推測できます。 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として使用されます。

関連する問題