
On Wed, 21 Aug 2019, Zemyla wrote:
The "runSTArray" and "runSTUArray" functions allow efficiently working with Arrays in the ST monad before turning them immutable
I think instead of some new functions we should have a Kleisli Arrow data type that hides unsafeFreeze for us. newtype Freezer s a b = -- private constructor and accessor Freezer {getFreezer :: a -> ST s b} instance Category Freezer where instance Arrow Freezer where quickFreeze :: Freezer s (STArray s i e) (Array i e) quickFreeze = Freezer unsafeFreeze runFrozen :: (forall s. Freezer s a b) -> (forall s. ST s a) -> b runFrozen freezer st = runST (getFreezer (freezer st)) For moving two arrays and an additional value out, you would do runFrozen ((quickFreeze *** quickFreeze) *** id) st