From c5c3fec26c7a67c1277a270f815dd214fd21f12c Mon Sep 17 00:00:00 2001
From: Peter Simons <simons@cryp.to>
Date: Fri, 28 Sep 2018 11:47:11 +0200
Subject: [PATCH] inhale: avoid monadic pattern matching in pure code

These changes avoid the need for having a MonadFail instance for Decoder.
---
 XMonad/Hooks/DebugEvents.hs | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/XMonad/Hooks/DebugEvents.hs b/XMonad/Hooks/DebugEvents.hs
index 96dc1b35..8292a2a4 100644
--- a/XMonad/Hooks/DebugEvents.hs
+++ b/XMonad/Hooks/DebugEvents.hs
@@ -1178,20 +1178,23 @@ getInt w f =  getInt' w >>= maybe (return False) (append . f)
 -- @@@@@@@@@ evil beyond evil.  there *has* to be a better way
 inhale    :: Int -> Decoder Integer
 inhale  8 =  do
-               [b] <- eat 1
-               return $ fromIntegral b
+               x <- eat 1
+               case x of
+                 [b] -> return $ fromIntegral b
 inhale 16 =  do
-               [b0,b1] <- eat 2
-               io $ allocaArray 2 $ \p -> do
-                 pokeArray p [b0,b1]
-                 [v] <- peekArray 1 (castPtr p :: Ptr Word16)
-                 return $ fromIntegral v
+               x <- eat 2
+               case x of
+                 [b0,b1] -> io $ allocaArray 2 $ \p -> do
+                              pokeArray p [b0,b1]
+                              [v] <- peekArray 1 (castPtr p :: Ptr Word16)
+                              return $ fromIntegral v
 inhale 32 =  do
-               [b0,b1,b2,b3] <- eat 4
-               io $ allocaArray 4 $ \p -> do
-                 pokeArray p [b0,b1,b2,b3]
-                 [v] <- peekArray 1 (castPtr p :: Ptr Word32)
-                 return $ fromIntegral v
+               x <- eat 4
+               case x of
+                 [b0,b1,b2,b3] -> io $ allocaArray 4 $ \p -> do
+                                    pokeArray p [b0,b1,b2,b3]
+                                    [v] <- peekArray 1 (castPtr p :: Ptr Word32)
+                                    return $ fromIntegral v
 inhale  b =  error $ "inhale " ++ show b
 
 eat   :: Int -> Decoder Raw