module Proton.Miso where

import Data.Profunctor

data Miso m a b s t = Miso (s -> m a) (b -> m t)

instance Functor m => Profunctor (Miso m a b) where
  dimap :: (a -> b) -> (c -> d) -> Miso m a b b c -> Miso m a b a d
dimap l :: a -> b
l r :: c -> d
r (Miso sma :: b -> m a
sma bmt :: b -> m c
bmt) = (a -> m a) -> (b -> m d) -> Miso m a b a d
forall (m :: * -> *) a b s t.
(s -> m a) -> (b -> m t) -> Miso m a b s t
Miso (b -> m a
sma (b -> m a) -> (a -> b) -> a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
l) ((c -> d) -> m c -> m d
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
r (m c -> m d) -> (b -> m c) -> b -> m d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> m c
bmt)