{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE IncoherentInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeInType #-}
module Data.Parameterized.Context.Safe
( module Data.Parameterized.Ctx
, Size
, sizeInt
, zeroSize
, incSize
, decSize
, extSize
, addSize
, SizeView(..)
, viewSize
, KnownContext(..)
, Diff
, noDiff
, extendRight
, appendDiff
, DiffView(..)
, viewDiff
, KnownDiff(..)
, IsAppend(..)
, diffIsAppend
, Index
, indexVal
, baseIndex
, skipIndex
, lastIndex
, nextIndex
, extendIndex
, extendIndex'
, forIndex
, forIndexRange
, intIndex
, Assignment
, size
, Data.Parameterized.Context.Safe.replicate
, generate
, generateM
, empty
, extend
, adjust
, update
, adjustM
, AssignView(..)
, viewAssign
, (!)
, (!^)
, zipWith
, zipWithM
, (<++>)
, traverseWithIndex
) where
import qualified Control.Category as Cat
import Control.DeepSeq
import qualified Control.Lens as Lens
import Control.Monad.Identity (Identity(..))
import Data.Hashable
import Data.List (intercalate)
import Data.Maybe (listToMaybe)
import Data.Type.Equality
import Prelude hiding (init, map, null, replicate, succ, zipWith)
import Data.Kind(Type)
#if !MIN_VERSION_base(4,8,0)
import Data.Functor
import Control.Applicative (Applicative(..))
#endif
import Data.Parameterized.Classes
import Data.Parameterized.Ctx
import Data.Parameterized.Some
import Data.Parameterized.TraversableFC
data Size (ctx :: Ctx k) where
SizeZero :: Size 'EmptyCtx
SizeSucc :: !(Size ctx) -> Size (ctx '::> tp)
sizeInt :: Size ctx -> Int
sizeInt SizeZero = 0
sizeInt (SizeSucc sz) = (+1) $! sizeInt sz
zeroSize :: Size 'EmptyCtx
zeroSize = SizeZero
incSize :: Size ctx -> Size (ctx '::> tp)
incSize sz = SizeSucc sz
decSize :: Size (ctx '::> tp) -> Size ctx
decSize (SizeSucc sz) = sz
addSize :: Size x -> Size y -> Size (x <+> y)
addSize sx SizeZero = sx
addSize sx (SizeSucc sy) = SizeSucc (addSize sx sy)
data SizeView (ctx :: Ctx k) where
ZeroSize :: SizeView 'EmptyCtx
IncSize :: !(Size ctx) -> SizeView (ctx '::> tp)
viewSize :: Size ctx -> SizeView ctx
viewSize SizeZero = ZeroSize
viewSize (SizeSucc s) = IncSize s
class KnownContext (ctx :: Ctx k) where
knownSize :: Size ctx
instance KnownContext 'EmptyCtx where
knownSize = zeroSize
instance KnownContext ctx => KnownContext (ctx '::> tp) where
knownSize = incSize knownSize
data Diff (l :: Ctx k) (r :: Ctx k) where
DiffHere :: Diff ctx ctx
DiffThere :: Diff ctx1 ctx2 -> Diff ctx1 (ctx2 '::> tp)
noDiff :: Diff l l
noDiff = DiffHere
extendRight :: Diff l r -> Diff l (r '::> tp)
extendRight diff = DiffThere diff
appendDiff :: Size r -> Diff l (l <+> r)
appendDiff SizeZero = DiffHere
appendDiff (SizeSucc sz) = DiffThere (appendDiff sz)
composeDiff :: Diff a b -> Diff b c -> Diff a c
composeDiff x DiffHere = x
composeDiff x (DiffThere y) = DiffThere (composeDiff x y)
instance Cat.Category Diff where
id = DiffHere
d1 . d2 = composeDiff d2 d1
extSize :: Size l -> Diff l r -> Size r
extSize sz DiffHere = sz
extSize sz (DiffThere diff) = incSize (extSize sz diff)
data IsAppend l r where
IsAppend :: Size app -> IsAppend l (l <+> app)
diffIsAppend :: Diff l r -> IsAppend l r
diffIsAppend DiffHere = IsAppend zeroSize
diffIsAppend (DiffThere diff) =
case diffIsAppend diff of
IsAppend sz -> IsAppend (incSize sz)
data DiffView a b where
NoDiff :: DiffView a a
ExtendRightDiff :: Diff a b -> DiffView a (b ::> r)
viewDiff :: Diff a b -> DiffView a b
viewDiff DiffHere = NoDiff
viewDiff (DiffThere diff) = ExtendRightDiff diff
class KnownDiff (l :: Ctx k) (r :: Ctx k) where
knownDiff :: Diff l r
instance KnownDiff l l where
knownDiff = noDiff
instance KnownDiff l r => KnownDiff l (r '::> tp) where
knownDiff = extendRight knownDiff
data Index (ctx :: Ctx k) (tp :: k) where
IndexHere :: Size ctx -> Index (ctx '::> tp) tp
IndexThere :: !(Index ctx tp) -> Index (ctx '::> tp') tp
indexVal :: Index ctx tp -> Int
indexVal (IndexHere sz) = sizeInt sz
indexVal (IndexThere idx) = indexVal idx
instance Eq (Index ctx tp) where
idx1 == idx2 = isJust (testEquality idx1 idx2)
instance TestEquality (Index ctx) where
testEquality (IndexHere _) (IndexHere _) = Just Refl
testEquality (IndexHere _) (IndexThere _) = Nothing
testEquality (IndexThere _) (IndexHere _) = Nothing
testEquality (IndexThere idx1) (IndexThere idx2) =
case testEquality idx1 idx2 of
Just Refl -> Just Refl
Nothing -> Nothing
instance Ord (Index ctx tp) where
compare i j = toOrdering (compareF i j)
instance OrdF (Index ctx) where
compareF (IndexHere _) (IndexHere _) = EQF
compareF (IndexThere _) (IndexHere _) = LTF
compareF (IndexHere _) (IndexThere _) = GTF
compareF (IndexThere idx1) (IndexThere idx2) = lexCompareF idx1 idx2 $ EQF
baseIndex :: Index ('EmptyCtx '::> tp) tp
baseIndex = IndexHere SizeZero
skipIndex :: Index ctx x -> Index (ctx '::> y) x
skipIndex idx = IndexThere idx
nextIndex :: Size ctx -> Index (ctx '::> tp) tp
nextIndex sz = IndexHere sz
lastIndex :: Size (ctx ::> tp) -> Index (ctx ::> tp) tp
lastIndex (SizeSucc s) = IndexHere s
{-# INLINE extendIndex #-}
extendIndex :: KnownDiff l r => Index l tp -> Index r tp
extendIndex = extendIndex' knownDiff
{-# INLINE extendIndex' #-}
extendIndex' :: Diff l r -> Index l tp -> Index r tp
extendIndex' DiffHere idx = idx
extendIndex' (DiffThere diff) idx = IndexThere (extendIndex' diff idx)
forIndex :: forall ctx r
. Size ctx
-> (forall tp . r -> Index ctx tp -> r)
-> r
-> r
forIndex sz_top f = go id sz_top
where go :: forall ctx'. (forall tp. Index ctx' tp -> Index ctx tp) -> Size ctx' -> r -> r
go _ SizeZero = id
go g (SizeSucc sz) = \r -> go (\i -> g (IndexThere i)) sz $ f r (g (IndexHere sz))
data LDiff (l :: Ctx k) (r :: Ctx k) where
LDiffHere :: LDiff a a
LDiffThere :: !(LDiff (a::>x) b) -> LDiff a b
ldiffIndex :: Index a tp -> LDiff a b -> Index b tp
ldiffIndex i LDiffHere = i
ldiffIndex i (LDiffThere d) = ldiffIndex (IndexThere i) d
forIndexLDiff :: Size a
-> LDiff a b
-> (forall tp . Index b tp -> r -> r)
-> r
-> r
forIndexLDiff _ LDiffHere _ r = r
forIndexLDiff sz (LDiffThere d) f r =
forIndexLDiff (SizeSucc sz) d f (f (ldiffIndex (IndexHere sz) d) r)
forIndexRangeImpl :: Int
-> Size a
-> LDiff a b
-> (forall tp . Index b tp -> r -> r)
-> r
-> r
forIndexRangeImpl 0 sz d f r = forIndexLDiff sz d f r
forIndexRangeImpl _ SizeZero _ _ r = r
forIndexRangeImpl i (SizeSucc sz) d f r =
forIndexRangeImpl (i-1) sz (LDiffThere d) f r
forIndexRange :: Int
-> Size ctx
-> (forall tp . Index ctx tp -> r -> r)
-> r
-> r
forIndexRange i sz f r = forIndexRangeImpl i sz LDiffHere f r
indexList :: forall ctx. Size ctx -> [Some (Index ctx)]
indexList sz_top = go id [] sz_top
where go :: (forall tp. Index ctx' tp -> Index ctx tp)
-> [Some (Index ctx)]
-> Size ctx'
-> [Some (Index ctx)]
go _ ls SizeZero = ls
go g ls (SizeSucc sz) = go (\i -> g (IndexThere i)) (Some (g (IndexHere sz)) : ls) sz
intIndex :: Int -> Size ctx -> Maybe (Some (Index ctx))
intIndex n sz = listToMaybe $ drop n $ indexList sz
instance Show (Index ctx tp) where
show = show . indexVal
instance ShowF (Index ctx)
data Assignment (f :: k -> Type) (ctx :: Ctx k) where
AssignmentEmpty :: Assignment f EmptyCtx
AssignmentExtend :: Assignment f ctx -> f tp -> Assignment f (ctx ::> tp)
data AssignView (f :: k -> Type) (ctx :: Ctx k) where
AssignEmpty :: AssignView f EmptyCtx
AssignExtend :: Assignment f ctx -> f tp -> AssignView f (ctx::>tp)
viewAssign :: forall f ctx . Assignment f ctx -> AssignView f ctx
viewAssign AssignmentEmpty = AssignEmpty
viewAssign (AssignmentExtend asgn x) = AssignExtend asgn x
instance NFData (Assignment f ctx) where
rnf AssignmentEmpty = ()
rnf (AssignmentExtend asgn x) = rnf asgn `seq` x `seq` ()
size :: Assignment f ctx -> Size ctx
size AssignmentEmpty = SizeZero
size (AssignmentExtend asgn _) = SizeSucc (size asgn)
generate :: forall ctx f
. Size ctx
-> (forall tp . Index ctx tp -> f tp)
-> Assignment f ctx
generate sz_top f = go id sz_top
where go :: forall ctx'
. (forall tp. Index ctx' tp -> Index ctx tp)
-> Size ctx'
-> Assignment f ctx'
go _ SizeZero = AssignmentEmpty
go g (SizeSucc sz) =
let ctx = go (\i -> g (IndexThere i)) sz
x = f (g (IndexHere sz))
in AssignmentExtend ctx x
generateM :: forall ctx m f
. Applicative m
=> Size ctx
-> (forall tp . Index ctx tp -> m (f tp))
-> m (Assignment f ctx)
generateM sz_top f = go id sz_top
where go :: forall ctx'. (forall tp. Index ctx' tp -> Index ctx tp) -> Size ctx' -> m (Assignment f ctx')
go _ SizeZero = pure AssignmentEmpty
go g (SizeSucc sz) =
AssignmentExtend <$> (go (\i -> g (IndexThere i)) sz) <*> f (g (IndexHere sz))
replicate :: Size ctx -> (forall tp . f tp) -> Assignment f ctx
replicate n c = generate n (\_ -> c)
empty :: Assignment f 'EmptyCtx
empty = AssignmentEmpty
extend :: Assignment f ctx -> f tp -> Assignment f (ctx '::> tp)
extend asgn e = AssignmentExtend asgn e
{-# DEPRECATED adjust "Replace 'adjust f i asgn' with 'Lens.over (ixF i) f asgn' instead." #-}
adjust :: forall f ctx tp. (f tp -> f tp) -> Index ctx tp -> Assignment f ctx -> Assignment f ctx
adjust f idx asgn = runIdentity (adjustM (Identity . f) idx asgn)
{-# DEPRECATED update "Replace 'update idx val asgn' with 'Lens.set (ixF idx) val asgn' instead." #-}
update :: forall f ctx tp. Index ctx tp -> f tp -> Assignment f ctx -> Assignment f ctx
update i v a = adjust (\_ -> v) i a
adjustM :: forall m f ctx tp. Functor m => (f tp -> m (f tp)) -> Index ctx tp -> Assignment f ctx -> m (Assignment f ctx)
adjustM f = go (\x -> x)
where
go :: (forall tp'. g tp' -> f tp') -> Index ctx' tp -> Assignment g ctx' -> m (Assignment f ctx')
go g (IndexHere _) (AssignmentExtend asgn x) = AssignmentExtend (map g asgn) <$> f (g x)
go g (IndexThere idx) (AssignmentExtend asgn x) = flip AssignmentExtend (g x) <$> go g idx asgn
#if !MIN_VERSION_base(4,9,0)
go _ _ _ = error "SafeTypeContext.adjustM: impossible!"
#endif
type instance IndexF (Assignment (f :: k -> Type) ctx) = Index ctx
type instance IxValueF (Assignment (f :: k -> Type) ctx) = f
instance forall (f :: k -> Type) ctx. IxedF k (Assignment f ctx) where
ixF :: Index ctx x -> Lens.Lens' (Assignment f ctx) (f x)
ixF idx f = adjustM f idx
instance forall (f :: k -> Type) ctx. IxedF' k (Assignment f ctx) where
ixF' :: Index ctx x -> Lens.Lens' (Assignment f ctx) (f x)
ixF' idx f = adjustM f idx
idxlookup :: (forall tp. a tp -> b tp) -> Assignment a ctx -> forall tp. Index ctx tp -> b tp
idxlookup f (AssignmentExtend _ x) (IndexHere _) = f x
idxlookup f (AssignmentExtend ctx _) (IndexThere idx) = idxlookup f ctx idx
idxlookup _ AssignmentEmpty _ = error "Data.Parameterized.Context.Safe.lookup: impossible case"
(!) :: Assignment f ctx -> Index ctx tp -> f tp
(!) asgn idx = idxlookup id asgn idx
(!^) :: KnownDiff l r => Assignment f r -> Index l tp -> f tp
a !^ i = a ! extendIndex i
instance TestEquality f => Eq (Assignment f ctx) where
x == y = isJust (testEquality x y)
testEq :: (forall x y. f x -> f y -> Maybe (x :~: y))
-> Assignment f cxt1 -> Assignment f cxt2 -> Maybe (cxt1 :~: cxt2)
testEq _ AssignmentEmpty AssignmentEmpty = Just Refl
testEq test (AssignmentExtend ctx1 x1) (AssignmentExtend ctx2 x2) =
case testEq test ctx1 ctx2 of
Nothing -> Nothing
Just Refl ->
case test x1 x2 of
Nothing -> Nothing
Just Refl -> Just Refl
testEq _ AssignmentEmpty AssignmentExtend{} = Nothing
testEq _ AssignmentExtend{} AssignmentEmpty = Nothing
instance TestEqualityFC Assignment where
testEqualityFC = testEq
instance TestEquality f => TestEquality (Assignment f) where
testEquality x y = testEq testEquality x y
instance TestEquality f => PolyEq (Assignment f x) (Assignment f y) where
polyEqF x y = fmap (\Refl -> Refl) $ testEquality x y
compareAsgn :: (forall x y. f x -> f y -> OrderingF x y)
-> Assignment f ctx1 -> Assignment f ctx2 -> OrderingF ctx1 ctx2
compareAsgn _ AssignmentEmpty AssignmentEmpty = EQF
compareAsgn _ AssignmentEmpty _ = GTF
compareAsgn _ _ AssignmentEmpty = LTF
compareAsgn test (AssignmentExtend ctx1 x) (AssignmentExtend ctx2 y) =
case compareAsgn test ctx1 ctx2 of
LTF -> LTF
GTF -> GTF
EQF -> case test x y of
LTF -> LTF
GTF -> GTF
EQF -> EQF
instance OrdFC Assignment where
compareFC = compareAsgn
instance OrdF f => OrdF (Assignment f) where
compareF = compareAsgn compareF
instance OrdF f => Ord (Assignment f ctx) where
compare x y = toOrdering (compareF x y)
instance Hashable (Index ctx tp) where
hashWithSalt = hashWithSaltF
instance HashableF (Index ctx) where
hashWithSaltF s i = hashWithSalt s (indexVal i)
instance HashableF f => HashableF (Assignment f) where
hashWithSaltF = hashWithSalt
instance HashableF f => Hashable (Assignment f ctx) where
hashWithSalt s AssignmentEmpty = s
hashWithSalt s (AssignmentExtend asgn x) = (s `hashWithSalt` asgn) `hashWithSaltF` x
instance ShowF f => Show (Assignment f ctx) where
show a = "[" ++ intercalate ", " (toList showF a) ++ "]"
instance ShowF f => ShowF (Assignment f)
instance FunctorFC Assignment where
fmapFC = fmapFCDefault
instance FoldableFC Assignment where
foldMapFC = foldMapFCDefault
instance TraversableFC Assignment where
traverseFC = traverseF
map :: (forall tp . f tp -> g tp) -> Assignment f c -> Assignment g c
map = fmapFC
traverseF :: forall (f:: k -> Type) (g::k -> Type) (m:: Type -> Type) (c::Ctx k)
. Applicative m
=> (forall tp . f tp -> m (g tp))
-> Assignment f c
-> m (Assignment g c)
traverseF _ AssignmentEmpty = pure AssignmentEmpty
traverseF f (AssignmentExtend asgn x) = pure AssignmentExtend <*> traverseF f asgn <*> f x
toList :: (forall tp . f tp -> a)
-> Assignment f c
-> [a]
toList = toListFC
zipWithM :: Applicative m
=> (forall tp . f tp -> g tp -> m (h tp))
-> Assignment f c
-> Assignment g c
-> m (Assignment h c)
zipWithM f x y = go x y
where go AssignmentEmpty AssignmentEmpty = pure AssignmentEmpty
go (AssignmentExtend asgn1 x1) (AssignmentExtend asgn2 x2) =
AssignmentExtend <$> (zipWithM f asgn1 asgn2) <*> (f x1 x2)
zipWith :: (forall x . f x -> g x -> h x)
-> Assignment f a
-> Assignment g a
-> Assignment h a
zipWith f = \x y -> runIdentity $ zipWithM (\u v -> pure (f u v)) x y
{-# INLINE zipWith #-}
traverseWithIndex :: Applicative m
=> (forall tp . Index ctx tp -> f tp -> m (g tp))
-> Assignment f ctx
-> m (Assignment g ctx)
traverseWithIndex f a = generateM (size a) $ \i -> f i (a ! i)
(<++>) :: Assignment f x -> Assignment f y -> Assignment f (x <+> y)
x <++> AssignmentEmpty = x
x <++> AssignmentExtend y t = AssignmentExtend (x <++> y) t
instance (KnownRepr (Assignment f) ctx, KnownRepr f bt)
=> KnownRepr (Assignment f) (ctx ::> bt) where
knownRepr = knownRepr `extend` knownRepr
instance KnownRepr (Assignment f) EmptyCtx where
knownRepr = empty
data MyNat where
MyZ :: MyNat
MyS :: MyNat -> MyNat
type MyZ = 'MyZ
type MyS = 'MyS
data MyNatRepr :: MyNat -> Type where
MyZR :: MyNatRepr MyZ
MySR :: MyNatRepr n -> MyNatRepr (MyS n)
type family StrongCtxUpdate (n::MyNat) (ctx::Ctx k) (z::k) :: Ctx k where
StrongCtxUpdate n EmptyCtx z = EmptyCtx
StrongCtxUpdate MyZ (ctx::>x) z = ctx ::> z
StrongCtxUpdate (MyS n) (ctx::>x) z = (StrongCtxUpdate n ctx z) ::> x
type family MyNatLookup (n::MyNat) (ctx::Ctx k) (f::k -> Type) :: Type where
MyNatLookup n EmptyCtx f = ()
MyNatLookup MyZ (ctx::>x) f = f x
MyNatLookup (MyS n) (ctx::>x) f = MyNatLookup n ctx f
mynat_lookup :: MyNatRepr n -> Assignment f ctx -> MyNatLookup n ctx f
mynat_lookup _ AssignmentEmpty = ()
mynat_lookup MyZR (AssignmentExtend _ x) = x
mynat_lookup (MySR n) (AssignmentExtend asgn _) = mynat_lookup n asgn
strong_ctx_update :: MyNatRepr n -> Assignment f ctx -> f tp -> Assignment f (StrongCtxUpdate n ctx tp)
strong_ctx_update _ AssignmentEmpty _ = AssignmentEmpty
strong_ctx_update MyZR (AssignmentExtend asgn _) z = AssignmentExtend asgn z
strong_ctx_update (MySR n) (AssignmentExtend asgn x) z = AssignmentExtend (strong_ctx_update n asgn z) x
type Assignment1 f x1 = Assignment f ('EmptyCtx '::> x1)
instance Lens.Field1 (Assignment1 f t) (Assignment1 f u) (f t) (f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR
type Assignment2 f x1 x2
= Assignment f ('EmptyCtx '::> x1 '::> x2)
instance Lens.Field1 (Assignment2 f t x2) (Assignment2 f u x2) (f t) (f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MyZR
instance Lens.Field2 (Assignment2 f x1 t) (Assignment2 f x1 u) (f t) (f u) where
_2 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR
type Assignment3 f x1 x2 x3
= Assignment f ('EmptyCtx '::> x1 '::> x2 '::> x3)
instance Lens.Field1 (Assignment3 f t x2 x3)
(Assignment3 f u x2 x3)
(f t)
(f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MyZR
instance Lens.Field2 (Assignment3 f x1 t x3)
(Assignment3 f x1 u x3)
(f t)
(f u) where
_2 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MyZR
instance Lens.Field3 (Assignment3 f x1 x2 t)
(Assignment3 f x1 x2 u)
(f t)
(f u) where
_3 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR
type Assignment4 f x1 x2 x3 x4
= Assignment f ('EmptyCtx '::> x1 '::> x2 '::> x3 '::> x4)
instance Lens.Field1 (Assignment4 f t x2 x3 x4)
(Assignment4 f u x2 x3 x4)
(f t)
(f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MyZR
instance Lens.Field2 (Assignment4 f x1 t x3 x4)
(Assignment4 f x1 u x3 x4)
(f t)
(f u) where
_2 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MyZR
instance Lens.Field3 (Assignment4 f x1 x2 t x4)
(Assignment4 f x1 x2 u x4)
(f t)
(f u) where
_3 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MyZR
instance Lens.Field4 (Assignment4 f x1 x2 x3 t)
(Assignment4 f x1 x2 x3 u)
(f t)
(f u) where
_4 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR
type Assignment5 f x1 x2 x3 x4 x5
= Assignment f ('EmptyCtx '::> x1 '::> x2 '::> x3 '::> x4 '::> x5)
instance Lens.Field1 (Assignment5 f t x2 x3 x4 x5)
(Assignment5 f u x2 x3 x4 x5)
(f t)
(f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field2 (Assignment5 f x1 t x3 x4 x5)
(Assignment5 f x1 u x3 x4 x5)
(f t)
(f u) where
_2 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MyZR
instance Lens.Field3 (Assignment5 f x1 x2 t x4 x5)
(Assignment5 f x1 x2 u x4 x5)
(f t)
(f u) where
_3 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MyZR
instance Lens.Field4 (Assignment5 f x1 x2 x3 t x5)
(Assignment5 f x1 x2 x3 u x5)
(f t)
(f u) where
_4 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MyZR
instance Lens.Field5 (Assignment5 f x1 x2 x3 x4 t)
(Assignment5 f x1 x2 x3 x4 u)
(f t)
(f u) where
_5 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR
type Assignment6 f x1 x2 x3 x4 x5 x6
= Assignment f ('EmptyCtx '::> x1 '::> x2 '::> x3 '::> x4 '::> x5 '::> x6)
instance Lens.Field1 (Assignment6 f t x2 x3 x4 x5 x6)
(Assignment6 f u x2 x3 x4 x5 x6)
(f t)
(f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field2 (Assignment6 f x1 t x3 x4 x5 x6)
(Assignment6 f x1 u x3 x4 x5 x6)
(f t)
(f u) where
_2 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field3 (Assignment6 f x1 x2 t x4 x5 x6)
(Assignment6 f x1 x2 u x4 x5 x6)
(f t)
(f u) where
_3 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MyZR
instance Lens.Field4 (Assignment6 f x1 x2 x3 t x5 x6)
(Assignment6 f x1 x2 x3 u x5 x6)
(f t)
(f u) where
_4 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MyZR
instance Lens.Field5 (Assignment6 f x1 x2 x3 x4 t x6)
(Assignment6 f x1 x2 x3 x4 u x6)
(f t)
(f u) where
_5 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MyZR
instance Lens.Field6 (Assignment6 f x1 x2 x3 x4 x5 t)
(Assignment6 f x1 x2 x3 x4 x5 u)
(f t)
(f u) where
_6 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR
type Assignment7 f x1 x2 x3 x4 x5 x6 x7
= Assignment f ('EmptyCtx '::> x1 '::> x2 '::> x3 '::> x4 '::> x5 '::> x6 '::> x7)
instance Lens.Field1 (Assignment7 f t x2 x3 x4 x5 x6 x7)
(Assignment7 f u x2 x3 x4 x5 x6 x7)
(f t)
(f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field2 (Assignment7 f x1 t x3 x4 x5 x6 x7)
(Assignment7 f x1 u x3 x4 x5 x6 x7)
(f t)
(f u) where
_2 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field3 (Assignment7 f x1 x2 t x4 x5 x6 x7)
(Assignment7 f x1 x2 u x4 x5 x6 x7)
(f t)
(f u) where
_3 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field4 (Assignment7 f x1 x2 x3 t x5 x6 x7)
(Assignment7 f x1 x2 x3 u x5 x6 x7)
(f t)
(f u) where
_4 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MyZR
instance Lens.Field5 (Assignment7 f x1 x2 x3 x4 t x6 x7)
(Assignment7 f x1 x2 x3 x4 u x6 x7)
(f t)
(f u) where
_5 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MyZR
instance Lens.Field6 (Assignment7 f x1 x2 x3 x4 x5 t x7)
(Assignment7 f x1 x2 x3 x4 x5 u x7)
(f t)
(f u) where
_6 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MyZR
instance Lens.Field7 (Assignment7 f x1 x2 x3 x4 x5 x6 t)
(Assignment7 f x1 x2 x3 x4 x5 x6 u)
(f t)
(f u) where
_7 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR
type Assignment8 f x1 x2 x3 x4 x5 x6 x7 x8
= Assignment f ('EmptyCtx '::> x1 '::> x2 '::> x3 '::> x4 '::> x5 '::> x6 '::> x7 '::> x8)
instance Lens.Field1 (Assignment8 f t x2 x3 x4 x5 x6 x7 x8)
(Assignment8 f u x2 x3 x4 x5 x6 x7 x8)
(f t)
(f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field2 (Assignment8 f x1 t x3 x4 x5 x6 x7 x8)
(Assignment8 f x1 u x3 x4 x5 x6 x7 x8)
(f t)
(f u) where
_2 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field3 (Assignment8 f x1 x2 t x4 x5 x6 x7 x8)
(Assignment8 f x1 x2 u x4 x5 x6 x7 x8)
(f t)
(f u) where
_3 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field4 (Assignment8 f x1 x2 x3 t x5 x6 x7 x8)
(Assignment8 f x1 x2 x3 u x5 x6 x7 x8)
(f t)
(f u) where
_4 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field5 (Assignment8 f x1 x2 x3 x4 t x6 x7 x8)
(Assignment8 f x1 x2 x3 x4 u x6 x7 x8)
(f t)
(f u) where
_5 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MyZR
instance Lens.Field6 (Assignment8 f x1 x2 x3 x4 x5 t x7 x8)
(Assignment8 f x1 x2 x3 x4 x5 u x7 x8)
(f t)
(f u) where
_6 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MyZR
instance Lens.Field7 (Assignment8 f x1 x2 x3 x4 x5 x6 t x8)
(Assignment8 f x1 x2 x3 x4 x5 x6 u x8)
(f t)
(f u) where
_7 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MyZR
instance Lens.Field8 (Assignment8 f x1 x2 x3 x4 x5 x6 x7 t)
(Assignment8 f x1 x2 x3 x4 x5 x6 x7 u)
(f t)
(f u) where
_8 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR
type Assignment9 f x1 x2 x3 x4 x5 x6 x7 x8 x9
= Assignment f ('EmptyCtx '::> x1 '::> x2 '::> x3 '::> x4 '::> x5 '::> x6 '::> x7 '::> x8 '::> x9)
instance Lens.Field1 (Assignment9 f t x2 x3 x4 x5 x6 x7 x8 x9)
(Assignment9 f u x2 x3 x4 x5 x6 x7 x8 x9)
(f t)
(f u) where
_1 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field2 (Assignment9 f x1 t x3 x4 x5 x6 x7 x8 x9)
(Assignment9 f x1 u x3 x4 x5 x6 x7 x8 x9)
(f t)
(f u) where
_2 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field3 (Assignment9 f x1 x2 t x4 x5 x6 x7 x8 x9)
(Assignment9 f x1 x2 u x4 x5 x6 x7 x8 x9)
(f t)
(f u) where
_3 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field4 (Assignment9 f x1 x2 x3 t x5 x6 x7 x8 x9)
(Assignment9 f x1 x2 x3 u x5 x6 x7 x8 x9)
(f t)
(f u) where
_4 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field5 (Assignment9 f x1 x2 x3 x4 t x6 x7 x8 x9)
(Assignment9 f x1 x2 x3 x4 u x6 x7 x8 x9)
(f t)
(f u) where
_5 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MySR $ MyZR
instance Lens.Field6 (Assignment9 f x1 x2 x3 x4 x5 t x7 x8 x9)
(Assignment9 f x1 x2 x3 x4 x5 u x7 x8 x9)
(f t)
(f u) where
_6 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MySR $ MyZR
instance Lens.Field7 (Assignment9 f x1 x2 x3 x4 x5 x6 t x8 x9)
(Assignment9 f x1 x2 x3 x4 x5 x6 u x8 x9)
(f t)
(f u) where
_7 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MySR $ MyZR
instance Lens.Field8 (Assignment9 f x1 x2 x3 x4 x5 x6 x7 t x9)
(Assignment9 f x1 x2 x3 x4 x5 x6 x7 u x9)
(f t)
(f u) where
_8 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MySR $ MyZR
instance Lens.Field9 (Assignment9 f x1 x2 x3 x4 x5 x6 x7 x8 t)
(Assignment9 f x1 x2 x3 x4 x5 x6 x7 x8 u)
(f t)
(f u) where
_9 = Lens.lens (mynat_lookup n) (strong_ctx_update n)
where n = MyZR