aboutsummaryrefslogtreecommitdiff
path: root/src/Data/Array/Nested/Ranked.hs
diff options
context:
space:
mode:
authorMikolaj Konarski <mikolaj.konarski@funktory.com>2025-12-02 05:38:41 +0100
committerMikolaj Konarski <mikolaj.konarski@funktory.com>2025-12-02 05:38:41 +0100
commitba5a31c976f80421464af1af8d6ab1e2a154cd83 (patch)
tree526de2796e98cd238e1dcefc53894780376577e2 /src/Data/Array/Nested/Ranked.hs
parent88828bd004ccba13e227f732106ab30c3731837f (diff)
Define mgeneratePrim as a fast special case variant
Diffstat (limited to 'src/Data/Array/Nested/Ranked.hs')
-rw-r--r--src/Data/Array/Nested/Ranked.hs9
1 files changed, 9 insertions, 0 deletions
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