The view code:
<lift:surround with="default" at="content">
<lift:snippet type="CountGame:run" form="POST">
<choose:guess>
Guess a number between 1 and 100.<br/>
Last guess: <count:last/><br />
Guess: <count:input/><br/>
<input type="submit" value="Guess"/>
</choose:guess>
<choose:win>
You Win!!<br />
You guessed <count:number/> after <count:count/> guesses.<br/>
</choose:win>
</lift:snippet>
</lift:surround>
The Snippet:
class CountGame extends StatefulSnippet {
val dispatch: DispatchIt = {
case "run" if lastGuess == number =>
xhtml => win(chooseTemplate("choose", "win", xhtml))
case "run" =>
xhtml => nextGuess(chooseTemplate("choose", "guess", xhtml))
}
def win(xhtml: NodeSeq) = bind("count", xhtml, "number" --> number,
"count" --> count)
def nextGuess(xhtml: NodeSeq) = bind("count", xhtml,
"input" --> text("", guess _),
"last" -->
lastGuess.map(v =>
if (v < number) v+" is low"
else v+" is high").
openOr("Make first Guess"))
private def guess(in: String) {
count += 1
lastGuess = Full(toInt(in))
}
private val number = 1 + randomInt(100)
private var lastGuess: Can[Int] = Empty
private var count = 0
}