Взаимозависимые сигналы
Голый вопрос:
Есть ли способ определения пары сигналов, которые зависят друг от друга в вязах?
Преамбула:
Я пытаюсь написать крошечную браузерную игру в стиле 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
...
он начинает работать как положено (за исключением того, что игроку разрешено тратить на негативные ресурсы, чего я и хотел бы избежать).
Есть идеи?