Skip to content

Custom Monoid instance for Utf8Builder#166

Merged
snoyberg merged 1 commit into
commercialhaskell:masterfrom
lehins:monoid-instance
Apr 16, 2019
Merged

Custom Monoid instance for Utf8Builder#166
snoyberg merged 1 commit into
commercialhaskell:masterfrom
lehins:monoid-instance

Conversation

@lehins

@lehins lehins commented Apr 16, 2019

Copy link
Copy Markdown
Contributor

Because of derived instance with GeneralizedNewtypeDeriving, mconcat breaks list fusion and causes extra allocations when used with Utf8Builder. Here is a way to reproduce:

  runSimpleApp $ do
    logInfo $ foldr (<>) mempty $ fuseThis ["foo", "bar", "-", "<>"]
    logInfo $ foldr mappend mempty $ fuseThis ["foo", "bar", "-", "mappend"]
    logInfo $ mconcat $ fuseThis ["foo", "bar", "-", "mconcat"]

fuseThis comes from Data.List.Fusion.Probe

Code above results in:

foobar-<>
foobar-mappend
fuse-builder-exe: fuseThis: List did not fuse
CallStack (from HasCallStack):
  error, called at ./Data/List/Fusion/Probe.hs:52:16

But with the fix in this PR:

foobar-<>
foobar-mappend
foobar-mconcat

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants