content: {-# LANGUAGE DefaultSignatures #-}
  {-# LANGUAGE PolyKinds         #-}
  {-# LANGUAGE RankNTypes        #-}
  {-# LANGUAGE TypeOperators     #-}
  
  module Type.Class.Higher.Util where
  
  import           Control.DeepSeq
  import           Control.Monad
  import           Data.Monoid
  import           Type.Class.Higher
  import           Type.Class.Witness
  
  traverse1_
      :: (Foldable1 t, Applicative h)
      => (forall a. f a -> h c)
      -> t f b
      -> h ()
  traverse1_ f = ($ pure ()) . appEndo . foldMap1 (Endo . (<*) . void . f)
  
  mapM1_
      :: (Foldable1 t, Applicative h)
      => (forall a. f a -> h c)
      -> t f b
      -> h ()
  mapM1_ = traverse1_
  
  forM1_
      :: (Foldable1 t, Applicative h)
      => t f b
      -> (forall a. f a -> h c)
      -> h ()
  forM1_ x f = mapM1_ f x
  
  all1
      :: Foldable1 t
      => (forall a. f a -> Bool)
      -> t f b
      -> Bool
  all1 p = getAll . foldMap1 (All . p)
  
  produceEq1 :: Eq1 f :- Eq (f a)
  produceEq1 = Sub undefined
  
  class NFData1 f where
      rnf1 :: f a -> ()
      default rnf1 :: NFData (f a) => f a -> ()
      rnf1 = rnf
  
  deepseq1 :: NFData1 f => f a -> b -> b
  deepseq1 x y = rnf1 x `seq` y
  
  force1 :: NFData1 f => f a -> f a
  force1 x = x `deepseq1` x
  
  