2016-04-04 10 views
1

Bei einem Signal, wie erhält man seine historischen Werte?Ulme - historischer Wert eines Signals

So etwas wie

--current value 
Signal.pastValue(0, Mouse.x) 

--previous value 
Signal.pastValue(1, Mouse.x) 

--previous nth value 
Signal.pastValue(n, Mouse.x) 

Ich habe versucht, Signal.foldp verwenden, aber es scheint, dass es entweder einen Strom oder akkumulierten Wert abhängig von der Ereignisnummer zurückgibt.

Antwort

3

Elm nicht im Auge behalten von historischen Werten auf seinem eigenen, aber sie foldp verwenden könnten eine Liste von jeder Art von Signal so zu bauen:

history : Signal a -> Signal (List a) 
history = 
    Signal.foldp (::) [] 

Das jüngste Wertsignal zu dem vorangestellt Liste. Um zu sehen, sie in Aktion, konnte man hinter diesem vollständigen Beispiel in http://elm-lang.org/try

import Graphics.Element exposing (show) 
import Mouse 

main = 
    Signal.map show <| history Mouse.x 

history : Signal a -> Signal (List a) 
history = 
    Signal.foldp (::) [] 

dieses Beispiel Laufen vergießen kann Licht auf, warum sind historische Werte standardmäßig nicht gehalten: Sie können schnell Ihr Gedächtnis aufblasen. Nichtsdestoweniger, elm-reactor s Time-travelling Debugger hält Geschichte herum, aber nur für Debugging-Zwecke. Das ist normalerweise nicht in der Produktion erwünscht.

+0

Vielen Dank - ich habe es angepasst an 'Signal.map show <| Signal.map2 getHistory (Signal.constant 2) (makeHistory Mouse.isDown) 'zum Beispiel, um die aktuellen und aktuellen Signalwerte beizubehalten. Es ist ziemlich erstaunlich, wie die obige 'history'-Funktion den' (: :) 'Operator verwendet. – category

Verwandte Themen