    {-# LANGUAGE Safe #-}
    module Data.Functor.Composition
      ( Composition(..) ) where

    import Data.Functor.Compose

    -- | We often need to distinguish between various forms of Functor-like composition in Haskell in order to please the type system.
    -- This lets us work with these representations uniformly.
    class Composition o where
      decompose :: o f g x -> f (g x)
      compose :: f (g x) -> o f g x

    instance Composition Compose where
      decompose :: forall (f :: * -> *) (g :: * -> *) x. Compose f g x -> f (g x)
    decompose = Compose f g x -> f (g x)
    forall {k1} {k2} (f :: k1 -> *) (g :: k2 -> k1) (a :: k2).
    Compose f g a -> f (g a)
    getCompose
      compose :: forall (f :: * -> *) (g :: * -> *) x. f (g x) -> Compose f g x
    compose = f (g x) -> Compose f g x
    forall {k} {k1} (f :: k -> *) (g :: k1 -> k) (a :: k1).
    f (g a) -> Compose f g a
    Compose