optics-operators-0.1.0.0: src/Data/Optics/Operators.hs
{-# LANGUAGE FlexibleContexts #-}
module Data.Optics.Operators where
import Control.Monad.State (MonadState, modify)
import Optics.Core (A_Setter, Is, Optic', (%~))
{- |
Modify the target of the optic by adding a value.
@
data Person = Person { age :: 'Int' } deriving ('GHC.Generics.Generic')
f :: 'MonadState' Person m => m ()
f = #age += 1
@
-}
(+=) :: (Is k A_Setter, MonadState s m, Num a) => Optic' k is s a -> a -> m ()
o += a = modify $ o %~ (+ a)
infixr 4 +=
{-# INLINE (+=) #-}
{- |
Modify the target of the optic by subtracting a value.
@
data Person = Person { age :: 'Int' } deriving ('GHC.Generics.Generic')
f :: 'MonadState' Person m => m ()
f = #age -= 1
@
-}
(-=) :: (Is k A_Setter, MonadState s m, Num a) => Optic' k is s a -> a -> m ()
o -= a = modify $ o %~ subtract a
infixr 4 -=
{-# INLINE (-=) #-}
{- |
Modify the target of the optic by multiplying a value.
@
data Person = Person { age :: 'Int' } deriving ('GHC.Generics.Generic')
f :: 'MonadState' Person m => m ()
f = #age *= 1
@
-}
(*=) :: (Is k A_Setter, MonadState s m, Num a) => Optic' k is s a -> a -> m ()
o *= a = modify $ o %~ (* a)
infixr 4 *=
{-# INLINE (*=) #-}
{- |
Modify the target of the optic by dividing a value.
@
data Person = Person { age :: 'Int' } deriving ('GHC.Generics.Generic')
f :: 'MonadState' Person m => m ()
f = #age //= 1
@
-}
(//=) :: (Is k A_Setter, MonadState s m, Fractional a) => Optic' k is s a -> a -> m ()
o //= a = modify $ o %~ (/ a)
{-# INLINE (//=) #-}
infixr 4 //=