module MonadVar.Combinators
( postMutate_
, preMutate_
, postMutate
, preMutate
, postMutateM_
, preMutateM_
, postMutateM
, preMutateM
) where
import MonadVar.Prelude
import MonadVar.Classes
postMutate_
:: MonadMutate m v => v a -> (a -> a) -> m a
postMutate_ v f = mutate v $ \x -> f x & \y -> (y, x)
preMutate_
:: MonadMutate m v => v a -> (a -> a) -> m a
preMutate_ v f = mutate v $ \x -> f x & \y -> (y, y)
postMutate
:: MonadMutate m v => v a -> (a -> (a, b)) -> m (a, b)
postMutate v f = mutate v $ \x -> f x & \(y, z) -> (y, (x, z))
preMutate
:: MonadMutate m v => v a -> (a -> (a, b)) -> m (a, b)
preMutate v f = mutate v $ \x -> f x & \(y, z) -> (y, (y, z))
postMutateM_
:: (MonadMutateM f m v, Functor f) => v a -> (a -> f a) -> m a
postMutateM_ v f = mutateM v $ \x -> f x <&> \y -> (y, x)
preMutateM_
:: (MonadMutateM f m v, Functor f) => v a -> (a -> f a) -> m a
preMutateM_ v f = mutateM v $ \x -> f x <&> \y -> (y, y)
postMutateM
:: (MonadMutateM f m v, Functor f) => v a -> (a -> f (a, b)) -> m (a, b)
postMutateM v f = mutateM v $ \x -> f x <&> \(y, z) -> (y, (x, z))
preMutateM
:: (MonadMutateM f m v, Functor f) => v a -> (a -> f (a, b)) -> m (a, b)
preMutateM v f = mutateM v $ \x -> f x <&> \(y, z) -> (y, (y, z))