module Setter where -- base import Prelude hiding (Foldable (..)) -- lens import Control.Lens (Lens', lens) -- tasty import Test.Tasty -- tasty-hunit import Test.Tasty.HUnit (testCase, (@?=)) -- containers import qualified Data.IntMap as IM -- changeset import Control.Monad.Changeset.Class import Control.Monad.Trans.Changeset -- changeset-lens import Control.Monad.Changeset.Lens import Control.Monad.Changeset.Lens.Ixed ((|>!)) import Control.Monad.Changeset.Lens.Setter (setterChangeset) data Big = Big { irrelevant :: String , counter :: Int } deriving (Eq, Show) lensCounter :: Lens' Big Int lensCounter = lens counter $ \big counter -> big {counter} tests :: TestTree tests = testGroup "Setter" [ testGroup "Small change on big data structure" [ testCase "single change" $ execChangeset (change (lensChangeset lensCounter (singleChange Increment))) (Big "foo" 0) @?= Big "foo" 1 ] , testGroup "nested IxedChangeset with SetterChangeset" [ testCase "Can apply setter changeset inside indexed structure" $ let initialState = IM.fromList [(0, Big "" 0), (1, Big "" 0)] action = do 2 |>! setterChangeset lensCounter (singleChange Increment) s <- current 1 |>! setterChangeset lensCounter (singleChange Increment) 2 |>! setterChangeset lensCounter (singleChange Increment) return s in runChangeset action initialState @?= ( initialState , IM.fromList [ (0, Big "" 0) , (1, Big "" 1) ] ) ] ]