From beaf121b6660245d7f153a3208dcad1bcfae02e6 Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Sat, 30 Jul 2016 23:43:04 +0200 Subject: [PATCH] Create Showcase.md --- Showcase.md | 289 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 Showcase.md diff --git a/Showcase.md b/Showcase.md new file mode 100644 index 0000000..61119a8 --- /dev/null +++ b/Showcase.md @@ -0,0 +1,289 @@ +# 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` re-formatting results for the same input, with two different styles: + +## hindent --style chris-done 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 $ () +~~~~ + +## hindent --style gibiansky output + +note that it managed to garbage the first comment to `-- 10 20 30 40 50 60 70 80` which i replaced again afterwards. + +~~~~ .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 $ () +~~~~