删除了早期版本的Elm中的keepWhen
函数。我已经从0.14移植了一个Elm应用程序,但是我一直试图让它的一部分工作,它正在使用keepWhen
。
所以基本上我正在寻找像
这样的功能keepWhen : Signal Bool -> a -> Signal a -> Signal a
我找到了
filter : (a -> Bool) -> a -> Signal a -> Signal a
但这不是一回事,我还没弄明白如何让它发挥作用。
答案 0 :(得分:4)
最简单的方法是使用Signal.Extra.keepWhen
包中的signal-extra
(完全披露:我是作者)
请注意,实施并非完全无关紧要。这是包中的实现(some text1 some text2 <img src="2.jpg>"
模块导入不合格):
Signal
与kqr's answer中版本的重要区别在于keepWhen : Signal Bool -> a -> Signal a -> Signal a
keepWhen boolSig a aSig =
zip boolSig aSig
|> sampleOn aSig
|> keepIf fst (True, a)
|> map snd
,当布尔输入发生变化时,它会使sampleOn
的输出不会更新。两个过滤器之间的区别在于,来自0.14的keepWhen
实际上仅过滤来自keepWhen
输入的更新事件,并且在布尔输入变为a
时不对其进行采样。
另一个实现也是名为sampleWhen
的信号额外实现。
如果你对大理石图有所了解,那么these old diagrams可能有所帮助。我将在下面发布相关内容的屏幕截图。
您阅读这些图表的方式:
请注意,标记为旧行为的第二个图表与kqr的答案中的代码行为相匹配。
答案 1 :(得分:2)
我已经按照{0}中的keepWhen
重新实现了Signal.filter
。这取决于观察Signal.filter
使用信号的值来决定是否丢弃或保持信号值,以及您可以组合两个信号以获得新信号(Signal.map2 (,)
)的事实。
如果您将Signal Bool
与最终想要的Signal a
合并,那么您可以在Signal (a, Bool)
中获取Signal.filter
,只需提取Bool
值决定是否要保留该值。
该功能如下所示:
keepWhen : Signal Bool -> a -> Signal a -> Signal a
keepWhen cond def val =
let combined = Signal.map2 (,) val cond
filtered = Signal.filter snd (def, False) combined
final = Signal.map fst filtered
in final
首先将“值”信号与Bool
信号配对以获得Signal (a, Bool)
。然后它根据其中的Bool
过滤该信号,最后剥离Bool
并仅保留“真实”值。
你可以在这里看到它:http://share-elm.com/sprout/553c01afe4b06aacf0e8985a。如果您将鼠标靠近(0,0)角,它将不会更新,但当您将鼠标移动到更右侧时,它将再次开始更新信号。