module Data.Profunctor.Product.Newtype where

import qualified Data.Profunctor as P

class Newtype t where
  constructor :: a -> t a
  field       :: t a -> a

pNewtype :: (P.Profunctor p, Newtype t) => p a b -> p (t a) (t b)
pNewtype :: p a b -> p (t a) (t b)
pNewtype = (t a -> a) -> (b -> t b) -> p a b -> p (t a) (t b)
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
P.dimap t a -> a
forall (t :: * -> *) a. Newtype t => t a -> a
field b -> t b
forall (t :: * -> *) a. Newtype t => a -> t a
constructor