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 :: Compose f g x -> f (g x)
decompose = Compose f g x -> f (g x)
forall k1 (f :: k1 -> *) k2 (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose
  compose :: 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