content: {- |
  Module      :  Control.Comonad.Sheet.Manipulate
  Description :  Generic functions for manipulating multi-dimensional comonadic spreadsheets.
  Copyright   :  Copyright (c) 2014 Kenneth Foner
  
  Maintainer  :  kenneth.foner@gmail.com
  Stability   :  experimental
  Portability :  non-portable
  
  This module defines the 'take', 'view', 'go', and 'insert' functions generically for any dimensionality of sheet. These
  constitute the preferred way of manipulating sheets, providing an interface to: take finite slices ('take'), infinite
  slices ('view'), move to locations ('go'), and insert finite or infinite structures ('insert').
  -}
  
  {-# LANGUAGE DataKinds             #-}
  {-# LANGUAGE FlexibleContexts      #-}
  {-# LANGUAGE FlexibleInstances     #-}
  {-# LANGUAGE MultiParamTypeClasses #-}
  {-# LANGUAGE TypeFamilies          #-}
  {-# LANGUAGE TypeOperators         #-}
  {-# LANGUAGE UndecidableInstances  #-}
  
  module Control.Comonad.Sheet.Manipulate where
  
  
  -- | In the case of a @Nested@ structure, @asDimensionalAs@ defaults to @asNestedAs@.
  instance (NestedAs x (Nested ts y), AsDimensionalAs x (Nested ts y) ~ AsNestedAs x (Nested ts y)) => DimensionalAs x (Nested ts y) where
     type x `AsDimensionalAs` (Nested ts a) = x `AsNestedAs` (Nested ts a)
     asDimensionalAs = asNestedAs
  
  -- | @DimensionalAs@ also knows the dimensionality of an 'Indexed' sheet as well as regular @Nested@ structures.
  instance (NestedAs x (Nested ts y)) => DimensionalAs x (Indexed ts y) where
     type x `AsDimensionalAs` (Indexed ts a) = x `AsNestedAs` (Nested ts a)
     x `asDimensionalAs` (Indexed i t)       = x `asNestedAs` t
  
  
  instance DepIndex (a,b) TH_0 where
      type (a,b) `DepIndexResult` TH_0 = a
      (a,b) # TH_0 = a
  