{-# LANGUAGE RecordWildCards #-}
module Main where
import Control.Monad.State
data Item = Item {
name :: String,
description :: String,
useTime :: Int,
useCount :: Int
}
type TotalItemsCreated = Int
useItem :: Item -> State TotalItemsCreated String
useItem item@Item{..} = do
modify (+1)
return $ "Používá se " ++ name ++ " (" ++ description ++ "), což trvá " ++ show useTime ++ " sekund. Počet použití: " ++ show (useCount + 1)
data Survik = Survik {
survikName :: String,
item :: Item
}
useSurvikItem :: Survik -> State TotalItemsCreated String
useSurvikItem Survik{..} = do
itemLine <- useItem item
return $ survikName ++ " používá " ++ name item ++ ": " ++ itemLine
main :: IO ()
main = do
let baterka = Item "Baterka" "osvětluje cestu" 0 0
lekarnicka = Item "Lékárnička" "léčí zranění" 20 0
pepa = Survik "Pepik the survik" baterka
let (result, totalItems) = runState (useSurvikItem pepa >> useSurvikItem (pepa { item = lekarnicka })) 0
putStrLn result
print totalItems