<div dir="ltr">Hello,<div><br></div><div>I've just uploaded my package zoom-refs: <a href="http://hackage.haskell.org/package/zoom-refs-0.0.0.0">http://hackage.haskell.org/package/zoom-refs-0.0.0.0</a></div><div><br></div><div>It's a "port" of State monad zoom (from lens) to mutable references:</div><div><br></div><div>    zoomTVar :: Lens' a b -> TVar a -> TVar b</div><div><br></div><div>These TVars aren't actually the raw TVars from STM, but wrappers that provide the same functionality. Similar functions are provided for STRefs and IORefs.</div><div><br></div><div>Additionally, TVars and STRefs can be paired to create composite references:</div><div><br></div><div>    pairTVars :: TVar a -> TVar b -> TVar (a,b)</div><div><br></div><div>No such functionality is provided for IORefs, as there would be no way to guarantee atomicity of operations on the underlying references.</div><div><br></div><div>Together. mutable references can be used sort of like Functors and Applicatives, though one needs to use lenses rather than plain functons to map them. Finally, there are multiple references that use traversals instead of lenses to zoom:</div><div><br></div><div>    readMultiTVar :: Monoid a -> MultiTVar a -> STM a</div><div><br></div><div>    readMultiTVarList :: MultiTVar a -> STM [a]</div><div><br></div><div>    readMultiTVarHead :: MultiTVar a -> STM (Maybe a)</div><div><br></div><div>Best regards,</div><div>Marcin Mrotek</div></div>