Hi!
I have a "low-level" function for insertion element into mutable vector. It looks like this:
place :: (PrimMonad m) =>
MV.MVector (PrimState m) (Int, t) -> (Int, t) -> Int -> m ()
place v max@(val1,_) i = place' i
where
place' i = do
let j = i - 1
if j < 0
then return ()
else do
curr@(val2, _) <- MV.unsafeRead v j -- <<<<<
if val2 > val1
then do
MV.unsafeWrite v j max
MV.unsafeWrite v i curr
place' j
else return ()
It searches a right place for the i-th element, moving it towards beginning
. Surprisingly, it works, but is slow.
Time profiling says this:
COST CENTRE MODULE %time %alloc ticks bytes
place.place' Main 40.1 77.1 9167 12169223232
And heap profiling says that most of allocations are for Int and (,).
might allocate my Precious memory more than, maybe, it is needed.