{-# LANGUAGE RecursiveDo #-} module Reflex.Data.SequenceSpec ( spec ) where import Relude hiding ( empty , fromList ) import Test.Hspec import Test.Hspec.Contrib.HUnit ( fromHUnitTest ) import Test.HUnit import qualified Data.List as L ( last ) import Data.Sequence import Reflex import Reflex.Data.Sequence import Reflex.Test.Host data SeqCmd a = SCInsert (Int, [a]) | SCRemove (Int, Int) | SCClear deriving (Eq, Show) seq_network :: forall t m a . (t ~ SpiderTimeline Global, m ~ SpiderHost Global) => (Event t (SeqCmd a) -> PerformEventT t m (Event t (Seq a))) seq_network ev = do let insertEv = flip fmapMaybe ev $ \case SCInsert (i, a) -> Just (i, fromList a) _ -> Nothing removeEv = flip fmapMaybe ev $ \case SCRemove x -> Just x _ -> Nothing clearEv = flip fmapMaybe ev $ \case SCClear -> Just () _ -> Nothing dseqc = DynamicSeqConfig { _dynamicSeqConfig_insert = insertEv , _dynamicSeqConfig_remove = removeEv , _dynamicSeqConfig_clear = clearEv } dseq <- holdDynamicSeq empty dseqc return $ updated $ _dynamicSeq_contents dseq basic_test :: Test basic_test = TestLabel "basic" $ TestCase $ do let bs = [ SCInsert (0, [1 .. 10]) , SCClear , SCInsert (0, [1 .. 10]) , SCRemove (5, 5) , SCInsert (3, [100]) ] :: [SeqCmd Int] run :: IO [[Maybe (Seq Int)]] run = runAppSimple seq_network bs v <- liftIO run L.last v @?= [Just (fromList [1, 2, 3, 100, 4, 5])] spec :: Spec spec = do describe "Sequence" $ do fromHUnitTest basic_test