[get rid of iorefs Evan Martin **20060217214003] { hunk ./MPDMate.hs 17 - stVolume :: IORef Int + stVolume :: Int hunk ./MPDMate.hs 20 -processEvent :: State -> PowerMate.Event -> IO () -processEvent state (PowerMate.Button True) = +processEvent :: State -> PowerMate.Event -> IO State +processEvent state (PowerMate.Button True) = do hunk ./MPDMate.hs 23 -processEvent state (PowerMate.Button False) = return () + return state +processEvent state (PowerMate.Button False) = return state hunk ./MPDMate.hs 27 + let newvol = max 0 $ min 100 $ (stVolume state) + dir hunk ./MPDMate.hs 30 - vol <- readIORef (stVolume state) - let newvol = max 0 $ min 100 $ vol + dir hunk ./MPDMate.hs 32 - writeIORef (stVolume state) newvol hunk ./MPDMate.hs 33 + return $ state { stVolume=newvol } hunk ./MPDMate.hs 42 + return state hunk ./MPDMate.hs 44 -readMPDStatus :: State -> IO () +readMPDStatus :: State -> IO State hunk ./MPDMate.hs 47 - writeIORef (stVolume state) volume + return $ state { stVolume=volume } hunk ./MPDMate.hs 51 - volume <- readIORef (stVolume state) + let brightness = (stVolume state)*255 `div` 100 hunk ./MPDMate.hs 53 - PowerMate.statusInit { PowerMate.brightness=(volume*255 `div` 100) } + PowerMate.statusInit { PowerMate.brightness=brightness } + +loop :: a -> (a -> IO a) -> IO () +loop state func = do + newstate <- func state + loop newstate func + return () -- never reached hunk ./MPDMate.hs 67 - vol <- newIORef 0 - brightness <- newIORef 0 - let state = State { stConn=conn, stVolume=vol, stPowerMate=pm } - readMPDStatus state + state <- readMPDStatus $ State { stConn=conn, stPowerMate=pm, stVolume=0 } hunk ./MPDMate.hs 70 - sequence_ $ repeat $ do + loop state $ \state -> do hunk ./MPDMate.hs 73 - Nothing -> return () + Nothing -> return state }