Skip to content

Commit 59ef31e

Browse files
author
Ryan Trinkle
committed
Move some query morphisms into Reflex.Query.Class
1 parent 240932e commit 59ef31e

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

src/Reflex/Query/Base.hs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,6 @@ instance (Monoid a, Monad m) => Monoid (QueryT t q m a) where
278278
instance (S.Semigroup a, Monad m) => S.Semigroup (QueryT t q m a) where
279279
(<>) = liftA2 (S.<>)
280280

281-
282-
mapQuery :: QueryMorphism q q' -> q -> q'
283-
mapQuery = _queryMorphism_mapQuery
284-
285-
mapQueryResult :: QueryMorphism q q' -> QueryResult q' -> QueryResult q
286-
mapQueryResult = _queryMorphism_mapQueryResult
287-
288281
-- | withQueryT's QueryMorphism argument needs to be a group homomorphism in order to behave correctly
289282
withQueryT :: (MonadFix m, PostBuild t m, Group q, Group q', Additive q, Additive q', Query q')
290283
=> QueryMorphism q q'

src/Reflex/Query/Class.hs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,18 @@ module Reflex.Query.Class
1515
, MonadQuery (..)
1616
, tellQueryDyn
1717
, queryDyn
18+
, mapQuery
19+
, mapQueryResult
1820
) where
1921

22+
import Control.Category (Category)
23+
import qualified Control.Category as Cat
2024
import Control.Monad.Reader
2125
import Data.Bits
2226
import Data.Data
2327
import Data.Ix
28+
import Data.Map.Monoidal (MonoidalMap)
29+
import qualified Data.Map.Monoidal as MonoidalMap
2430
import Data.Semigroup
2531
import Foreign.Storable
2632

@@ -30,13 +36,30 @@ class (Monoid (QueryResult a), Semigroup (QueryResult a)) => Query a where
3036
type QueryResult a :: *
3137
crop :: a -> QueryResult a -> QueryResult a
3238

39+
instance (Ord k, Query v) => Query (MonoidalMap k v) where
40+
type QueryResult (MonoidalMap k v) = MonoidalMap k (QueryResult v)
41+
crop q r = MonoidalMap.intersectionWith (flip crop) r q
42+
3343
-- | NB: QueryMorphism's must be group homomorphisms when acting on the query type
3444
-- and compatible with the query relationship when acting on the query result
3545
data QueryMorphism q q' = QueryMorphism
3646
{ _queryMorphism_mapQuery :: q -> q'
3747
, _queryMorphism_mapQueryResult :: QueryResult q' -> QueryResult q
3848
}
3949

50+
instance Category QueryMorphism where
51+
id = QueryMorphism id id
52+
qm . qm' = QueryMorphism
53+
{ _queryMorphism_mapQuery = mapQuery qm . mapQuery qm'
54+
, _queryMorphism_mapQueryResult = mapQueryResult qm' . mapQueryResult qm
55+
}
56+
57+
mapQuery :: QueryMorphism q q' -> q -> q'
58+
mapQuery = _queryMorphism_mapQuery
59+
60+
mapQueryResult :: QueryMorphism q q' -> QueryResult q' -> QueryResult q
61+
mapQueryResult = _queryMorphism_mapQueryResult
62+
4063
-- | This type keeps track of the multiplicity of elements of the view selector that are being used by the app
4164
newtype SelectedCount = SelectedCount { unSelectedCount :: Int }
4265
deriving (Eq, Ord, Show, Read, Integral, Num, Bounded, Enum, Real, Ix, Bits, FiniteBits, Storable, Data)

0 commit comments

Comments
 (0)