diff options
Diffstat (limited to 'src/Data/Array/Nested/Mixed/ListX.hs')
| -rw-r--r-- | src/Data/Array/Nested/Mixed/ListX.hs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/Data/Array/Nested/Mixed/ListX.hs b/src/Data/Array/Nested/Mixed/ListX.hs index 51db341..e4e224b 100644 --- a/src/Data/Array/Nested/Mixed/ListX.hs +++ b/src/Data/Array/Nested/Mixed/ListX.hs @@ -23,7 +23,7 @@ {-# LANGUAGE ViewPatterns #-} {-# OPTIONS_GHC -fplugin GHC.TypeLits.Normalise #-} {-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-} -module Data.Array.Nested.Mixed.ListX (ListX, pattern ZX, pattern (::%), listxShow, lazily, lazilyConcat, lazilyForce) where +module Data.Array.Nested.Mixed.ListX (ListX, pattern ZX, pattern (::%), listxShow, lazily, lazilyConcat, lazilyForce, Rank, coerceEqualRankListX) where import Control.DeepSeq (NFData(..)) import Data.Foldable qualified as Foldable @@ -38,6 +38,14 @@ import GHC.TypeLits.Orphans () import Data.Array.Nested.Types + +-- | The length of a type-level list. If the argument is a shape, then the +-- result is the rank of that shape. +type family Rank sh where + Rank '[] = 0 + Rank (_ : sh) = Rank sh + 1 + + -- * Mixed lists implementation -- | Data invariant: each element is in WHNF (the spine may be be not forced). @@ -132,3 +140,6 @@ instance IsList (ListX sh i) where fromList l = foldr seq () l `seq` ListX l {-# INLINE toList #-} toList = Foldable.toList + +coerceEqualRankListX :: Rank sh ~ Rank sh' => ListX sh i -> ListX sh' i +coerceEqualRankListX (ListX l) = ListX l |
