Señales mutuamente dependientes
Pregunta desnuda:
¿Hay alguna forma de definir un par de señales que dependen unas de otras en Elm?
Preámbulo:
Estoy tratando de escribir un pequeño juego de navegador estilo Cookie-clicker en el que el jugador reúne recursos, luego los gasto para comprar construcciones autónomas de recolección de recursos que se vuelven más caras a medida que se compran. Eso implica tres señales relevantes:gathered
(cuántos recursos ha reunido el jugador),spent
(cuánto recurso ha gastado el jugador) ycost
(cuánto cuesta una actualización).
Aquí hay una implementación:
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 ]
Esto se compila bien, pero cuando lo incrusto en un archivo HTML con los botones apropiados conectados para enviar mensajes a los puertos apropiados arriba, aparece el error
s2 is undefined
Open the developer console for more details.
El problema parece ser que, como está escrito,cost
depende decanAfford
, que depende debalance
, que depende despent
, que depende decost
de nuevo.
Si modifico la línea de costo de modo que
...
cost = foldp (+) 0 <| sampleOn build costIncrement
...
comienza a funcionar como se esperaba (excepto que el jugador puede gastar en recursos negativos, que es lo que me gustaría evitar).
¿Algunas ideas?