{-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE PartialTypeSignatures #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE PolyKinds #-} module Proton.Review where import Data.Profunctor import Data.Tagged import Data.Bifunctor import Proton.Getter import Data.Void type Review s t a b = forall p. (Profunctor p, Bifunctor p) => p a b -> p s t retagged :: forall p a b s. (Profunctor p, Bifunctor p) => p a b -> p s b retagged :: p a b -> p s b retagged = (Void -> s) -> p Void b -> p s b forall (p :: * -> * -> *) a b c. Bifunctor p => (a -> b) -> p a c -> p b c first Void -> s forall a. Void -> a absurd (p Void b -> p s b) -> (p a b -> p Void b) -> p a b -> p s b forall b c a. (b -> c) -> (a -> b) -> a -> c . (Void -> a) -> p a b -> p Void b forall (p :: * -> * -> *) a b c. Profunctor p => (a -> b) -> p b c -> p a c lmap Void -> a forall a. Void -> a absurd review :: (Tagged a b -> Tagged s t) -> b -> t review :: (Tagged a b -> Tagged s t) -> b -> t review pab :: Tagged a b -> Tagged s t pab b :: b b = Tagged s t -> t forall k (s :: k) b. Tagged s b -> b unTagged (Tagged s t -> t) -> (Tagged a b -> Tagged s t) -> Tagged a b -> t forall b c a. (b -> c) -> (a -> b) -> a -> c . Tagged a b -> Tagged s t pab (Tagged a b -> t) -> Tagged a b -> t forall a b. (a -> b) -> a -> b $ b -> Tagged a b forall k (s :: k) b. b -> Tagged s b Tagged b b infixr 8 # (#) :: (Tagged a b -> Tagged s t) -> b -> t # :: (Tagged a b -> Tagged s t) -> b -> t (#) = (Tagged a b -> Tagged s t) -> b -> t forall k k (a :: k) b (s :: k) t. (Tagged a b -> Tagged s t) -> b -> t review reviews :: (Tagged a b -> Tagged s t) -> (t -> t') -> b -> t' reviews :: (Tagged a b -> Tagged s t) -> (t -> t') -> b -> t' reviews r :: Tagged a b -> Tagged s t r f :: t -> t' f = t -> t' f (t -> t') -> (b -> t) -> b -> t' forall b c a. (b -> c) -> (a -> b) -> a -> c . (Tagged a b -> Tagged s t) -> b -> t forall k k (a :: k) b (s :: k) t. (Tagged a b -> Tagged s t) -> b -> t review Tagged a b -> Tagged s t r re :: (Tagged a b -> Tagged s t) -> Getter b a t s re :: (Tagged a b -> Tagged s t) -> Getter b a t s re r :: Tagged a b -> Tagged s t r = (b -> t) -> Getter b a t s forall s a t b. (s -> a) -> Getter s t a b to' ((Tagged a b -> Tagged s t) -> b -> t forall k k (a :: k) b (s :: k) t. (Tagged a b -> Tagged s t) -> b -> t review Tagged a b -> Tagged s t r) unto :: forall (s :: *) t (a :: *) b. (b -> t) -> (Tagged a b -> Tagged s t) unto :: (b -> t) -> Tagged a b -> Tagged s t unto f :: b -> t f = (b -> t) -> Tagged s b -> Tagged s t forall (p :: * -> * -> *) b c a. Profunctor p => (b -> c) -> p a b -> p a c rmap b -> t f (Tagged s b -> Tagged s t) -> (Tagged a b -> Tagged s b) -> Tagged a b -> Tagged s t forall b c a. (b -> c) -> (a -> b) -> a -> c . Tagged a b -> Tagged s b forall (p :: * -> * -> *) a b s. (Profunctor p, Bifunctor p) => p a b -> p s b retagged un :: Getter s t a b -> (Tagged t s -> Tagged b a) un :: Getter s t a b -> Tagged t s -> Tagged b a un g :: Getter s t a b g = (s -> a) -> Tagged t s -> Tagged b a forall s t a b. (b -> t) -> Tagged a b -> Tagged s t unto (Optic (Forget a) s t a b -> s -> a forall a s t b. Optic (Forget a) s t a b -> s -> a view Optic (Forget a) s t a b Getter s t a b g)