aboutsummaryrefslogtreecommitdiff
path: root/src/Data/Array/Nested/Ranked.hs
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2025-12-02 15:03:10 +0100
committerTom Smeding <tom@tomsmeding.com>2025-12-02 15:03:43 +0100
commitb63642a41f3bddc991d92f2f59b9e3ad53c1f15e (patch)
treea63b978be8baab76c7aa7a99b13a93b408bfc913 /src/Data/Array/Nested/Ranked.hs
parentaf0c099079dae7aa52a660b883204035cbed99c3 (diff)
Provide ix*FromLinear for all three shape kinds
This speeds up {r,s}generatePrim
Diffstat (limited to 'src/Data/Array/Nested/Ranked.hs')
-rw-r--r--src/Data/Array/Nested/Ranked.hs11
1 files changed, 4 insertions, 7 deletions
diff --git a/src/Data/Array/Nested/Ranked.hs b/src/Data/Array/Nested/Ranked.hs
index b77b529..d687983 100644
--- a/src/Data/Array/Nested/Ranked.hs
+++ b/src/Data/Array/Nested/Ranked.hs
@@ -70,16 +70,13 @@ 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
+-- | See 'mgeneratePrim'.
{-# INLINE rgeneratePrim #-}
rgeneratePrim :: forall n a i. (PrimElt a, Num i)
=> IShR n -> (IxR n i -> a) -> Ranked n a
-rgeneratePrim sh f
- | sn@SNat <- shrRank sh
- , Dict <- lemKnownReplicate sn
- , Refl <- lemRankReplicate sn
- = Ranked (mgeneratePrim (shxFromShR sh) (f . ixrFromIxX))
+rgeneratePrim sh f =
+ let g i = f (ixrFromLinear sh i)
+ in rfromVector sh $ VS.generate (shrSize sh) g
-- | See the documentation of 'mlift'.
rlift :: forall n1 n2 a. Elt a