fusion-plugin alternatives and similar packages
Based on the "Development" category.
Alternatively, view fusion-plugin alternatives based on common mentions on social networks and blogs.
-
cabal-install-parsers
Scripts and instructions for using CI services (e.g. Travis CI or Appveyor) with multiple GHC configurations -
fourmolu
A fourk of ormolu that uses four space indentation and allows arbitrary configuration. Don't like it? PRs welcome!
SaaSHub - Software Alternatives and Reviews
Do you think we are missing an alternative of fusion-plugin or a related project?
Popular Comparisons
README
fusion-plugin
Motivation
The goal of stream fusion is to eliminate constructors of
internal state used in a stream. For example, in case of
streamly streams, the
constructors of Step
type, Yield
, Skip
and Stop
would get
eliminated by fusion. Similarly, constructors of any other intermediate
state types get eliminated when stream fusion works correctly. See the papers
in the reference section for more details on stream fusion.
Stream fusion depends on the GHC case-of-case transformations eliminating intermediate constructors. Case-of-case transformation in turn depends on inlining. During core-to-core transformations GHC may create several internal bindings (e.g. join points) which may not get inlined because their size is too big. Even though we know that after fusion the resulting code would be smaller and more efficient. The programmer cannot force inlining of these bindings as there is no way for the programmer to address these bindings at the source level because they are internal, generated during core-to-core transformations. As a result stream fusion fails unpredictably depending on whether GHC was able to inline the internal bindings or not.
See GHC ticket #17075 for more details.
Solution
This plugin provides the programmer with a way to annotate certain
types using a Fuse
pragma from the
fusion-plugin-types
package. The programmer would annotate the types that are to be
eliminated by fusion. During the simplifier phase the plugin goes
through the relevant bindings and if one of these types are found
inside a binding then that binding is marked to be inlined
irrespective of the size.
Using the plugin
This plugin was primarily motivated by streamly but it can be used in general.
To use this plugin, add this package to your build-depends
and pass the following to your ghc-options: ghc-options: -O2
-fplugin=Fusion.Plugin
To dump core after each core to core transformation, pass the argument
-fplugin-opt=Fusion.Plugin:dump-core
. Output from each
transformation is then printed in a different file.
See also
If you are a library author looking to annotate the types, you need to use the fusion-plugin-types package.
Contributing
All contributions are welcome! The code is available under BSD-3 license on github. In case you have any questions or suggestions please contact Pranay Sashank, the author and maintainer of this plugin.
We would be happy to see this work getting integrated with GHC as a fix for GHC ticket #17075, any help with that would be appreciated.
References
*Note that all licence references and agreements mentioned in the fusion-plugin README section above
are relevant to that project's source code only.