-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathWriter.hs
More file actions
38 lines (30 loc) · 827 Bytes
/
Copy pathWriter.hs
File metadata and controls
38 lines (30 loc) · 827 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{-# LANGUAGE GADTs #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Control.Monad.Eff.Writer (
Writer(..),
tell, writer,
runWriter
) where
import Control.Monad.Eff
import Data.Monoid
data Writer o a where
Put :: o -> Writer o ()
tell :: Member (Writer o) r => o -> Eff r ()
tell o = send (Put o)
writer :: Member (Writer o) r => (a, o) -> Eff r a
writer (a, o) = do
tell o
return a
runWriter :: Monoid o => Eff (Writer o ': r) a -> Eff r (a, o)
runWriter = handleRelay ret handle
where
ret :: Monoid o => a -> Eff r (a, o)
ret a = return (a, mempty)
handle :: Monoid o => Handler (Writer o) r (a, o)
handle (Put o) k = do
(a, os) <- k ()
return (a, o <> os)