Взаимозависимые сигналы

Голый вопрос:

Есть ли способ определения пары сигналов, которые зависят друг от друга в вязах?

Преамбула:

Я пытаюсь написать крошечную браузерную игру в стиле Cookie-clicker, в которой игрок собирает ресурсы, а затем тратит их на покупку автономных конструкций для сбора ресурсов, которые становятся дороже по мере их приобретения. Это подразумевает три соответствующих сигнала:gathered (сколько ресурсов собрал игрок),spent (сколько ресурсов игрок уже потратил) иcost (сколько стоит апгрейд).

Вот реализация:

module Test where

import Mouse
import Time

port gather : Signal Bool
port build : Signal String

costIncrement = constant 50
cost = foldp (+) 0 <| keepWhen canAfford 0 <| sampleOn build costIncrement
nextCost = lift2 (+) cost costIncrement

spent = foldp (+) 0 <| merges [ sampleOn build cost ]

gathered = foldp (+) 0 <| merges [ sampleOn gather <| constant 1, sampleOn tick tickIncrement ]

balance = lift round <| lift2 (-) gathered spent

canAfford = lift2 (>) balance <| lift round nextCost

tickIncrement = foldp (+) 0 <| sampleOn cost <| constant 0.01
tick = sampleOn (every Time.millisecond) <| constant True

main = lift (flow down) <| combine [ lift asText balance, lift asText canAfford, lift asText spent, lift asText gathered, lift asText nextCost ]

Это компилируется нормально, но когда я встраиваю его в файл HTML с соответствующими кнопками, подключенными для отправки сообщений на соответствующие порты выше, я получаю ошибку

s2 is undefined
    Open the developer console for more details.

Проблема заключается в том, что, как написано,cost зависит отcanAfford, который зависит отbalance, который зависит отspent, который зависит отcost снова.

Если я изменю строку стоимости так, чтобы

...
cost = foldp (+) 0 <| sampleOn build costIncrement
...

он начинает работать как положено (за исключением того, что игроку разрешено тратить на негативные ресурсы, чего я и хотел бы избежать).

Есть идеи?

Ответы на вопрос(1)

Ваш ответ на вопрос