packages feed

ref-extras-0.2.0: src/RefExtras/SomeRef.hs

module RefExtras.SomeRef
  ( unliftSomeRef
  ) where

import Control.Monad.IO.Unlift (MonadUnliftIO, UnliftIO (..), askUnliftIO)
import LittleRIO (SomeRef (..))
import RefExtras.Classes (ReadWriteRef (..))

-- | We can /demote/ any 'ReadWriteRef' to a 'SomeRef'.
-- ('RIO' uses 'SomeRef' to represent 'State' and 'Writer' references, for example.)
unliftSomeRef :: (MonadUnliftIO m, ReadWriteRef r m) => r a -> m (SomeRef a)
unliftSomeRef ref = do
  UnliftIO run <- askUnliftIO
  pure (SomeRef (run (readRef ref)) (run . writeRef ref))