ghc-exactprint-0.5.3.0: tests/examples/ghc8/Manipulate.hs
{- |
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