{-# LANGUAGE RecursiveDo #-} module Reflex.Data.ActionStackSpec ( spec ) where import Relude import Test.Hspec import Test.Hspec.Contrib.HUnit ( fromHUnitTest ) import Test.HUnit import qualified Data.List as L ( last ) import Reflex import Reflex.Data.ActionStack import Reflex.Potato.Helpers import Reflex.Test.Host data TestCmd a = TCDo a | TCUndo | TCRedo | TCClear deriving (Eq, Show) simple_state_network :: forall t a s m . (t ~ SpiderTimeline Global, m ~ SpiderHost Global) => (a -> s -> s) -- ^ do/redo method to transform state -> (a -> s -> s) -- ^ undo method to transform state -> s -- ^ initial state -> (Event t (TestCmd a) -> PerformEventT t m (Event t s)) -- ^ test app producing final state simple_state_network fdo fundo initial ev = do let doEv = flip fmapMaybe ev $ \case TCDo a -> Just a _ -> Nothing undoEv = flip fmapMaybe ev $ \case TCUndo -> Just () _ -> Nothing redoEv = flip fmapMaybe ev $ \case TCRedo -> Just () _ -> Nothing clearEv = flip fmapMaybe ev $ \case TCClear -> Just () _ -> Nothing mas = ActionStackConfig { _actionStackConfig_do = doEv , _actionStackConfig_undo = undoEv , _actionStackConfig_redo = redoEv , _actionStackConfig_clear = clearEv } as :: ActionStack t a <- holdActionStack mas adder :: Dynamic t s <- foldDynMergeWith initial [fmap fdo (_actionStack_do as), fmap fundo (_actionStack_undo as)] return $ updated adder adder_test :: Test adder_test = TestLabel "adder app" $ TestCase $ do let bs = [TCDo 1, TCDo 2, TCDo 3, TCUndo, TCUndo, TCRedo, TCDo 100] run = runAppSimple (simple_state_network (+) (flip (-)) (0 :: Int)) bs v <- liftIO run L.last v @?= [Just 103] spec :: Spec spec = do describe "ActionStack" $ do fromHUnitTest adder_test