zinza-0.1: src/Zinza/Indexing.hs
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE UndecidableInstances #-}
module Zinza.Indexing where
import Data.Functor.Identity (Identity (..))
class Indexing v i | i -> v, v -> i where
extract :: i a -> a
index :: v a -> i b -> (a, b)
instance Indexing Identity Identity where
extract = runIdentity
index (Identity a) (Identity b) = (a, b)
data Idx f a
= Here a
| There (f a)
data Cons f a = a ::: f a
instance Indexing v i => Indexing (Cons v) (Idx i) where
extract (Here b) = b
extract (There bs) = extract bs
index (a ::: _) (Here b) = (a, b)
index (_ ::: as) (There bs) = index as bs