From ee88c236ee6067a3dddf7b89e7c2bbd185aaeb21 Mon Sep 17 00:00:00 2001 From: toyboot4e Date: Sun, 21 Jul 2024 01:03:46 +0900 Subject: [PATCH] make `nextPermutation` faster --- vector/src/Data/Vector/Generic/Mutable.hs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/vector/src/Data/Vector/Generic/Mutable.hs b/vector/src/Data/Vector/Generic/Mutable.hs index 74717e88..1272fdac 100644 --- a/vector/src/Data/Vector/Generic/Mutable.hs +++ b/vector/src/Data/Vector/Generic/Mutable.hs @@ -1231,7 +1231,7 @@ a given permutation. It changes the given permutation in-place. nextPermutation :: (PrimMonad m,Ord e,MVector v e) => v (PrimState m) e -> m Bool nextPermutation v | dim < 2 = return False - | otherwise = do + | otherwise = stToPrim $ do val <- unsafeRead v 0 (k,l) <- loop val (-1) 0 val 1 if k < 0 @@ -1243,8 +1243,7 @@ nextPermutation v | i == dim = return (k,l) | otherwise = do cur <- unsafeRead v i - -- TODO: make tuple unboxed - let (kval',k') = if prev < cur then (prev,i-1) else (kval,k) + let (!kval',!k') = if prev < cur then (prev,i-1) else (kval,k) l' = if kval' < cur then i else l loop kval' k' l' cur (i+1) dim = length v