{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses , TemplateHaskell, UndecidableInstances #-} module AlarmMapValue where import Graphics.UI.WxGeneric import Graphics.UI.SybWidget.MySYB import Graphics.UI.WX import Graphics.UI.WXCore data Minutes = Minutes Int deriving (Show, Eq) data Alarm = Alarm { name :: String , timeOfDay :: Minutes } deriving (Show, Eq) data UserTime = UserTime { hour :: Int , minute :: Int } deriving (Show, Eq) $(derive [''Minutes,''UserTime,''Alarm]) instance WxGen UserTime instance WxGen Alarm instance WxGen Minutes where mkWid m' = let minutes2UserTime (Minutes m) = UserTime (m `div` 60) (m `mod` 60) userTime2Minutes (UserTime h m) = Minutes (60*h + m) in mapValue userTime2Minutes (const minutes2UserTime) (mkWid (minutes2UserTime m')) main :: IO () main = start $ do f <- frame [ text := "Alarm Map Value" ] p <- panel f [] en <- genericWidget p (Alarm "My alarm" $ Minutes 117) b <- button p [ text := "&Print alarm" , on command := get en widgetValue >>= print ] set f [ layout := container p $ row 10 [ widget en, widget b ] , size := Size 275 165 ]