{-# LANGUAGE NoImplicitPrelude, ConstraintKinds, PolyKinds #-}

module Hask.Functor.Faithful where

import Hask.Category

--------------------------------------------------------------------------------
-- * Fully Faithful Functors
--------------------------------------------------------------------------------

class Functor f => FullyFaithful f where
  unfmap :: Cod f (f a) (f b) -> Dom f a b

instance FullyFaithful Dict where
  unfmap f = Sub $ f Dict

instance FullyFaithful (->) where
  unfmap (Nat f) = Op (f id)

instance FullyFaithful (:-) where
  unfmap (Nat f) = Op (f id)