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)