{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
module Knit.Effect.Docs
(
Docs
, newDoc
, toDocList
, toDocListWith
, toDocListWithM
, DocWithInfo(..)
, mapDocs
, mapDocsM
)
where
import qualified Polysemy as P
import Polysemy.Internal ( send )
import qualified Polysemy.Writer as P
import Control.Monad ( join )
data Docs i a m r where
NewDoc ::i -> a -> Docs i a m ()
newDoc :: P.Member (Docs i a) effs => i -> a -> P.Sem effs ()
newDoc :: i -> a -> Sem effs ()
newDoc info :: i
info doc :: a
doc = Docs i a (Sem effs) () -> Sem effs ()
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
Member e r =>
e (Sem r) a -> Sem r a
send (Docs i a (Sem effs) () -> Sem effs ())
-> Docs i a (Sem effs) () -> Sem effs ()
forall a b. (a -> b) -> a -> b
$ i -> a -> Docs i a (Sem effs) ()
forall k i a (m :: k). i -> a -> Docs i a m ()
NewDoc i
info a
doc
data DocWithInfo i a = DocWithInfo { DocWithInfo i a -> i
dwiInfo :: i, DocWithInfo i a -> a
dwiDoc :: a }
deriving instance Functor (DocWithInfo i)
deriving instance Foldable (DocWithInfo i)
deriving instance Traversable (DocWithInfo i)
toWriter
:: P.Sem (Docs i a ': effs) ()
-> P.Sem (P.Writer [DocWithInfo i a] ': effs) ()
toWriter :: Sem (Docs i a : effs) ()
-> Sem (Writer [DocWithInfo i a] : effs) ()
toWriter = (forall (m :: * -> *) x.
Docs i a m x -> Sem (Writer [DocWithInfo i a] : effs) x)
-> Sem (Docs i a : effs) ()
-> Sem (Writer [DocWithInfo i a] : effs) ()
forall (e1 :: (* -> *) -> * -> *) (e2 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
FirstOrder e1 "reinterpret" =>
(forall (m :: * -> *) x. e1 m x -> Sem (e2 : r) x)
-> Sem (e1 : r) a -> Sem (e2 : r) a
P.reinterpret forall k i a (m :: k) x (effs :: [(* -> *) -> * -> *]).
Docs i a m x -> Sem (Writer [DocWithInfo i a] : effs) x
forall (m :: * -> *) x.
Docs i a m x -> Sem (Writer [DocWithInfo i a] : effs) x
f
where
f :: Docs i a m x -> P.Sem (P.Writer [DocWithInfo i a] ': effs) x
f :: Docs i a m x -> Sem (Writer [DocWithInfo i a] : effs) x
f (NewDoc i :: i
i d :: a
d) = [DocWithInfo i a] -> Sem (Writer [DocWithInfo i a] : effs) ()
forall o (r :: [(* -> *) -> * -> *]).
MemberWithError (Writer o) r =>
o -> Sem r ()
P.tell [i -> a -> DocWithInfo i a
forall i a. i -> a -> DocWithInfo i a
DocWithInfo i
i a
d]
toDocList :: P.Sem (Docs i a ': effs) () -> P.Sem effs [DocWithInfo i a]
toDocList :: Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a]
toDocList = (([DocWithInfo i a], ()) -> [DocWithInfo i a])
-> Sem effs ([DocWithInfo i a], ()) -> Sem effs [DocWithInfo i a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([DocWithInfo i a], ()) -> [DocWithInfo i a]
forall a b. (a, b) -> a
fst (Sem effs ([DocWithInfo i a], ()) -> Sem effs [DocWithInfo i a])
-> (Sem (Docs i a : effs) () -> Sem effs ([DocWithInfo i a], ()))
-> Sem (Docs i a : effs) ()
-> Sem effs [DocWithInfo i a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Writer [DocWithInfo i a] : effs) ()
-> Sem effs ([DocWithInfo i a], ())
forall o (r :: [(* -> *) -> * -> *]) a.
Monoid o =>
Sem (Writer o : r) a -> Sem r (o, a)
P.runWriter (Sem (Writer [DocWithInfo i a] : effs) ()
-> Sem effs ([DocWithInfo i a], ()))
-> (Sem (Docs i a : effs) ()
-> Sem (Writer [DocWithInfo i a] : effs) ())
-> Sem (Docs i a : effs) ()
-> Sem effs ([DocWithInfo i a], ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Docs i a : effs) ()
-> Sem (Writer [DocWithInfo i a] : effs) ()
forall i a (effs :: [(* -> *) -> * -> *]).
Sem (Docs i a : effs) ()
-> Sem (Writer [DocWithInfo i a] : effs) ()
toWriter
mapDocs
:: Monad m => (i -> a -> b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]
mapDocs :: (i -> a -> b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]
mapDocs f :: i -> a -> b
f = ([DocWithInfo i a] -> [DocWithInfo i b])
-> m [DocWithInfo i a] -> m [DocWithInfo i b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((DocWithInfo i a -> DocWithInfo i b)
-> [DocWithInfo i a] -> [DocWithInfo i b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(DocWithInfo i :: i
i a :: a
a) -> i -> b -> DocWithInfo i b
forall i a. i -> a -> DocWithInfo i a
DocWithInfo i
i (i -> a -> b
f i
i a
a)))
mapDocsM
:: Monad m => (i -> a -> m b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]
mapDocsM :: (i -> a -> m b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]
mapDocsM f :: i -> a -> m b
f = m (m [DocWithInfo i b]) -> m [DocWithInfo i b]
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (m (m [DocWithInfo i b]) -> m [DocWithInfo i b])
-> (m [DocWithInfo i a] -> m (m [DocWithInfo i b]))
-> m [DocWithInfo i a]
-> m [DocWithInfo i b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([DocWithInfo i (m b)] -> m [DocWithInfo i b])
-> m [DocWithInfo i (m b)] -> m (m [DocWithInfo i b])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([m (DocWithInfo i b)] -> m [DocWithInfo i b]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([m (DocWithInfo i b)] -> m [DocWithInfo i b])
-> ([DocWithInfo i (m b)] -> [m (DocWithInfo i b)])
-> [DocWithInfo i (m b)]
-> m [DocWithInfo i b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DocWithInfo i (m b) -> m (DocWithInfo i b))
-> [DocWithInfo i (m b)] -> [m (DocWithInfo i b)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((m b -> m b) -> DocWithInfo i (m b) -> m (DocWithInfo i b)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse m b -> m b
forall a. a -> a
id)) (m [DocWithInfo i (m b)] -> m (m [DocWithInfo i b]))
-> (m [DocWithInfo i a] -> m [DocWithInfo i (m b)])
-> m [DocWithInfo i a]
-> m (m [DocWithInfo i b])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (i -> a -> m b) -> m [DocWithInfo i a] -> m [DocWithInfo i (m b)]
forall (m :: * -> *) i a b.
Monad m =>
(i -> a -> b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]
mapDocs i -> a -> m b
f
toDocListWith
:: (i -> a -> b)
-> P.Sem (Docs i a ': effs) ()
-> P.Sem effs [DocWithInfo i b]
toDocListWith :: (i -> a -> b)
-> Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i b]
toDocListWith f :: i -> a -> b
f = (i -> a -> b)
-> Sem effs [DocWithInfo i a] -> Sem effs [DocWithInfo i b]
forall (m :: * -> *) i a b.
Monad m =>
(i -> a -> b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]
mapDocs i -> a -> b
f (Sem effs [DocWithInfo i a] -> Sem effs [DocWithInfo i b])
-> (Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a])
-> Sem (Docs i a : effs) ()
-> Sem effs [DocWithInfo i b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a]
forall i a (effs :: [(* -> *) -> * -> *]).
Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a]
toDocList
toDocListWithM
:: (i -> a -> P.Sem effs b)
-> P.Sem (Docs i a ': effs) ()
-> P.Sem effs [DocWithInfo i b]
toDocListWithM :: (i -> a -> Sem effs b)
-> Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i b]
toDocListWithM f :: i -> a -> Sem effs b
f = (i -> a -> Sem effs b)
-> Sem effs [DocWithInfo i a] -> Sem effs [DocWithInfo i b]
forall (m :: * -> *) i a b.
Monad m =>
(i -> a -> m b) -> m [DocWithInfo i a] -> m [DocWithInfo i b]
mapDocsM i -> a -> Sem effs b
f (Sem effs [DocWithInfo i a] -> Sem effs [DocWithInfo i b])
-> (Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a])
-> Sem (Docs i a : effs) ()
-> Sem effs [DocWithInfo i b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a]
forall i a (effs :: [(* -> *) -> * -> *]).
Sem (Docs i a : effs) () -> Sem effs [DocWithInfo i a]
toDocList