| Safe Haskell | Safe-Inferred |
|---|
Data.MLens.Ref
Contents
- data Unit
- type Ref m a = MLens m Unit a
- readRef :: Monad m => Ref m a -> m a
- writeRef :: Monad m => Ref m a -> a -> m ()
- modRef :: Monad m => Ref m a -> (a -> a) -> m ()
- fileRef :: FilePath -> IO (Ref IO String)
- fileRef_ :: FilePath -> IO (Ref IO (Maybe String))
- logConsoleLens :: Show a => MLens IO a a
- logMLens :: Monad m => (a -> m ()) -> (a -> m ()) -> MLens m a a
- logFile :: FilePath -> IO (String -> IO ())
Documentation
The abstract data type Unit is isomorphic to (),
but by making it abstract we can prevent using the same reference
on both sides of lens composition, which would have surprising effects.
Data type for reference lenses
type Ref m a = MLens m Unit aSource
Note that references lenses can be composed with lenses. For example, if
r :: Ref m (a,b)
then
fstLens . r :: Ref m a
Reference laws for pure references:
-
(readRef r >> return ())===(return ()) -
(readRef r >>= writeRef r)===(return ()) -
(writeRef r a >> readRef r)===(return a) -
(writeRef r a >> writeRef r a')===(writeRef r a')
These laws are equivalent to the get-no-effect, set-get, get-set and set-set laws for monadic lenses.
Reference operations
Some impure IO referenceses
fileRef :: FilePath -> IO (Ref IO String)Source
Using fileRef is safe if the file is not used concurrently.
fileRef_ :: FilePath -> IO (Ref IO (Maybe String))Source
Note that if you write Nothing, the file is deleted.
logConsoleLens :: Show a => MLens IO a aSource
logConsoleLens logs elementary get and set operations.
Note that with the current representation of MLens, every set operation involves a get operation.