summaryrefslogtreecommitdiff
path: root/Utility/State.hs
blob: c27f3c261073e5453e50fb459556c0b55316f3fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{- state monad support
 -
 - Copyright 2012 Joey Hess <joey@kitenet.net>
 -
 - Licensed under the GNU GPL version 3 or higher.
 -}

module Utility.State where

import Control.Monad.State.Strict

{- Modifies Control.Monad.State's state, forcing a strict update.
 - This avoids building thunks in the state and leaking.
 - Why it's not the default, I don't know.
 -
 - Example: changeState $ \s -> s { foo = bar }
 -}
changeState :: MonadState s m => (s -> s) -> m ()
changeState f = do
	x <- get
	put $! f x

{- Gets a value from the internal state, selected by the passed value
 - constructor. -}
getState :: MonadState s m => (s -> a) -> m a
getState = gets