module Control.Reference.Operators where
import Control.Reference.Representation
import Control.Reference.Types
import Control.Reference.Combinators
import Control.Instances.Morph
import Control.Applicative
import Control.Monad.Identity
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.List
(^.) :: s -> Getter Identity s t a b -> a
a ^. l = runIdentity (a ^? l)
infixl 4 ^.
(^?) :: Monad m => s -> Getter m s t a b -> m a
a ^? l = refGet l return a
infixl 4 ^?
review :: Reference MU MU MU Identity s s a a -> a -> s
review r a = a ^. turn r
(.=) :: Setter Identity s t a b -> b -> s -> t
l .= v = runIdentity . (l != v)
infixl 4 .=
(!=) :: Setter m s t a b -> b -> s -> m t
l != v = refSet l v
infixl 4 !=
(.~) :: Setter Identity s t a b -> (a -> Identity b) -> s -> t
l .~ trf = runIdentity . (l !~ trf)
infixl 4 .~
(!~) :: Setter m s t a b -> (a -> m b) -> s -> m t
l !~ trf = refUpdate l trf
infixl 4 !~
(.-) :: Setter Identity s t a b -> (a -> b) -> s -> t
l .- trf = l .~ return . trf
infixl 4 .-
(!-) :: Monad m => Setter m s t a b -> (a -> b) -> s -> m t
l !- trf = l !~ return . trf
infixl 4 !-
(!|) :: Monad m => Setter m s s a a -> (a -> m c) -> s -> m s
l !| act = l !~ (\v -> act v >> return v)
infixl 4 !|