{-| Extensible effects. Minimal boilerplate. (Weakened inference). See "Vinyl.Effects.Example" for a detailed tutorial. Dependencies: * the @free@ package, for 'Free' (which transforms a functor into a monad) and 'Cofree' (which transforms a functor into a comonad). * the @vinyl@ package, for (TODO) 'CoRec' (an n-ary, un-nested sum type) and 'Rec' (an n-ary, un-nested product type). Concepts (necessary only for contributing to the library, not using it): * for composing domain-specific languages and interpeters (parts 1 to 5): * <http://dlaing.org/cofun/posts/free_and_cofree.html> * <http://dlaing.org/cofun/posts/monad_transformers_and_comonad_transformers.html> * <http://dlaing.org/cofun/posts/coproducts_for_free_and_products_for_cofree.html> * <http://dlaing.org/cofun/posts/pairing_and_io.html> * <http://dlaing.org/cofun/posts/pairing_over_the_network.html> * (this series a tour-de-force, read it!). * for "extensible records": * <https://hackage.haskell.org/package/vinyl-0.5.2/docs/Data-Vinyl-Tutorial-Overview.html> * for "free monads": * <> TODO tekmos blog * for "extensible effects": * <> TODO ocharles * for @mtl@: * <> TODO Reverse Dependencies: * packdeps.haskellers.com/reverse/vinyl-effects * TODO <workflow-types> uses this package to maximize the effects the platform-independent monad provides, while still preserving the richer effects the platform-specific monads provide (in <workflow-linux>, <workflow-osx>, and <workflow-windows>). e.g. @OSX@ can easily access the clipboard via @bash@. Extensions: * The effects as a type-level set, not a type-level list (from "GHC.TypeLits"); i.e. the items are unique. (Currently, I think the duplicates are ignored). * "extensible interpreters" via cofree comonads. (The original motivation for this package only needed the 'Language' to be extensible). Existing Alternatives: * <extensible effects>: uses @-XOverloadedInstances@. bad inference? * <> romansch: * <> ocharles: * <> mtl: doesn't compose -} module Vinyl.Effects ( module Vinyl.Effects.Language , module Vinyl.Effects.Interpreter , module Vinyl.Effects.Types , module Data.Vinyl , module Vinyl.CoRec -- , module Control.Monad.Free -- user shouldn't need it ) where import Vinyl.Effects.Language import Vinyl.Effects.Interpreter import Vinyl.Effects.Types import Data.Vinyl -- as Vinyl import Vinyl.CoRec -- as Vinyl -- import Control.Monad.Free -- as Free