packages feed

vpq-0.1.0.0: Util/Vector.hs

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' f xs = runST $ do
    ref <- newSTRef undefined
    let ys = modify (f >=> writeSTRef ((unsafeCoerce :: STRef s a -> STRef t a) ref)) xs
    flip (,) ys <$> seq ys (readSTRef ref)