module Lens.Family.Phantom where

import Control.Applicative.Backwards (Backwards(..))
import Control.Applicative (Const(..))
import Data.Functor.Constant (Constant(..))
import Data.Functor.Compose (Compose(..))

class Functor f => Phantom f where
  coerce :: f a -> f b

instance Phantom f => Phantom (Backwards f) where
  coerce (Backwards x) = Backwards (coerce x)

instance Phantom (Const a) where
  coerce (Const x) = (Const x)

instance Phantom (Constant a) where
  coerce (Constant x) = (Constant x)

instance (Phantom f, Functor g) => Phantom (Compose f g) where
  coerce (Compose x) = Compose (coerce x)