From ba5a31c976f80421464af1af8d6ab1e2a154cd83 Mon Sep 17 00:00:00 2001 From: Mikolaj Konarski Date: Tue, 2 Dec 2025 05:38:41 +0100 Subject: Define mgeneratePrim as a fast special case variant --- src/Data/Array/Nested/Ranked.hs | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/Data/Array/Nested/Ranked.hs') diff --git a/src/Data/Array/Nested/Ranked.hs b/src/Data/Array/Nested/Ranked.hs index bf35cc4..9504247 100644 --- a/src/Data/Array/Nested/Ranked.hs +++ b/src/Data/Array/Nested/Ranked.hs @@ -69,6 +69,15 @@ rgenerate sh f , Refl <- lemRankReplicate sn = Ranked (mgenerate (shxFromShR sh) (f . ixrFromIxX)) +-- TODO: this would be shorter and faster written with rfromVector, +-- but unfortunately we don't have ixrFromLinear +rgeneratePrim :: forall n a. PrimElt a => IShR n -> (IIxR n -> a) -> Ranked n a +rgeneratePrim sh f + | sn@SNat <- shrRank sh + , Dict <- lemKnownReplicate sn + , Refl <- lemRankReplicate sn + = Ranked (mgeneratePrim (shxFromShR sh) (f . ixrFromIxX)) + -- | See the documentation of 'mlift'. rlift :: forall n1 n2 a. Elt a => SNat n2 -- cgit v1.2.3-70-g09d2