<div dir="ltr">In response to a bit of an obscure use case I had, I created this very simple library which gives you a Monad with a single operation, `push :: a -> m ()`. This operation pushes an item onto a stack (represented under the hood by a mutable ST vector).<div><br></div><div>When you run the monad, you get the stack out as a vector. <br><div><br></div><div>The library is quite fast. It's about 2x faster than C++'s std::vec::push_back compiled without optimizations, and about 40% as fast as std::vec::push_back when compiled with G++ -O2. There's almost certainly some low-hanging optimization fruit for anyone skilled at Haskell optimizing.</div><div><br></div><div>The library is parametric over choice of mutable vector. You can use Unboxed, Storable, or normal vectors.</div></div><div><br></div><div>I've even included a Push Monad Transformer based on Control.Monad.ST.Trans, but that's almost certainly unsafe, per the caveats listed in the Control.Monad.ST.Trans docs.</div><div><br></div><div><a href="https://hackage.haskell.org/package/FastPush-0.1.0.0">https://hackage.haskell.org/package/FastPush-0.1.0.0</a><br></div><div><br></div><div><a href="https://github.com/wyager/FastPush/">https://github.com/wyager/FastPush/</a><br></div><div><br></div><div>Cheers,</div><div>Will</div></div>