{-# LANGUAGE TypeFamilies, TypeOperators #-}
{-# OPTIONS_GHC -Wall #-}
----------------------------------------------------------------------
-- |
-- Module      :  FunctorCombo.Derivative
-- Copyright   :  (c) Conal Elliott 2010
-- License     :  BSD3
-- 
-- Maintainer  :  conal@conal.net
-- Stability   :  experimental
-- 
-- Derivatives (one-hole contexts) for standard Functor combinators
----------------------------------------------------------------------

module FunctorCombo.Derivative (Der) where

import FunctorCombo.Functor

{--------------------------------------------------------------------
    Derivatives, i.e., one-hole contexts
--------------------------------------------------------------------}

-- | A derivative, i.e., a one-hole context for a container f (probably a functor).
type family Der (f :: (* -> *)) :: (* -> *)

type instance Der (Const a) = Void

type instance Der Id = Unit

type instance Der (f :+: g) = Der f :+: Der g

type instance Der (f :*: g) = Der f :*: g  :+:  f :*: Der g

type instance Der (g :.  f) = Der g :. f  :*:  Der f