module Util.Vector where

import Control.Monad
import Control.Monad.ST
import Data.STRef
import Data.Vector.Generic
import Unsafe.Coerce

modify' :: Vector v a => ( s . Mutable v s a -> ST s b) -> v a -> (b, v a)
modify' :: (forall s. Mutable v s a -> ST s b) -> v a -> (b, v a)
modify' f :: forall s. Mutable v s a -> ST s b
f xs :: v a
xs = (forall s. ST s (b, v a)) -> (b, v a)
forall a. (forall s. ST s a) -> a
runST ((forall s. ST s (b, v a)) -> (b, v a))
-> (forall s. ST s (b, v a)) -> (b, v a)
forall a b. (a -> b) -> a -> b
$ do
    STRef s b
ref <- b -> ST s (STRef s b)
forall a s. a -> ST s (STRef s a)
newSTRef b
forall a. HasCallStack => a
undefined
    let ys :: v a
ys = (forall s. Mutable v s a -> ST s ()) -> v a -> v a
forall (v :: * -> *) a.
Vector v a =>
(forall s. Mutable v s a -> ST s ()) -> v a -> v a
modify (Mutable v s a -> ST s b
forall s. Mutable v s a -> ST s b
f (Mutable v s a -> ST s b)
-> (b -> ST s ()) -> Mutable v s a -> ST s ()
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> STRef s b -> b -> ST s ()
forall s a. STRef s a -> a -> ST s ()
writeSTRef ((forall a b. a -> b
forall s a t. STRef s a -> STRef t a
unsafeCoerce :: STRef s a -> STRef t a) STRef s b
ref)) v a
xs
    (b -> v a -> (b, v a)) -> v a -> b -> (b, v a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (,) v a
ys (b -> (b, v a)) -> ST s b -> ST s (b, v a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> v a -> ST s b -> ST s b
forall a b. a -> b -> b
seq v a
ys (STRef s b -> ST s b
forall s a. STRef s a -> ST s a
readSTRef STRef s b
ref)