11 KiB
11 KiB
brittany showcase
We will try to take the following module and try to fit it into 80 columns.
input
-- 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
-- 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 4.6.4
) re-formatting results for the same input, with two different styles:
hindent --style chris-done output
-- 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.
-- 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 $ ()