module Data.Accessor.Monad.Trans.Example where

import Data.Accessor.Basic ((.>), )
import Data.Accessor.Tuple (first, second, )

import Data.Accessor.Monad.Trans.State ((%=), (%:), )
import qualified Data.Accessor.Monad.Trans.State as AState
import Control.Monad.Trans.State (State)

import Prelude hiding (init)


state :: State (Char,Int) Int
state :: State (Char, Int) Int
state =
   do forall (m :: * -> *) r a. Monad m => T r a -> a -> StateT r m ()
AState.set forall a b. T (a, b) a
first Char
'a'
      forall (m :: * -> *) r a.
Monad m =>
T r a -> (a -> a) -> StateT r m ()
AState.modify forall a b. T (a, b) b
second forall a. Enum a => a -> a
succ
      forall (m :: * -> *) r a. Monad m => T r a -> StateT r m a
AState.get forall a b. T (a, b) b
second

stateInfix :: State ((Char, Int), String) Int
stateInfix :: State ((Char, Int), String) Int
stateInfix =
   do String
str <- forall (m :: * -> *) r a. Monad m => T r a -> StateT r m a
AState.get forall a b. T (a, b) b
second
      forall a b. T (a, b) a
firstforall a b c. T a b -> T b c -> T a c
.>forall a b. T (a, b) a
first forall (m :: * -> *) r a. Monad m => T r a -> a -> StateT r m ()
%= Char
'a'
      forall a b. T (a, b) a
firstforall a b c. T a b -> T b c -> T a c
.>forall a b. T (a, b) b
second forall (m :: * -> *) r a.
Monad m =>
T r a -> (a -> a) -> StateT r m ()
%: forall a. Enum a => a -> a
succ
      forall a b. T (a, b) a
firstforall a b c. T a b -> T b c -> T a c
.>forall a b. T (a, b) a
first forall (m :: * -> *) r a. Monad m => T r a -> a -> StateT r m ()
%= Char
'b'
      forall a b. T (a, b) b
second forall (m :: * -> *) r a. Monad m => T r a -> a -> StateT r m ()
%= Char
'!' forall a. a -> [a] -> [a]
: String
str
      forall (m :: * -> *) r a. Monad m => T r a -> StateT r m a
AState.get (forall a b. T (a, b) a
firstforall a b c. T a b -> T b c -> T a c
.>forall a b. T (a, b) b
second)

stateLift :: State (Int, (Bool, Char)) ()
stateLift :: State (Int, (Bool, Char)) ()
stateLift = do
  forall a b. T (a, b) a
first forall (m :: * -> *) r a. Monad m => T r a -> a -> StateT r m ()
%= Int
42
  forall (m :: * -> *) r s a.
Monad m =>
T r s -> State s a -> StateT r m a
AState.lift forall a b. T (a, b) b
second forall a b. (a -> b) -> a -> b
$ do
    forall a b. T (a, b) a
first  forall (m :: * -> *) r a.
Monad m =>
T r a -> (a -> a) -> StateT r m ()
%: Bool -> Bool
not
    forall a b. T (a, b) b
second forall (m :: * -> *) r a. Monad m => T r a -> a -> StateT r m ()
%= Char
'q'