packages feed

cornea-0.2.0.0: test/u/DeepStateSpec.hs

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

module DeepStateSpec(
  htf_thisModulesTests,
) where

import Control.Monad.Trans.State (execStateT)
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 Bot =
  BotC { _botS1 :: S1 }
  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 Bot m => m ()
stateDeep = do
  (BotC (S1 a)) <- get
  b <- gets $ \(BotC (S1 b)) -> b
  put (BotC (S1 (a + b + 3)))

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