packages feed

cornea-0.3.0.0: test/u/DeepStateSpec.hs

{-# OPTIONS_GHC -F -pgmF htfpp #-}

module DeepStateSpec (htf_thisModulesTests) where

import Test.Framework

import Control.Monad.DeepState (MonadDeepState(get, put), gets)
import Data.DeepLenses (deepLenses)

newtype S1 =
  S1 Int
  deriving (Eq, Show)

newtype S2 =
  S2 Int
  deriving (Eq, Show)

newtype S =
  SC { _sS1 :: S1 }
  deriving (Eq, Show)

deepLenses ''S

newtype Bot =
  BotC { _botS :: S }
  deriving (Eq, Show)

deepLenses ''Bot

newtype MiddleOther =
  MiddleOther Int
  deriving (Eq, Show)

data MiddleS =
  MiddleSC {
    _middleBot :: Bot,
    _middleS2 :: S2
    }
  deriving (Eq, Show)

deepLenses ''MiddleS

newtype MainS =
  MainSC { _mainMiddle :: MiddleS }
  deriving (Eq, Show)

deepLenses ''MainS

stateDeep :: MonadDeepState s S m => m ()
stateDeep = do
  (SC (S1 a)) <- get
  b <- gets $ \(SC (S1 b)) -> b
  put (SC (S1 (a + b + 3)))

test_lens :: IO ()
test_lens = do
  a <- execStateT stateDeep (MainSC (MiddleSC (BotC (SC (S1 5))) (S2 1)))
  assertEqual (MainSC (MiddleSC (BotC (SC (S1 13))) (S2 1))) a