@@ -98,6 +98,10 @@ Since MonadHold depends on MonadSample, any [S] function also runs in [H] contex
9898[ ] <> :: Monoid a => Behavior a -> Behavior a -> Behavior a
9999-- ... plus many more due to typeclass membership
100100
101+-- Combine multiple behaviors via applicative instance
102+[ ] ffor2 :: Behavior a -> Behavior b -> (a -> b -> c) -> Behavior c
103+[ ] ffor3 :: Behavior a -> Behavior b -> Behavior c -> (a -> b -> c -> d) -> Behavior d
104+
101105-- Behavior to Behavior by sampling current values
102106[S] sample :: Behavior a -> m a
103107[ ] pull :: m a -> Behavior a
@@ -135,6 +139,10 @@ Since MonadHold depends on MonadSample, any [S] function also runs in [H] contex
135139[ ] >>= :: Dynamic a -> (a -> Dynamic b) -> Dynamic b
136140[ ] zipDynWith :: (a -> b -> c) -> Dynamic a -> Dynamic b -> Dynamic c
137141
142+-- Combine multiple dynamics via applicative instance
143+[ ] ffor2 :: Dynamic a -> Dynamic b -> (a -> b -> c) -> Dynamic c
144+[ ] ffor3 :: Dynamic a -> Dynamic b -> Dynamic c -> (a -> b -> c -> d) -> Dynamic d
145+
138146-- Efficient one-to-many fanout
139147[ ] demux :: Ord k => Dynamic k -> Demux k
140148[ ] demuxed :: Eq k => Demux k -> k -> Dynamic Bool