Revision f645af36
b/src/Ganeti/Lens.hs | ||
---|---|---|
27 | 27 |
( module Control.Lens |
28 | 28 |
, makeCustomLenses |
29 | 29 |
, makeCustomLenses' |
30 |
, traverseOf2 |
|
30 | 31 |
) where |
31 | 32 |
|
32 | 33 |
import Control.Lens |
33 | 34 |
import Control.Monad |
35 |
import Data.Functor.Compose (Compose(..)) |
|
34 | 36 |
import qualified Data.Set as S |
35 | 37 |
import Language.Haskell.TH |
36 | 38 |
|
... | ... | |
55 | 57 |
where |
56 | 58 |
allowed = S.fromList . map nameBase $ lst |
57 | 59 |
f = flip S.member allowed |
60 |
|
|
61 |
-- | Traverses over a composition of two functors. |
|
62 |
-- Most often the @g@ functor is @(,) r@ and 'traverseOf2' is used to |
|
63 |
-- traverse an effectful computation that also returns an additional output |
|
64 |
-- value. |
|
65 |
traverseOf2 :: Over (->) (Compose f g) s t a b |
|
66 |
-> (a -> f (g b)) -> s -> f (g t) |
|
67 |
traverseOf2 k f = getCompose . traverseOf k (Compose . f) |
b/src/Ganeti/WConfd/Monad.hs | ||
---|---|---|
61 | 61 |
import Control.Monad.Reader |
62 | 62 |
import Control.Monad.State |
63 | 63 |
import Control.Monad.Trans.Control |
64 |
import Data.Functor.Compose (Compose(..)) |
|
65 | 64 |
import Data.Functor.Identity |
66 | 65 |
import Data.IORef.Lifted |
67 | 66 |
import Data.Monoid (Any(..)) |
... | ... | |
240 | 239 |
modifyTempResStateErr f = do |
241 | 240 |
-- we use Compose to traverse the composition of applicative functors |
242 | 241 |
-- @ErrorResult@ and @(,) a@ |
243 |
let f' ds = getCompose $ traverseOf dsTempResL
|
|
244 |
(Compose . runStateT (f (csConfigData . dsConfigState $ ds))) ds
|
|
242 |
let f' ds = traverseOf2 dsTempResL
|
|
243 |
(runStateT (f (csConfigData . dsConfigState $ ds))) ds |
|
245 | 244 |
dh <- daemonHandle |
246 | 245 |
toErrorBase $ atomicModifyIORefErr (dhDaemonState dh) (liftM swap . f') |
247 | 246 |
|
Also available in: Unified diff