-----------------------------------------------------------------------------
-- |
-- Module      :  Control.Comonad.Indexed
-- Copyright   :  (C) 2008 Edward Kmett
-- License     :  BSD-style (see the file LICENSE)
--
-- Maintainer  :  Reiner Pope <reiner.pope@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
----------------------------------------------------------------------------
module Control.Comonad.Indexed
  ( IxFunctor(..)
  , IxCopointed(..)
  , IxComonad(..)
  , iduplicate
  ) where

import Data.Functor.Indexed

class IxCopointed w => IxComonad w where
  iextend :: (w j k a -> b) -> w i k a -> w i j b

iduplicate :: IxComonad w => w i k a -> w i j (w j k a)
iduplicate :: forall {k} (w :: k -> k -> * -> *) (i :: k) (k :: k) a (j :: k).
IxComonad w =>
w i k a -> w i j (w j k a)
iduplicate = forall {k} (w :: k -> k -> * -> *) (j :: k) (k :: k) a b (i :: k).
IxComonad w =>
(w j k a -> b) -> w i k a -> w i j b
iextend forall a. a -> a
id