module
coffeemachine
// (c)
MJP 2007
//
// This is just a demo of a coffeemachine
programmed with iTasks combinators
import
StdEnv, iTasks, iDataTrivial
Start
world = doHtmlServer (singleUserTask
0 True (foreverTask CoffeeMachine))
world
CoffeeMachine :: Task (String,Int)
CoffeeMachine
= [Txt
"Choose product:",Br,Br]
?>> chooseTask [("Coffee:
100", return_V
(100,"Coffee"))
,("Cappucino: 150", return_V
(150,"Cappucino"))
,("Tea: 50",
return_V (50, "Tea"))
,("Chocolate: 100", return_V
(100,"Chocolate"))
]
=>> \(toPay,product)
-> [Txt ("Chosen product:
" <+++ product),Br,Br]
?>> getCoins (toPay,0)
=>> \(cancel,returnMoney)
-> let nproduct
= if cancel "Cancelled" product in
[Txt
("product = " <+++ nproduct <+++
", returned money = " <+++ returnMoney),Br,Br]
?>> buttonTask "Thanks" (return_V
(nproduct,returnMoney))
getCoins :: (Int,Int)
-> Task (Bool,Int)
getCoins (cost,paid)
= newTask "getCoins"
getCoins`
where
getCoins`
= [Txt
("To pay: " <+++ cost),Br,Br]
?>> chooseTask [(c +++> " cents",
return_V (False,c)) \\ c
<- coins]
-||-
buttonTask "Cancel" (return_V (True,0))
=>> handleMoney
handleMoney
(cancel,coin)
| cancel =
return_V (cancel,
paid)
| cost > coin = getCoins (cost-coin,paid+coin)
| otherwise = return_V
(cancel, coin-cost)
coins = [5,10,20,50,100,200]