{-# LANGUAGE
    KindSignatures
  #-}

module Data.Singleton.Class where

import Data.Functor.Identity (Identity (..))
import Data.Functor.Compose  (Compose (..))



class Extractable (f :: * -> *) where
  runSingleton :: f a -> a


instance Extractable ((,) e) where
  runSingleton (_,x) = x

instance Extractable ((,,) w s) where
  runSingleton (_,_,x) = x

instance Extractable Identity where
  runSingleton (Identity x) = x


instance (Extractable f, Extractable g) => Extractable (Compose f g) where
  runSingleton (Compose x) = runSingleton (runSingleton x)