2016-04-04 5 views
1

Учитывая сигнал, как получить его исторические ценности?elm - историческое значение сигнала

Что-то вроде

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

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

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

Я попытался с помощью Signal.foldp, но это, кажется, что он либо возвращает текущий или накопленное значение, зависящее от числа событий.

ответ

3

Elm не уследить исторических ценностей сама по себе, но вы можете использовать foldp для создания списка любого типа сигнала, как это:

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

Самое последнее значение сигнала предваряется что список. Для того, чтобы увидеть его в действии, вы могли бы мимо этого полный пример, в 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 (::) [] 

Запуск этот пример может пролить свет на то, почему исторические ценности не сохраняются по умолчанию: Вы можете быстро раздуваться вашу память. При этом elm-reactor отвлекающий от времени отладчик сохраняет историю вокруг, но только для целей отладки. Это не то, что вы обычно хотели бы получить на производстве.

+0

Большое спасибо - я адаптировал его к 'Signal.map show <| Signal.map2 getHistory (Signal.constant 2) (makeHistory Mouse.isDown) 'например, чтобы сохранить текущие и текущие значения Signal. Удивительно, как эта функция 'history' использует оператор' (: :) '. – category