@@ -1,8 +1,16 @@
1+{-# LANGUAGE DeriveFunctor #-}
2+{-# LANGUAGE FlexibleContexts #-}
13{-# LANGUAGE TypeFamilies #-}
24{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5+{-# LANGUAGE LambdaCase #-}
6+{-# LANGUAGE OverloadedStrings #-}
7+import Data.Align
38import qualified Data.AppendMap as Map
49import Data.Semigroup
5−import Reflex.Dom
10+import Data.These
11+
12+import Reflex
13+import Test.Run
614
715newtype MyQuery = MyQuery SelectedCount
816 deriving (Show, Read, Eq, Ord, Monoid, Semigroup, Additive, Group)
@@ -11,16 +19,38 @@ instance Query MyQuery where
1119 type QueryResult MyQuery = ()
1220 crop _ _ = ()
1321
14−instance (Ord k, Query a) => Query (Map.AppendMap k a) where
15− type QueryResult (Map.AppendMap k a) = Map.AppendMap k (QueryResult a)
22+instance (Ord k, Query a, Eq (QueryResult a)) => Query (Selector k a) where
23+ type QueryResult (Selector k a) = Selector k (QueryResult a)
1624 crop q r = undefined
1725
26+newtype Selector k a = Selector { unSelector :: Map.AppendMap k a }
27+ deriving (Show, Read, Eq, Ord, Functor)
28+
29+instance (Ord k, Eq a, Monoid a) => Semigroup (Selector k a) where
30+ (Selector a) <> (Selector b) = Selector $ fmapMaybe id $ f a b
31+ where
32+ f = alignWith $ \case
33+ This x -> Just x
34+ That y -> Just y
35+ These x y ->
36+ let z = x `mappend` y
37+ in if z == mempty then Nothing else Just z
38+
39+instance (Ord k, Eq a, Monoid a) => Monoid (Selector k a) where
40+ mempty = Selector Map.empty
41+ mappend = (<>)
42+
43+instance (Eq a, Ord k, Group a) => Group (Selector k a) where
44+ negateG = fmap negateG
45+
46+instance (Eq a, Ord k, Group a) => Additive (Selector k a)
47+
1848main :: IO ()
1949main = mainWidget $ do
2050 let w = do
2151 n <- count =<< button "Increment"
2252 display n
23− queryDyn $ zipDynWith Map.singleton n $ pure $ MyQuery $ SelectedCount 1
53+ queryDyn $ zipDynWith (\x y -> Selector (Map.singleton (x :: Int) y)) n $ pure $ MyQuery $ SelectedCount 1
2454 return ()
2555 outer = do
2656 replace <- button "Replace"