@@ -4,15 +4,21 @@
4{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5{-# LANGUAGE LambdaCase #-}
5{-# LANGUAGE LambdaCase #-}
6{-# LANGUAGE OverloadedStrings #-}
6{-# LANGUAGE OverloadedStrings #-}
7+{-# LANGUAGE RankNTypes #-}
8import Control.Lens
9import Control.Lens
9import Control.Monad.Fix
10import Control.Monad.Fix
10import Data.Align
11import Data.Align
12+import Data.AppendMap (AppendMap)
11−import qualified Data.AppendMap as Map
13+import qualified Data.AppendMap as AMap
14+import Data.Functor.Misc
16+import qualified Data.Map as Map
12import Data.Semigroup
17import Data.Semigroup
13import Data.These
18import Data.These
15import Reflex
20import Reflex
21+import Reflex.Patch.MapWithMove
16import Test.Run
22import Test.Run
18newtype MyQuery = MyQuery SelectedCount
24newtype MyQuery = MyQuery SelectedCount
@@ -26,7 +32,7 @@ instance (Ord k, Query a, Eq (QueryResult a)) => Query (Selector k a) where
26 type QueryResult (Selector k a) = Selector k (QueryResult a)
32 type QueryResult (Selector k a) = Selector k (QueryResult a)
27 crop q r = undefined
33 crop q r = undefined
29−newtype Selector k a = Selector { unSelector :: Map.AppendMap k a }
35+newtype Selector k a = Selector { unSelector :: AppendMap k a }
30 deriving (Show, Read, Eq, Ord, Functor)
36 deriving (Show, Read, Eq, Ord, Functor)
32instance (Ord k, Eq a, Monoid a) => Semigroup (Selector k a) where
38instance (Ord k, Eq a, Monoid a) => Semigroup (Selector k a) where
@@ -40,7 +46,7 @@ instance (Ord k, Eq a, Monoid a) => Semigroup (Selector k a) where
40 in if z == mempty then Nothing else Just z
46 in if z == mempty then Nothing else Just z
42instance (Ord k, Eq a, Monoid a) => Monoid (Selector k a) where
48instance (Ord k, Eq a, Monoid a) => Monoid (Selector k a) where
43− mempty = Selector Map.empty
49+ mempty = Selector AMap.empty
44 mappend = (<>)
50 mappend = (<>)
46instance (Eq a, Ord k, Group a) => Group (Selector k a) where
52instance (Eq a, Ord k, Group a) => Group (Selector k a) where
@@ -50,25 +56,85 @@ instance (Eq a, Ord k, Group a) => Additive (Selector k a)
51main :: IO ()
57main :: IO ()
53− [0, 1, 1, 0] <- fmap (map fst . concat) $ runApp app () $ map (Just . That) $
59+ [0, 1, 1, 0] <- fmap (map fst . concat) $
60+ runApp (testQueryT testRunWithReplace) () $ map (Just . That) $
54− [ That ()
61+ [ That (), This (), That () ]
62+ [0, 1, 1, 0] <- fmap (map fst . concat) $
63+ runApp (testQueryT testSequenceDMapWithAdjust) () $ map (Just . That) $
55− , This ()
64+ [ That (), This (), That () ]
56− , That ()
65+ [0, 1, 1, 0] <- fmap (map fst . concat) $
57− ]
66+ runApp (testQueryT testSequenceDMapWithAdjustWithMove) () $ map (Just . That) $
67+ [ That (), This (), That () ]
60−app :: (Reflex t, MonadHold t m, MonadAdjust t m, MonadFix m)
70+testQueryT :: (Reflex t, MonadFix m)
71+ => (Event t () -> Event t () -> QueryT t (Selector Int MyQuery) m ())
61− => AppIn t () (These () ())
72+ -> AppIn t () (These () ())
62− -> m (AppOut t Int Int)
73+ -> m (AppOut t Int Int)
63−app (AppIn _ pulse) = do
74+testQueryT w (AppIn _ pulse) = do
64 let replace = fmapMaybe (^? here) pulse
75 let replace = fmapMaybe (^? here) pulse
65 increment = fmapMaybe (^? there) pulse
76 increment = fmapMaybe (^? there) pulse
68− queryDyn $ zipDynWith (\x y -> Selector (Map.singleton (x :: Int) y)) n $ pure $ MyQuery $ SelectedCount 1
69− (_, q) <- runQueryT (runWithReplace w $ w <$ replace) $ pure mempty
77+ (_, q) <- runQueryT (w replace increment) $ pure mempty
70− let qDyn = fmap (head . Map.keys . unSelector) $ incrementalToDynamic q
78+ let qDyn = head . AMap.keys . unSelector <$> incrementalToDynamic q
71 return $ AppOut
79 return $ AppOut
72 { _appOut_behavior = current qDyn
80 { _appOut_behavior = current qDyn
73 , _appOut_event = updated qDyn
81 , _appOut_event = updated qDyn
84+testRunWithReplace :: ( Reflex t
88+ , MonadQuery t (Selector Int MyQuery) m)
92+testRunWithReplace replace increment = do
95+ queryDyn $ zipDynWith (\x y -> Selector (AMap.singleton (x :: Int) y)) n $ pure $ MyQuery $ SelectedCount 1
96+ _ <- runWithReplace w $ w <$ replace
99+testSequenceDMapWithAdjust :: ( Reflex t
103+ , MonadQuery t (Selector Int MyQuery) m)
107+testSequenceDMapWithAdjust replace increment = do
108+ _ <- listHoldWithKey (Map.singleton () ()) (Map.singleton () (Just ()) <$ replace) $ \_ _ -> do
109+ n <- count increment
110+ queryDyn $ zipDynWith (\x y -> Selector (AMap.singleton (x :: Int) y)) n $ pure $ MyQuery $ SelectedCount 1
113+testSequenceDMapWithAdjustWithMove :: ( Reflex t
117+ , MonadQuery t (Selector Int MyQuery) m)
121+testSequenceDMapWithAdjustWithMove replace increment = do
122+ _ <- listHoldWithKeyWithMove (Map.singleton () ()) (Map.singleton () (Just ()) <$ replace) $ \_ _ -> do
123+ n <- count increment
124+ queryDyn $ zipDynWith (\x y -> Selector (AMap.singleton (x :: Int) y)) n $ pure $ MyQuery $ SelectedCount 1
127+listHoldWithKey :: forall t m k v a. (Ord k, MonadHold t m, MonadAdjust t m) => Map k v -> Event t (Map k (Maybe v)) -> (k -> v -> m a) -> m (Dynamic t (Map k a))
128+listHoldWithKey m0 m' f = do
129+ let dm0 = mapWithFunctorToDMap $ Map.mapWithKey f m0
130+ dm' = fmap (PatchDMap . mapWithFunctorToDMap . Map.mapWithKey (\k v -> ComposeMaybe $ fmap (f k) v)) m'
131+ (a0, a') <- sequenceDMapWithAdjust dm0 dm'
132+ fmap dmapToMap . incrementalToDynamic <$> holdIncremental a0 a'
135+-- scam it out to test traverseDMapWithAdjustWithMove
136+listHoldWithKeyWithMove :: forall t m k v a. (Ord k, MonadHold t m, MonadAdjust t m) => Map k v -> Event t (Map k (Maybe v)) -> (k -> v -> m a) -> m (Dynamic t (Map k a))
137+listHoldWithKeyWithMove m0 m' f = do
138+ (n0, n') <- mapMapWithAdjustWithMove f m0 $ ffor m' $ PatchMapWithMove . Map.map (\v -> NodeInfo (maybe From_Delete From_Insert v) Nothing)
139+ incrementalToDynamic <$> holdIncremental n0 n'