extensible-effects-1.8.0.0: An Alternative to Monad Transformers

Safe HaskellTrustworthy
LanguageHaskell2010

Data.OpenUnion.Internal.OpenUnion1

Description

Original work at http://okmij.org/ftp/Haskell/extensible/OpenUnion1.hs. Open unions (type-indexed co-products) for extensible effects. This implementation relies on _closed_ overlapping instances (or closed type function overlapping soon to be added to GHC).

Synopsis

Documentation

data Union r v Source

Parameter r is phantom: it just tells what could be in the union. Where r is t1 :> t2 ... :> tn, Union r v can be constructed with a value of type ti v. Ideally, we should be able to add the constraint Member t r.

NOTE: exposing the constructor below allows users to bypass the type system. See unsafeReUnion for example.

Constructors

forall t . (Functor t, Typeable t) => Union (t v) 

Instances

data a :> b infixr 1 Source

A sum data type, for composing effects

Instances

MemberU k * tag t r => MemberU k * tag t ((:>) t' r) 
MemberU k * tag (tag e) ((:>) (tag e) r) 
Member * t r => Member * t ((:>) t' r) 
Member * t ((:>) t r) 

class Member t r Source

The Member t r specifies whether t is present anywhere in the sum type r, where t is some effectful type, e.g. Lift IO, State Int`.

Instances

Member * t r => Member * t ((:>) t' r) 
Member * t ((:>) t r) 

class Member t r => MemberU tag t r | tag r -> t Source

This class is used for emulating monad transformers

Instances

MemberU k * tag t r => MemberU k * tag t ((:>) t' r) 
MemberU k * tag (tag e) ((:>) (tag e) r)