From 9bd3bfbe4c150540ad351410879e105f649f8637 Mon Sep 17 00:00:00 2001
From: Sergey Vinokurov <serg.foo@gmail.com>
Date: Tue, 3 Apr 2018 22:49:06 +0100
Subject: [PATCH] Review suggestions

---
 .../Brittany/Internal/LayouterBasics.hs       |  5 ---
 .../Brittany/Internal/Layouters/Decl.hs       | 19 +++++-----
 .../Haskell/Brittany/Internal/Layouters/IE.hs | 37 ++++++++++---------
 3 files changed, 29 insertions(+), 32 deletions(-)

diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs
index 48730c7..191581c 100644
--- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs
+++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs
@@ -14,7 +14,6 @@ module Language.Haskell.Brittany.Internal.LayouterBasics
   , docLit
   , docAlt
   , CollectAltM
-  , addAlternativeCondM
   , addAlternativeCond
   , addAlternative
   , runFilteredAlternative
@@ -426,10 +425,6 @@ docAlt l = allocateNode . BDFAlt =<< sequence l
 newtype CollectAltM a = CollectAltM (Writer.Writer [ToBriDocM BriDocNumbered] a)
   deriving (Functor, Applicative, Monad)
 
-addAlternativeCondM :: Bool -> CollectAltM (ToBriDocM BriDocNumbered) -> CollectAltM ()
-addAlternativeCondM cond doc =
-  addAlternativeCond cond =<< doc
-
 addAlternativeCond :: Bool -> ToBriDocM BriDocNumbered -> CollectAltM ()
 addAlternativeCond cond doc =
   when cond (addAlternative doc)
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
index d27c385..babcab1 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs
@@ -308,21 +308,22 @@ layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs mWhereDocs ha
             ++ (List.intersperse docCommaSep
                                  (docForceSingleline . return <$> gs)
                )
+      wherePart = case mWhereDocs of
+        Nothing  -> Just docEmpty
+        Just [w] -> Just $ docSeq
+          [ docSeparator
+          , appSep $ docLit $ Text.pack "where"
+          , docSetIndentLevel $ docForceSingleline $ return w
+          ]
+        _        -> Nothing
 
   indentPolicy <- mAsk
     <&> _conf_layout
     .>  _lconfig_indentPolicy
     .>  confUnpack
+
   runFilteredAlternative $ do
 
-    let wherePart = case mWhereDocs of
-          Nothing  -> Just docEmpty
-          Just [w] -> Just $ docSeq
-            [ docSeparator
-            , appSep $ docLit $ Text.pack "where"
-            , docSetIndentLevel $ docForceSingleline $ return w
-            ]
-          _        -> Nothing
     case clauseDocs of
       [(guards, body, _bodyRaw)] -> do
         let guardPart = singleLineGuardsDoc guards
@@ -385,7 +386,7 @@ layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs mWhereDocs ha
              ]
           ++ wherePartMultiLine
 
-      _ -> return ()
+      _ -> return () -- no alternatives exclusively when `length clauseDocs /= 1`
 
     case mPatDoc of
       Nothing     -> return ()
diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
index 61af2da..2ba66a0 100644
--- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
+++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs
@@ -118,21 +118,22 @@ layoutLLIEs :: Bool -> Located [LIE RdrName] -> ToBriDocM BriDocNumbered
 layoutLLIEs enableSingleline llies = do
   ieDs        <- layoutAnnAndSepLLIEs llies
   hasComments <- hasAnyCommentsBelow llies
-  case ieDs of
-    [] -> runFilteredAlternative $ do
-      addAlternativeCond (not hasComments) $
-        docLit $ Text.pack "()"
-      addAlternativeCond hasComments $
-        docPar (docSeq [docParenLSep, docWrapNodeRest llies docEmpty])
-               docParenR
-    (ieDsH:ieDsT) -> runFilteredAlternative $ do
-      addAlternativeCond (not hasComments && enableSingleline)
-        $  docSeq
-        $  [docLit (Text.pack "(")]
-        ++ (docForceSingleline <$> ieDs)
-        ++ [docParenR]
-      addAlternative
-        $  docPar (docSetBaseY $ docSeq [docParenLSep, ieDsH])
-        $  docLines
-        $  ieDsT
-        ++ [docParenR]
+  runFilteredAlternative $
+    case ieDs of
+      [] -> do
+        addAlternativeCond (not hasComments) $
+          docLit $ Text.pack "()"
+        addAlternativeCond hasComments $
+          docPar (docSeq [docParenLSep, docWrapNodeRest llies docEmpty])
+                 docParenR
+      (ieDsH:ieDsT) -> do
+        addAlternativeCond (not hasComments && enableSingleline)
+          $  docSeq
+          $  [docLit (Text.pack "(")]
+          ++ (docForceSingleline <$> ieDs)
+          ++ [docParenR]
+        addAlternative
+          $  docPar (docSetBaseY $ docSeq [docParenLSep, ieDsH])
+          $  docLines
+          $  ieDsT
+          ++ [docParenR]