diff options
Diffstat (limited to 'src/Data/Array/Nested/Ranked')
| -rw-r--r-- | src/Data/Array/Nested/Ranked/Shape.hs | 20 | 
1 files changed, 20 insertions, 0 deletions
| diff --git a/src/Data/Array/Nested/Ranked/Shape.hs b/src/Data/Array/Nested/Ranked/Shape.hs index 3edebf6..8b670e5 100644 --- a/src/Data/Array/Nested/Ranked/Shape.hs +++ b/src/Data/Array/Nested/Ranked/Shape.hs @@ -131,6 +131,10 @@ listrLast (_ ::: sh@(_ ::: _)) = listrLast sh  listrLast (n ::: ZR) = n  listrLast ZR = error "unreachable" +-- | Performs a runtime check that the lengths are identical. +listrCast :: SNat n' -> ListR n i -> ListR n' i +listrCast = listrCastWithName "listrCast" +  listrIndex :: forall k n i. (k + 1 <= n) => SNat k -> ListR n i -> i  listrIndex SZ (x ::: _) = x  listrIndex (SS i) (_ ::: xs) | Refl <- lemLeqSuccSucc (Proxy @k) (Proxy @n) = listrIndex i xs @@ -230,6 +234,10 @@ ixrInit (IxR list) = IxR (listrInit list)  ixrLast :: IxR (n + 1) i -> i  ixrLast (IxR list) = listrLast list +-- | Performs a runtime check that the lengths are identical. +ixrCast :: SNat n' -> IxR n i -> IxR n' i +ixrCast n (IxR idx) = IxR (listrCastWithName "ixrCast" n idx) +  ixrAppend :: forall n m i. IxR n i -> IxR m i -> IxR (n + m) i  ixrAppend = coerce (listrAppend @_ @i) @@ -310,6 +318,10 @@ shrInit (ShR list) = ShR (listrInit list)  shrLast :: ShR (n + 1) i -> i  shrLast (ShR list) = listrLast list +-- | Performs a runtime check that the lengths are identical. +shrCast :: SNat n' -> ShR n i -> ShR n' i +shrCast n (ShR sh) = ShR (listrCastWithName "shrCast" n sh) +  shrAppend :: forall n m i. ShR n i -> ShR m i -> ShR (n + m) i  shrAppend = coerce (listrAppend @_ @i) @@ -347,3 +359,11 @@ instance KnownNat n => IsList (ShR n i) where    type Item (ShR n i) = i    fromList = ShR . IsList.fromList    toList = Foldable.toList + + +-- * Internal helper functions + +listrCastWithName :: String -> SNat n' -> ListR n i -> ListR n' i +listrCastWithName _ SZ ZR = ZR +listrCastWithName name (SS n) (i ::: idx) = i ::: listrCastWithName name n idx +listrCastWithName name _ _ = error $ name ++ ": ranks don't match" | 
