2013-09-28 41 views
1

我使用bacon.js,並有一些情況下信號是從兩個來源發出:是否有可能以某種方式節制「重複」培根動作?

sourceA :: EventStream a 
sourceB :: EventStream Bool 

sourceA被觸發,它應該觸發運行repeatedly到永久,當信號從發射除了一些行動sourceB。所以語法它可能是這樣的:

aAction = sourceA 
    . repeatedly (200, [1,2,3]) 
    . until  (sourceB) 

所以我基本上要求一個模takeWhiletakeUntil組合程序,但無法找到在源代碼或文檔這樣的功能。有什麼想法嗎?

這將會是更好的,如果有一個通用的組合子

throttleWhen :: Bool -> EventStream a 

throttleWhen' :: EventStream Bool -> EventStream a 

終止某些條件的任何臘肉事件流,我怎麼會去實現這樣的事情?

注意,下面這個方案:

faAction = sourceA . repeatedly (200, [1,2,3]) 
aAction = faAction . takeUntil (sourceB) 

節流導出流aAction,而不是原來的。

回答

2

如果我理解正確,你正在尋找一個combinator,在另一個流中出現truthy值時結束流。當b上出現真值時,您可以使用a.takeUntil(b.filter(Bacon._.id))結束流。如果b是屬性,則結果將立即結束,以防b在啓動時保留真值。

您的解決方案可能如下所示。

aAction = sourceA 
    .flatMap(function() { 
    return Bacon.repeatedly (200, [1,2,3]) 
     .takeUntil(sourceB.filter(Bacon._.id)) 
    }) 

這一個將開始新的流爲sourceA每個元素和終止,當truthy值顯示sourceB

或者,您可以a.takeWhile(b.not())如果b是屬性。如果Property具有真值,則立即結束。

所以,如果sourceB是拿着真/假一個屬性,你想,只有當它持有false發射值,可以

aAction = sourceA 
    .flatMap(function() { 
    return Bacon.repeatedly (200, [1,2,3]) 
     .takeWhile(sourceB.not()) 
    }) 
+0

我想我有培根的實現的概念時隔knowlege這裏。 Bacon.repeatedly(200,[1..3])是一種懶惰地產生無限價值流的行爲嗎?那麼在你的例子中,一旦行爲'takeUntil(...)'不再請求值,'Bacon.repeatedly'不會再生成更多值? – chibro2

+1

你是對的。 Bacon中的所有生成器函數確實是懶惰的,以及所有流數據源都應該是這樣,以便流用戶不必關心資源管理。培根負責根據需求自動分配資源。 – raimohanska

相關問題