@@ -0,0 +1,64 @@
1+{-# LANGUAGE ConstraintKinds #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
3+module Control.Monad.Ether.Implicit.Writer
4+ (
5+ -- * MonadWriter class
6+ MonadWriter
7+ , writer
8+ , tell
9+ , listen
10+ , pass
11+ , listens
12+ , censor
13+ -- * The Writer monad
14+ , Writer
15+ , runWriter
16+ , execWriter
17+ -- * The WriterT monad transformer
18+ , WriterT
19+ , writerT
20+ , runWriterT
21+ , execWriterT
22+ ) where
23+
24+import Data.Proxy
25+import qualified Control.Monad.Ether.Writer as Explicit
26+
27+type MonadWriter w = Explicit.MonadWriter w w
28+
29+writer :: forall m w a . MonadWriter w m => (a, w) -> m a
30+writer = Explicit.writer (Proxy :: Proxy w)
31+
32+tell :: forall m w . MonadWriter w m => w -> m ()
33+tell = Explicit.tell (Proxy :: Proxy w)
34+
35+listen :: forall m w a . MonadWriter w m => m a -> m (a, w)
36+listen = Explicit.listen (Proxy :: Proxy w)
37+
38+pass :: forall m w a . MonadWriter w m => m (a, w -> w) -> m a
39+pass = Explicit.pass (Proxy :: Proxy w)
40+
41+listens :: forall m w a b . MonadWriter w m => (w -> b) -> m a -> m (a, b)
42+listens = Explicit.listens (Proxy :: Proxy w)
43+
44+censor :: forall m w a . MonadWriter w m => (w -> w) -> m a -> m a
45+censor = Explicit.censor (Proxy :: Proxy w)
46+
47+type Writer w = Explicit.Writer w w
48+
49+runWriter :: Writer w a -> (a, w)
50+runWriter = Explicit.runWriter Proxy
51+
52+execWriter :: Writer w a -> w
53+execWriter = Explicit.execWriter Proxy
54+
55+type WriterT w = Explicit.WriterT w w
56+
57+writerT :: m (a, w) -> WriterT w m a
58+writerT = Explicit.writerT Proxy
59+
60+runWriterT :: WriterT w m a -> m (a, w)
61+runWriterT = Explicit.runWriterT Proxy
62+
63+execWriterT :: Monad m => WriterT w m a -> m w
64+execWriterT = Explicit.execWriterT Proxy