# brittany showcase We will try to take the following module and try to fit it into 80 columns. ## input ~~~~ .hs -- 10 20 30 40 50 60 70 80 module Language.Haskell.Brittany.BriLayouter ( layoutBriDoc ) where layoutBriDoc :: Data.Data.Data ast => ast -> BriDocNumbered -> PPM () layoutBriDoc ast briDoc = do -- first step: transform the briDoc. briDoc' <- MultiRWSS.withMultiStateS BDEmpty $ do traceIfDumpConf "bridoc raw" _dconf_dump_bridoc_raw $ briDocToDoc $ unwrapBriDocNumbered $ briDoc -- bridoc transformation: remove alts transformAlts briDoc >>= mSet mGet >>= traceIfDumpConf "bridoc post-alt" _dconf_dump_bridoc_simpl_alt . briDocToDoc -- bridoc transformation: float stuff in mGet <&> transformSimplifyFloating >>= mSet mGet >>= traceIfDumpConf "bridoc post-floating" _dconf_dump_bridoc_simpl_floating . briDocToDoc -- bridoc transformation: par removal mGet <&> transformSimplifyPar >>= mSet mGet >>= traceIfDumpConf "bridoc post-par" _dconf_dump_bridoc_simpl_par . briDocToDoc -- bridoc transformation: float stuff in mGet <&> transformSimplifyColumns >>= mSet mGet >>= traceIfDumpConf "bridoc post-columns" _dconf_dump_bridoc_simpl_columns . briDocToDoc -- -- bridoc transformation: indent mGet <&> transformSimplifyIndent >>= mSet mGet >>= traceIfDumpConf "bridoc post-indent" _dconf_dump_bridoc_simpl_indent . briDocToDoc mGet >>= traceIfDumpConf "bridoc final" _dconf_dump_bridoc_final . briDocToDoc -- -- convert to Simple type -- simpl <- mGet <&> transformToSimple -- return simpl anns :: ExactPrint.Types.Anns <- mAsk let filteredAnns = filterAnns ast anns let state = LayoutState { _lstate_baseY = 0 , _lstate_curY = 0 , _lstate_indLevel = 0 , _lstate_indLevelLinger = 0 , _lstate_commentsPrior = extractCommentsPrior filteredAnns , _lstate_commentsPost = extractCommentsPost filteredAnns , _lstate_commentCol = Nothing , _lstate_addSepSpace = Nothing , _lstate_inhibitMTEL = False , _lstate_isNewline = NewLineStateInit } state' <- MultiRWSS.withMultiStateS state $ layoutBriDocM briDoc' let remainingComments = Map.elems (_lstate_commentsPrior state') ++ Map.elems (_lstate_commentsPost state') remainingComments `forM_` (mTell . (:[]) . LayoutErrorUnusedComment . show . fmap fst) return $ () ~~~~ ## `brittany` output ~~~~ .hs -- 10 20 30 40 50 60 70 80 module Language.Haskell.Brittany.BriLayouter ( layoutBriDoc ) where layoutBriDoc :: Data.Data.Data ast => ast -> BriDocNumbered -> PPM () layoutBriDoc ast briDoc = do -- first step: transform the briDoc. briDoc' <- MultiRWSS.withMultiStateS BDEmpty $ do traceIfDumpConf "bridoc raw" _dconf_dump_bridoc_raw $ briDocToDoc $ unwrapBriDocNumbered $ briDoc -- bridoc transformation: remove alts transformAlts briDoc >>= mSet mGet >>= traceIfDumpConf "bridoc post-alt" _dconf_dump_bridoc_simpl_alt . briDocToDoc -- bridoc transformation: float stuff in mGet <&> transformSimplifyFloating >>= mSet mGet >>= traceIfDumpConf "bridoc post-floating" _dconf_dump_bridoc_simpl_floating . briDocToDoc -- bridoc transformation: par removal mGet <&> transformSimplifyPar >>= mSet mGet >>= traceIfDumpConf "bridoc post-par" _dconf_dump_bridoc_simpl_par . briDocToDoc -- bridoc transformation: float stuff in mGet <&> transformSimplifyColumns >>= mSet mGet >>= traceIfDumpConf "bridoc post-columns" _dconf_dump_bridoc_simpl_columns . briDocToDoc -- -- bridoc transformation: indent mGet <&> transformSimplifyIndent >>= mSet mGet >>= traceIfDumpConf "bridoc post-indent" _dconf_dump_bridoc_simpl_indent . briDocToDoc mGet >>= traceIfDumpConf "bridoc final" _dconf_dump_bridoc_final . briDocToDoc -- -- convert to Simple type -- simpl <- mGet <&> transformToSimple -- return simpl anns :: ExactPrint.Types.Anns <- mAsk let filteredAnns = filterAnns ast anns let state = LayoutState { _lstate_baseY = 0 , _lstate_curY = 0 , _lstate_indLevel = 0 , _lstate_indLevelLinger = 0 , _lstate_commentsPrior = extractCommentsPrior filteredAnns , _lstate_commentsPost = extractCommentsPost filteredAnns , _lstate_commentCol = Nothing , _lstate_addSepSpace = Nothing , _lstate_inhibitMTEL = False , _lstate_isNewline = NewLineStateInit } state' <- MultiRWSS.withMultiStateS state $ layoutBriDocM briDoc' let remainingComments = Map.elems (_lstate_commentsPrior state') ++ Map.elems (_lstate_commentsPost state') remainingComments `forM_` (mTell . (:[]) . LayoutErrorUnusedComment . show . fmap fst) return $ () ~~~~ In contrast, let us look at Chris Done's `hindent` (version `5.2.1`) re-formatting results for the same input: ## `hindent` output ~~~~ .hs -- 10 20 30 40 50 60 70 80 module Language.Haskell.Brittany.BriLayouter ( layoutBriDoc ) where layoutBriDoc :: Data.Data.Data ast => ast -> BriDocNumbered -> PPM () layoutBriDoc ast briDoc -- first step: transform the briDoc. = do briDoc' <- MultiRWSS.withMultiStateS BDEmpty $ do traceIfDumpConf "bridoc raw" _dconf_dump_bridoc_raw $ briDocToDoc $ unwrapBriDocNumbered $ briDoc -- bridoc transformation: remove alts transformAlts briDoc >>= mSet mGet >>= traceIfDumpConf "bridoc post-alt" _dconf_dump_bridoc_simpl_alt . briDocToDoc -- bridoc transformation: float stuff in mGet <&> transformSimplifyFloating >>= mSet mGet >>= traceIfDumpConf "bridoc post-floating" _dconf_dump_bridoc_simpl_floating . briDocToDoc -- bridoc transformation: par removal mGet <&> transformSimplifyPar >>= mSet mGet >>= traceIfDumpConf "bridoc post-par" _dconf_dump_bridoc_simpl_par . briDocToDoc -- bridoc transformation: float stuff in mGet <&> transformSimplifyColumns >>= mSet mGet >>= traceIfDumpConf "bridoc post-columns" _dconf_dump_bridoc_simpl_columns . briDocToDoc -- -- bridoc transformation: indent mGet <&> transformSimplifyIndent >>= mSet mGet >>= traceIfDumpConf "bridoc post-indent" _dconf_dump_bridoc_simpl_indent . briDocToDoc mGet >>= traceIfDumpConf "bridoc final" _dconf_dump_bridoc_final . briDocToDoc -- -- convert to Simple type -- simpl <- mGet <&> transformToSimple -- return simpl anns :: ExactPrint.Types.Anns <- mAsk let filteredAnns = filterAnns ast anns let state = LayoutState { _lstate_baseY = 0 , _lstate_curY = 0 , _lstate_indLevel = 0 , _lstate_indLevelLinger = 0 , _lstate_commentsPrior = extractCommentsPrior filteredAnns , _lstate_commentsPost = extractCommentsPost filteredAnns , _lstate_commentCol = Nothing , _lstate_addSepSpace = Nothing , _lstate_inhibitMTEL = False , _lstate_isNewline = NewLineStateInit } state' <- MultiRWSS.withMultiStateS state $ layoutBriDocM briDoc' let remainingComments = Map.elems (_lstate_commentsPrior state') ++ Map.elems (_lstate_commentsPost state') remainingComments `forM_` (mTell . (: []) . LayoutErrorUnusedComment . show . fmap fst) return $ () ~~~~ and haskell-formatter (version 1.0.0) ## `haskell-formatter` output ~~~~ .hs -- 10 20 30 40 50 60 70 80 module Language.Haskell.Brittany.BriLayouter (layoutBriDoc) where layoutBriDoc :: Data.Data.Data ast => ast -> BriDocNumbered -> PPM () layoutBriDoc ast briDoc -- first step: transform the briDoc. = do briDoc' <- MultiRWSS.withMultiStateS BDEmpty $ do traceIfDumpConf "bridoc raw" _dconf_dump_bridoc_raw $ briDocToDoc $ unwrapBriDocNumbered $ briDoc -- bridoc transformation: remove alts transformAlts briDoc >>= mSet mGet >>= traceIfDumpConf "bridoc post-alt" _dconf_dump_bridoc_simpl_alt . briDocToDoc -- bridoc transformation: float stuff in mGet <&> transformSimplifyFloating >>= mSet mGet >>= traceIfDumpConf "bridoc post-floating" _dconf_dump_bridoc_simpl_floating . briDocToDoc -- bridoc transformation: par removal mGet <&> transformSimplifyPar >>= mSet mGet >>= traceIfDumpConf "bridoc post-par" _dconf_dump_bridoc_simpl_par . briDocToDoc -- bridoc transformation: float stuff in mGet <&> transformSimplifyColumns >>= mSet mGet >>= traceIfDumpConf "bridoc post-columns" _dconf_dump_bridoc_simpl_columns . briDocToDoc -- -- bridoc transformation: indent mGet <&> transformSimplifyIndent >>= mSet mGet >>= traceIfDumpConf "bridoc post-indent" _dconf_dump_bridoc_simpl_indent . briDocToDoc mGet >>= traceIfDumpConf "bridoc final" _dconf_dump_bridoc_final . briDocToDoc -- -- convert to Simple type -- simpl <- mGet <&> transformToSimple -- return simpl anns :: ExactPrint.Types.Anns <- mAsk let filteredAnns = filterAnns ast anns let state = LayoutState{_lstate_baseY = 0, _lstate_curY = 0, _lstate_indLevel = 0, _lstate_indLevelLinger = 0, _lstate_commentsPrior = extractCommentsPrior filteredAnns, _lstate_commentsPost = extractCommentsPost filteredAnns, _lstate_commentCol = Nothing, _lstate_addSepSpace = Nothing, _lstate_inhibitMTEL = False, _lstate_isNewline = NewLineStateInit} state' <- MultiRWSS.withMultiStateS state $ layoutBriDocM briDoc' let remainingComments = Map.elems (_lstate_commentsPrior state') ++ Map.elems (_lstate_commentsPost state') remainingComments `forM_` (mTell . (: []) . LayoutErrorUnusedComment . show . fmap fst) return $ () ~~~~