Most often the inner functor is "(,) r" and "traverseOf2" is used to
traverse an effectful computation that also returns an additional
output value.

Signed-off-by: Petr Pudlak <[email protected]>
---
 src/Ganeti/Lens.hs         | 10 ++++++++++
 src/Ganeti/WConfd/Monad.hs |  5 ++---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/Ganeti/Lens.hs b/src/Ganeti/Lens.hs
index 01df0fa..2373a8b 100644
--- a/src/Ganeti/Lens.hs
+++ b/src/Ganeti/Lens.hs
@@ -27,10 +27,12 @@ module Ganeti.Lens
   ( module Control.Lens
   , makeCustomLenses
   , makeCustomLenses'
+  , traverseOf2
   ) where
 
 import Control.Lens
 import Control.Monad
+import Data.Functor.Compose (Compose(..))
 import qualified Data.Set as S
 import Language.Haskell.TH
 
@@ -55,3 +57,11 @@ makeCustomLenses' name lst = makeCustomLensesFiltered f name
   where
     allowed = S.fromList . map nameBase $ lst
     f = flip S.member allowed
+
+-- | Traverses over a composition of two functors.
+-- Most often the @g@ functor is @(,) r@ and 'traverseOf2' is used to
+-- traverse an effectful computation that also returns an additional output
+-- value.
+traverseOf2 :: Over (->) (Compose f g) s t a b
+            -> (a -> f (g b)) -> s -> f (g t)
+traverseOf2 k f = getCompose . traverseOf k (Compose . f)
diff --git a/src/Ganeti/WConfd/Monad.hs b/src/Ganeti/WConfd/Monad.hs
index 8dd0d53..3e459a9 100644
--- a/src/Ganeti/WConfd/Monad.hs
+++ b/src/Ganeti/WConfd/Monad.hs
@@ -61,7 +61,6 @@ import Control.Monad.Error
 import Control.Monad.Reader
 import Control.Monad.State
 import Control.Monad.Trans.Control
-import Data.Functor.Compose (Compose(..))
 import Data.Functor.Identity
 import Data.IORef.Lifted
 import Data.Monoid (Any(..))
@@ -240,8 +239,8 @@ modifyTempResStateErr
 modifyTempResStateErr f = do
   -- we use Compose to traverse the composition of applicative functors
   -- @ErrorResult@ and @(,) a@
-  let f' ds = getCompose $ traverseOf dsTempResL
-              (Compose . runStateT (f (csConfigData . dsConfigState $ ds))) ds
+  let f' ds = traverseOf2 dsTempResL
+              (runStateT (f (csConfigData . dsConfigState $ ds))) ds
   dh <- daemonHandle
   toErrorBase $ atomicModifyIORefErr (dhDaemonState dh) (liftM swap . f')
 
-- 
1.9.1.423.g4596e3a

Reply via email to