{-# LANGUAGE DataKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
module Polysemy.Vinyl (
rContramapInput
, rContramapInput'
, rMapOutput
, rMapOutput'
) where
import Control.Arrow
import Data.Vinyl
import Polysemy
import Polysemy.Extra
import Polysemy.Input
import Polysemy.Output
rContramapInput :: (RMap xs, Members '[Input (Rec f xs)] r)
=> (forall y. f y -> g y)
-> Sem (Input (Rec g xs) ': r) a
-> Sem r a
rContramapInput :: (forall y. f y -> g y) -> Sem (Input (Rec g xs) : r) a -> Sem r a
rContramapInput forall y. f y -> g y
k = (Rec f xs -> Rec g xs) -> Sem (Input (Rec g xs) : r) a -> Sem r a
forall i i' (r :: [(* -> *) -> * -> *]) a.
Members '[Input i'] r =>
(i' -> i) -> Sem (Input i : r) a -> Sem r a
contramapInput ((forall y. f y -> g y) -> Rec f xs -> Rec g xs
forall u (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap forall y. f y -> g y
k)
rContramapInput' :: RMap xs
=> (forall y. f y -> g y)
-> Sem (Input (Rec g xs) ': r) a
-> Sem (Input (Rec f xs) ': r) a
rContramapInput' :: (forall y. f y -> g y)
-> Sem (Input (Rec g xs) : r) a -> Sem (Input (Rec f xs) : r) a
rContramapInput' forall y. f y -> g y
k = Sem (Input (Rec g xs) : r) a
-> Sem (Input (Rec g xs) : Input (Rec f xs) : r) a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder (Sem (Input (Rec g xs) : r) a
-> Sem (Input (Rec g xs) : Input (Rec f xs) : r) a)
-> (Sem (Input (Rec g xs) : Input (Rec f xs) : r) a
-> Sem (Input (Rec f xs) : r) a)
-> Sem (Input (Rec g xs) : r) a
-> Sem (Input (Rec f xs) : r) a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (forall y. f y -> g y)
-> Sem (Input (Rec g xs) : Input (Rec f xs) : r) a
-> Sem (Input (Rec f xs) : r) a
forall (xs :: [*]) (f :: * -> *) (r :: [(* -> *) -> * -> *])
(g :: * -> *) a.
(RMap xs, Members '[Input (Rec f xs)] r) =>
(forall y. f y -> g y) -> Sem (Input (Rec g xs) : r) a -> Sem r a
rContramapInput forall y. f y -> g y
k
rMapOutput :: (RMap xs, Members '[Output (Rec g xs)] r)
=> (forall y. f y -> g y)
-> Sem (Output (Rec f xs) ': r) a
-> Sem r a
rMapOutput :: (forall y. f y -> g y) -> Sem (Output (Rec f xs) : r) a -> Sem r a
rMapOutput forall y. f y -> g y
k = (Rec f xs -> Rec g xs) -> Sem (Output (Rec f xs) : r) a -> Sem r a
forall o' (r :: [(* -> *) -> * -> *]) o a.
Members '[Output o'] r =>
(o -> o') -> Sem (Output o : r) a -> Sem r a
mapOutput ((forall y. f y -> g y) -> Rec f xs -> Rec g xs
forall u (rs :: [u]) (f :: u -> *) (g :: u -> *).
RMap rs =>
(forall (x :: u). f x -> g x) -> Rec f rs -> Rec g rs
rmap forall y. f y -> g y
k)
rMapOutput' :: RMap xs
=> (forall y. f y -> g y)
-> Sem (Output (Rec f xs) ': r) a
-> Sem (Output (Rec g xs) ': r) a
rMapOutput' :: (forall y. f y -> g y)
-> Sem (Output (Rec f xs) : r) a -> Sem (Output (Rec g xs) : r) a
rMapOutput' forall y. f y -> g y
k = Sem (Output (Rec f xs) : r) a
-> Sem (Output (Rec f xs) : Output (Rec g xs) : r) a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
(r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder (Sem (Output (Rec f xs) : r) a
-> Sem (Output (Rec f xs) : Output (Rec g xs) : r) a)
-> (Sem (Output (Rec f xs) : Output (Rec g xs) : r) a
-> Sem (Output (Rec g xs) : r) a)
-> Sem (Output (Rec f xs) : r) a
-> Sem (Output (Rec g xs) : r) a
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (forall y. f y -> g y)
-> Sem (Output (Rec f xs) : Output (Rec g xs) : r) a
-> Sem (Output (Rec g xs) : r) a
forall (xs :: [*]) (g :: * -> *) (r :: [(* -> *) -> * -> *])
(f :: * -> *) a.
(RMap xs, Members '[Output (Rec g xs)] r) =>
(forall y. f y -> g y) -> Sem (Output (Rec f xs) : r) a -> Sem r a
rMapOutput forall y. f y -> g y
k