{-# 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)