on develop help sign in
Merge remote-tracking branch 'origin/develop' into ts-hydration
commitdbae6d37884d8db00a5b4d3e7a0a215bc88492eb authorTom Smalley <tfsmalley@gmail.com> dateThu 24 Jan 2019, 18:26 (8 years ago) parent9fa2f36707a5a8
11 files changed+48−242
Quickref.md+1−1 README.md+8−3 reflex-dom-core/reflex-dom-core.cabal−1 reflex-dom-core/src/Foreign/JavaScript/Orphans.hs+1 reflex-dom-core/src/Reflex/Dom/Core.hs−1 reflex-dom-core/src/Reflex/Dom/Modals/Base.hs−199 reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs+25−16 reflex-dom-core/src/Reflex/Dom/Widget/Input.hs+3−9 reflex-dom-core/src/Reflex/Dom/Widget/Lazy.hs+1−1 reflex-dom-core/src/Reflex/Dom/Widget/Resize.hs+1−1 reflex-dom/reflex-dom.cabal+8−10
Quickref.md+1−1
@@ -28,7 +28,7 @@ Widgets may return any type (this is 'a' in many of the functions below). Often
2828-- This version returns the 'El' as well.
2929[W] el' :: Text -> m a -> m (El, a)
3030
31−-- These two additionally apply attributes to the element, such as ("class" =: "blah")
31+-- These two additionally apply attributes to the element, such as ("class" =: "blah"). (=:) is 'Map.singleton'
3232[W] elAttr :: Text -> Map Text Text -> m a -> m a
3333[W] elAttr' :: Text -> Map Text Text -> m a -> m (El, a)
3434
README.md+8−3
@@ -1,12 +1,12 @@
1−## Reflex-DOM
1+## [Reflex-DOM](https://reflex-frp.org)
22### A Framework for Functional Reactive Web Apps in Haskell
33
44Reflex-DOM is a framework for building web applications in Haskell, based on the [Functional Reactive Programming](https://wiki.haskell.org/Functional_Reactive_Programming) library [Reflex](https://github.com/reflex-frp/reflex).
55
6−Comprehensive documentation is still a work in progress, but a [demo](https://github.com/reflex-frp/reflex-platform) is available and an introductory talk is available at [Part 1](https://www.youtube.com/watch?v=mYvkcskJbc4) / [Part 2](https://www.youtube.com/watch?v=3qfc9XFVo2c) ([Slides](https://obsidian.systems/reflex-nyhug/)).
7−
86A summary of Reflex-DOM functions is available in the [quick reference](Quickref.md).
97
8+**Visit https://reflex-frp.org/ for more information, tutorials, documentation and [examples](https://examples.reflex-frp.org/).**
9+
1010### Additional resources
1111[Get started with Reflex](https://github.com/reflex-frp/reflex-platform)
1212
@@ -15,3 +15,8 @@ A summary of Reflex-DOM functions is available in the [quick reference](Quickref
1515[hackage](https://hackage.haskell.org/package/reflex)
1616
1717[irc.freenode.net #reflex-frp](http://webchat.freenode.net?channels=%23reflex-frp&uio=d4)
18+
19+### Hacking
20+
21+Use the `./scripts/hack-on dep/reflex-dom` script in [Reflex Platform](https://github.com/reflex-frp/reflex-platform) to checkout the source code of `reflex-dom` locally in `./dep/reflex-dom` directory.
22+Then do modifications to the source in place, and use the `./try-reflex` or `./scripts/work-on` scripts to create the shell to test your changes.
reflex-dom-core/reflex-dom-core.cabal−1
@@ -98,7 +98,6 @@ library
9898 Reflex.Dom.Core
9999 Reflex.Dom.Location
100100 Reflex.Dom.Main
101− Reflex.Dom.Modals.Base
102101 Reflex.Dom.Modals.Class
103102 Reflex.Dom.Old
104103 Reflex.Dom.Prerender
reflex-dom-core/src/Foreign/JavaScript/Orphans.hs+1
@@ -1,3 +1,4 @@
1+{-# OPTIONS_HADDOCK hide #-}
12{-# LANGUAGE CPP #-}
23{-# LANGUAGE FlexibleContexts #-}
34{-# OPTIONS_GHC -fno-warn-orphans #-}
reflex-dom-core/src/Reflex/Dom/Core.hs−1
@@ -12,7 +12,6 @@ import Reflex.Dom.Builder.Static as X
1212import Reflex.Dom.Class as X
1313import Reflex.Dom.Location as X
1414import Reflex.Dom.Main as X
15−import Reflex.Dom.Modals.Base as X
1615import Reflex.Dom.Modals.Class as X
1716import Reflex.Dom.Old as X
1817import Reflex.Dom.Prerender as X
reflex-dom-core/src/Reflex/Dom/Modals/Base.hsdeleted−199
@@ -1,199 +0,0 @@
1−{-
2−{-# LANGUAGE CPP #-}
3−{-# LANGUAGE FlexibleInstances #-}
4−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5−{-# LANGUAGE OverloadedStrings #-}
6−{-# LANGUAGE MultiParamTypeClasses #-}
7−{-# LANGUAGE RankNTypes #-}
8−{-# LANGUAGE RecursiveDo #-}
9−{-# LANGUAGE ScopedTypeVariables #-}
10−{-# LANGUAGE TypeFamilies #-}
11−{-# LANGUAGE UndecidableInstances #-}
12−-}
13−module Reflex.Dom.Modals.Base
14−where
15−{-
16− ( ModalsT (..)
17− , ModalLayerConfig (..)
18− , withModalLayer
19− )where
20−
21−import Control.Lens hiding (element)
22−import Control.Monad.Fix
23−import Control.Monad.Primitive
24−import Control.Monad.Ref
25−import Control.Monad.Trans
26−import Data.Coerce
27−import Data.Default
28−import Data.Dependent.Map (DMap, DSum (..), GCompare)
29−import qualified Data.Dependent.Map as DMap
30−import Data.Functor.Compose
31−import Data.Proxy
32−import Data.Semigroup
33−import Data.Text (Text)
34−import qualified Data.Text as T
35−import Foreign.JavaScript.TH
36−import Language.Javascript.JSaddle (MonadJSM)
37−
38−import Data.Functor.Misc
39−import Reflex
40−import Reflex.Dom.Builder.Class
41−import Reflex.Dom.Builder.Immediate
42−import Reflex.Dom.Class
43−import Reflex.Dom.Modals.Class
44−import Reflex.Host.Class
45−
46−instance (Reflex t, PrimMonad m) => ModalOpener t (ModalsT t m) where
47− requestingModal = ModalsT . requesting . fmap Compose
48−
49−newtype ModalsT t m a = ModalsT { unModalsT :: RequesterT t (Compose (ModalsT t m) (Event t)) Maybe m a }
50− deriving (Functor, Applicative, Monad, MonadIO, MonadFix)
51−
52−instance Wrapped (ModalsT t m a) where
53− type Unwrapped (ModalsT t m a) = RequesterT t (Compose (ModalsT t m) (Event t)) Maybe m a
54− _Wrapped' = iso coerce coerce
55−
56−instance ModalsT t m a ~ x => Rewrapped (ModalsT t m a) x
57−
58−instance MonadTrans (ModalsT t) where
59− lift = ModalsT . lift
60−
61−instance (Reflex t, PostBuild t m) => PostBuild t (ModalsT t m) where
62− getPostBuild = view _Unwrapped getPostBuild
63−
64−instance MonadSample t m => MonadSample t (ModalsT t m) where
65− {-# INLINABLE sample #-}
66− sample = lift . sample
67−
68−instance MonadHold t m => MonadHold t (ModalsT t m) where
69− {-# INLINABLE hold #-}
70− hold v0 = lift . hold v0
71− {-# INLINABLE holdDyn #-}
72− holdDyn v0 = lift . holdDyn v0
73− {-# INLINABLE holdIncremental #-}
74− holdIncremental v0 = lift . holdIncremental v0
75−
76−instance PerformEvent t m => PerformEvent t (ModalsT t m) where
77− type Performable (ModalsT t m) = Performable m
78− {-# INLINABLE performEvent_ #-}
79− performEvent_ = lift . performEvent_
80− {-# INLINABLE performEvent #-}
81− performEvent = lift . performEvent
82−
83−instance (ReflexHost t, MonadReflexCreateTrigger t m) => MonadReflexCreateTrigger t (ModalsT t m) where
84− {-# INLINABLE newEventWithTrigger #-}
85− newEventWithTrigger = ModalsT . lift . newEventWithTrigger
86− {-# INLINABLE newFanEventWithTrigger #-}
87− newFanEventWithTrigger f = ModalsT $ lift $ newFanEventWithTrigger f
88−
89−instance TriggerEvent t m => TriggerEvent t (ModalsT t m) where
90− {-# INLINABLE newTriggerEvent #-}
91− newTriggerEvent = lift newTriggerEvent
92− {-# INLINABLE newTriggerEventWithOnComplete #-}
93− newTriggerEventWithOnComplete = lift newTriggerEventWithOnComplete
94− newEventWithLazyTriggerWithOnComplete = lift . newEventWithLazyTriggerWithOnComplete
95−
96−instance MonadRef m => MonadRef (ModalsT t m) where
97− type Ref (ModalsT t m) = Ref m
98− {-# INLINABLE newRef #-}
99− newRef = lift . newRef
100− {-# INLINABLE readRef #-}
101− readRef = lift . readRef
102− {-# INLINABLE writeRef #-}
103− writeRef r = lift . writeRef r
104−
105−instance MonadAtomicRef m => MonadAtomicRef (ModalsT t m) where
106− {-# INLINABLE atomicModifyRef #-}
107− atomicModifyRef r = lift . atomicModifyRef r
108−
109−instance (Adjustable t m, MonadHold t m, MonadFix m) => Adjustable t (ModalsT t m) where
110− runWithReplace a0 a' = ModalsT $ runWithReplace (unModalsT a0) (fmapCheap unModalsT a')
111− traverseDMapWithKeyWithAdjust f dm0 dm' = ModalsT $ traverseDMapWithKeyWithAdjust (coerce f) dm0 dm'
112− traverseDMapWithKeyWithAdjustWithMove f dm0 dm' = ModalsT $ traverseDMapWithKeyWithAdjustWithMove (coerce f) dm0 dm'
113−
114−instance (DomBuilder t m, PerformEvent t m, MonadFix m, MonadHold t m) => DomBuilder t (ModalsT t m) where
115− type DomBuilderSpace (ModalsT t m) = DomBuilderSpace m
116− element = coerce (element :: Text -> ElementConfig er t (DomBuilderSpace m) -> Unwrapped (ModalsT t m a) -> Unwrapped (ModalsT t m (Element er (DomBuilderSpace m) t, a)))
117− inputElement = coerce (inputElement :: InputElementConfig er t (DomBuilderSpace m) -> Unwrapped (ModalsT t m (InputElement er (DomBuilderSpace m) t)))
118− textAreaElement = coerce (textAreaElement :: TextAreaElementConfig er t (DomBuilderSpace m) -> Unwrapped (ModalsT t m (TextAreaElement er (DomBuilderSpace m) t)))
119− selectElement = coerce (selectElement :: SelectElementConfig er t (DomBuilderSpace m) -> Unwrapped (ModalsT t m a) -> Unwrapped (ModalsT t m (SelectElement er (DomBuilderSpace m) t, a)))
120− wrapRawElement e = (view _Unwrapped :: forall a. Unwrapped (ModalsT t m a) -> ModalsT t m a) . wrapRawElement e
121−
122−instance HasDocument m => HasDocument (ModalsT t m)
123−instance HasJSContext m => HasJSContext (ModalsT t m) where
124− type JSContextPhantom (ModalsT t m) = JSContextPhantom m
125− askJSContext = ModalsT askJSContext
126−#ifndef ghcjs_HOST_OS
127−instance MonadJSM m => MonadJSM (ModalsT t m)
128−#endif
129−
130−data ModalLayerConfig t m = ModalLayerConfig
131− { _modalLayerConfig_backdropElementConfig :: ElementConfig EventResult t (DomBuilderSpace m)
132− , _modalLayerConfig_bodyElementConfig :: ElementConfig EventResult t (DomBuilderSpace m)
133− }
134−
135−instance (DomBuilder t m) => Default (ModalLayerConfig t m) where
136− def = ModalLayerConfig
137− { _modalLayerConfig_backdropElementConfig = (def :: ElementConfig EventResult t (DomBuilderSpace m))
138− & elementConfig_eventSpec %~ addEventSpecFlags (Proxy :: Proxy (DomBuilderSpace m)) Click (const stopPropagation)
139− & initialAttributes .~ ("style" =: T.intercalate ";"
140− [ "position:absolute"
141− , "left:0", "right:0", "top:0", "bottom:0"
142− , "background-color:rgba(0,0,0,0.1)"
143− , "display:flex", "justify-content:center", "align-items:center"
144− ])
145− , _modalLayerConfig_bodyElementConfig = (def :: ElementConfig EventResult t (DomBuilderSpace m))
146− & elementConfig_eventSpec %~ addEventSpecFlags (Proxy :: Proxy (DomBuilderSpace m)) Click (const stopPropagation)
147− & initialAttributes .~ ("style" =: "background-color:white;opacity:1;padding:1em")
148− }
149−
150−instance (MonadQuery t q m, Monad m) => MonadQuery t q (ModalsT t m) where
151− tellQueryIncremental = lift . tellQueryIncremental
152− askQueryResult = lift askQueryResult
153− queryIncremental = lift . queryIncremental
154−
155−withModalLayer :: forall t m a. (Reflex t, MonadFix m, DomBuilder t m, MonadHold t m)
156− => ModalLayerConfig t m
157− -> ModalsT t m a
158− -> m a
159−withModalLayer cfg (ModalsT a) = do
160− rec (result, requests) <- do
161− runRequesterT a modalDone
162− modalDone <- modalInner requests cfg
163− return result
164−
165−modalInner :: forall t m k. (GCompare k, MonadHold t m, MonadFix m, DomBuilder t m)
166− => Event t (DMap k (Compose (ModalsT t m) (Event t)))
167− -> ModalLayerConfig t m
168− -> m (Event t (DMap k Maybe))
169−modalInner rqs' cfg = do
170− rec let rqs = fmap toInsertionsDMap rqs'
171− dones = fmap toDeletionsDMap modalDone
172− (m0, mpatch) <- traverseDMapWithKeyWithAdjust (\_ v -> Compose <$> modalBody cfg v) DMap.empty (rqs <> dones)
173− modal <- fmap (merge . mapKeyValuePairsMonotonic wrapArgs) . incrementalToDynamic <$> holdIncremental m0 mpatch
174− let modalDone = fmap (mapKeyValuePairsMonotonic unwrapArgs) $ switch $ current modal
175− return modalDone
176− where
177− wrapArgs (k :=> v) = WrapArg k :=> getCompose v
178− unwrapArgs :: DSum (WrapArg Maybe k) Identity -> DSum k Maybe
179− unwrapArgs (WrapArg k :=> Identity v) = k :=> v
180− toInsertionsDMap :: DMap k v -> PatchDMap k v
181− toInsertionsDMap = coerce . DMap.map (ComposeMaybe . Just)
182− toDeletionsDMap :: forall k' v v'. DMap k' v -> PatchDMap k' v'
183− toDeletionsDMap = coerce . DMap.map (\(_ :: v a) -> ComposeMaybe (Nothing :: Maybe (v' a)))
184−
185−modalBody :: forall t m a. (MonadHold t m, MonadFix m, DomBuilder t m)
186− => ModalLayerConfig t m
187− -> Compose (ModalsT t m) (Event t) a
188− -> m (Event t (Maybe a))
189−modalBody cfg v = do
190− (overlay, complete) <- element "div" (_modalLayerConfig_backdropElementConfig cfg) $ do
191− fmap snd $ element "div" (_modalLayerConfig_bodyElementConfig cfg) $ do
192− rec (rsps, rqs') <- runRequesterT (unModalsT (getCompose v)) innerDone
193− innerDone <- modalInner rqs' cfg
194− return rsps
195− return $ leftmost
196− [ Just <$> complete
197− , Nothing <$ domEvent Click overlay
198− ]
199−-}
reflex-dom-core/src/Reflex/Dom/Widget/Basic.hs+25−16
@@ -10,11 +10,9 @@
1010{-# LANGUAGE ScopedTypeVariables #-}
1111{-# LANGUAGE TypeFamilies #-}
1212module Reflex.Dom.Widget.Basic
13− ( partitionMapBySetLT
14− , ChildResult (..)
15−
13+ (
1614 -- * Displaying Values
17− , text
15+ text
1816 , dynText
1917 , comment
2018 , dynComment
@@ -59,6 +57,7 @@ module Reflex.Dom.Widget.Basic
5957 , module Data.Map.Misc
6058 , module Reflex.Collection
6159 , module Reflex.Workflow
60+ , partitionMapBySetLT
6261 ) where
6362
6463import Reflex.Class
@@ -95,6 +94,7 @@ import Prelude hiding (mapM, mapM_, sequence, sequence_)
9594-- No empty pieces will be included in the output.
9695
9796--TODO: This can probably be done more efficiently by dividing and conquering, re-using the structure of the Set instead of going through the Set linearally
97+{-# DEPRECATED partitionMapBySetLT "This will be removed in future releases." #-}
9898partitionMapBySetLT :: forall k v. Ord k => Set k -> Map k v -> Map (Either k ()) (Map k v)
9999partitionMapBySetLT s m0 = Map.fromDistinctAscList $ go (Set.toAscList s) m0
100100 where go :: [k] -> Map k v -> [(Either k (), Map k v)]
@@ -107,8 +107,7 @@ partitionMapBySetLT s m0 = Map.fromDistinctAscList $ go (Set.toAscList s) m0
107107 then go t geq
108108 else (Left h, lt) : go t geq
109109
110−newtype ChildResult t k a = ChildResult { unChildResult :: (a, Event t (Map k (Maybe (ChildResult t k a)))) }
111−
110+{-# INLINABLE text #-}
112111text :: DomBuilder t m => Text -> m ()
113112text t = void $ textNode $ def & textNodeConfig_initialContents .~ t
114113
@@ -146,7 +145,7 @@ button t = do
146145--TODO: Should this be renamed to 'widgetView' for consistency with 'widgetHold'?
147146-- | Given a Dynamic of widget-creating actions, create a widget that is recreated whenever the Dynamic updates.
148147-- The returned Event of widget results occurs when the Dynamic does.
149−-- Note: Often, the type 'a' is an Event, in which case the return value is an Event-of-Events that would typically be flattened (via 'switchPromptly').
148+-- Note: Often, the type @a@ is an 'Event', in which case the return value is an Event-of-Events that would typically be flattened (via 'switchHold').
150149dyn :: (DomBuilder t m, PostBuild t m) => Dynamic t (m a) -> m (Event t a)
151150dyn = networkView
152151
@@ -156,7 +155,7 @@ dyn_ = void . dyn
156155
157156-- | Given an initial widget and an Event of widget-creating actions, create a widget that is recreated whenever the Event fires.
158157-- The returned Dynamic of widget results occurs when the Event does.
159−-- Note: Often, the type 'a' is an Event, in which case the return value is a Dynamic-of-Events that would typically be flattened.
158+-- Note: Often, the type 'a' is an Event, in which case the return value is a Dynamic-of-Events that would typically be flattened (via 'switchDyn').
160159widgetHold :: (DomBuilder t m, MonadHold t m) => m a -> Event t (m a) -> m (Dynamic t a)
161160widgetHold = networkHold
162161
@@ -165,43 +164,51 @@ widgetHold_ :: (DomBuilder t m, MonadHold t m) => m a -> Event t (m a) -> m ()
165164widgetHold_ z = void . widgetHold z
166165
167166-- | Create a DOM element
168−-- > el "div" (text "Hello World")
167+--
168+-- >>> el "div" (text "Hello World")
169169-- <div>Hello World</div>
170170{-# INLINABLE el #-}
171171el :: forall t m a. DomBuilder t m => Text -> m a -> m a
172172el elementTag child = snd <$> el' elementTag child
173173
174174-- | Create a DOM element with attributes
175−-- > elAttr "a" ("href" =: "http://google.com") (text "Google!")
176−-- <a href="http://google.com">Google!</a>
175+--
176+-- >>> elAttr "a" ("href" =: "https://reflex-frp.org") (text "Reflex-FRP!")
177+-- <a href="https://reflex-frp.org">Reflex-FRP!</a>
177178{-# INLINABLE elAttr #-}
178179elAttr :: forall t m a. DomBuilder t m => Text -> Map Text Text -> m a -> m a
179180elAttr elementTag attrs child = snd <$> elAttr' elementTag attrs child
180181
181182-- | Create a DOM element with classes
182−-- > elClass "div" "row" (return ())
183+--
184+-- >>> elClass "div" "row" (return ())
183185-- <div class="row"></div>
184186{-# INLINABLE elClass #-}
185187elClass :: forall t m a. DomBuilder t m => Text -> Text -> m a -> m a
186188elClass elementTag c child = snd <$> elClass' elementTag c child
187189
188190-- | Create a DOM element with Dynamic Attributes
189−-- > elClass "div" (constDyn ("class" =: "row")) (return ())
191+--
192+-- >>> elClass "div" (constDyn ("class" =: "row")) (return ())
190193-- <div class="row"></div>
191194{-# INLINABLE elDynAttr #-}
192195elDynAttr :: forall t m a. (DomBuilder t m, PostBuild t m) => Text -> Dynamic t (Map Text Text) -> m a -> m a
193196elDynAttr elementTag attrs child = snd <$> elDynAttr' elementTag attrs child
194197
195198-- | Create a DOM element with a Dynamic Class
196−-- > elDynClass "div" (constDyn "row") (return ())
199+--
200+-- >>> elDynClass "div" (constDyn "row") (return ())
197201-- <div class="row"></div>
198202{-# INLINABLE elDynClass #-}
199203elDynClass :: forall t m a. (DomBuilder t m, PostBuild t m) => Text -> Dynamic t Text -> m a -> m a
200204elDynClass elementTag c child = snd <$> elDynClass' elementTag c child
201205
202206-- | Create a DOM element and return the element
203−-- > do (e, _) <- el' "div" (text "Click")
204−-- > return $ domEvent Click e
207+--
208+-- @
209+-- do (e, _) <- el' "div" (text "Click")
210+-- return $ domEvent Click e
211+-- @
205212{-# INLINABLE el' #-}
206213el' :: forall t m a. DomBuilder t m => Text -> m a -> m (Element EventResult (DomBuilderSpace m) t, a)
207214el' elementTag = element elementTag def
@@ -287,6 +294,8 @@ newtype Link t
287294 = Link { _link_clicked :: Event t ()
288295 }
289296
297+-- | >>> linkClass "Click here" "link-class"
298+-- > <a class="link-class">Click here</a>
290299linkClass :: DomBuilder t m => Text -> Text -> m (Link t)
291300linkClass s c = do
292301 (l,_) <- elAttr' "a" ("class" =: c) $ text s
reflex-dom-core/src/Reflex/Dom/Widget/Input.hs+3−9
@@ -346,16 +346,10 @@ fileInput config = do
346346 & modifyAttributes .~ fmap mapKeysToAttributeName modifyAttrs
347347 & elementConfig_eventSpec . ghcjsEventSpec_filters .~ filters
348348 cfg = (def :: InputElementConfig EventResult t (DomBuilderSpace m)) & inputElementConfig_elementConfig .~ elCfg
349− eRaw <- inputElement cfg
350− let e = _inputElement_raw eRaw
351− eChange <- wrapDomEvent e (`on` Events.change) $ do
352− files <- Input.getFilesUnchecked e
353− len <- FileList.getLength files
354− mapM (fmap (fromMaybe (error "fileInput: fileList.item returned null")) . FileList.item files) [0 .. len-1]
355− dValue <- holdDyn [] eChange
349+ input <- inputElement cfg
356350 return $ FileInput
357− { _fileInput_value = dValue
358− , _fileInput_element = e
351+ { _fileInput_value = _inputElement_files input
352+ , _fileInput_element = _inputElement_raw input
359353 }
360354
361355data Dropdown t k
reflex-dom-core/src/Reflex/Dom/Widget/Lazy.hs+1−1
@@ -142,7 +142,7 @@ virtualListBuffered buffer heightPx rowPx maxIndex i0 setI keyToIndex items0 ite
142142 (win, m) <- virtualList heightPx rowPx maxIndex i0 setI keyToIndex items0 itemsUpdate itemBuilder
143143 pb <- getPostBuild
144144 let extendWin o l = (max 0 (o - l * (buffer-1) `div` 2), l * buffer)
145− rec let winHitEdge = fmapMaybe id $ attachWith (\(oldOffset, oldLimit) (winOffset, winLimit) ->
145+ rec let winHitEdge = attachWithMaybe (\(oldOffset, oldLimit) (winOffset, winLimit) ->
146146 if winOffset > oldOffset && winOffset + winLimit < oldOffset + oldLimit
147147 then Nothing
148148 else Just (extendWin winOffset winLimit)) (current winBuffered) (updated win)
reflex-dom-core/src/Reflex/Dom/Widget/Resize.hs+1−1
@@ -32,7 +32,7 @@ import GHCJS.DOM.HTMLElement (getOffsetWidth, getOffsetHeight)
3232import qualified GHCJS.DOM.Types as DOM
3333
3434-- | A widget that wraps the given widget in a div and fires an event when resized.
35−-- Adapted from github.com/marcj/css-element-queries
35+-- Adapted from @github.com\/marcj\/css-element-queries@
3636resizeDetector :: (MonadJSM m, DomBuilder t m, PostBuild t m, TriggerEvent t m, PerformEvent t m, MonadHold t m, DomBuilderSpace m ~ GhcjsDomSpace, MonadJSM (Performable m), MonadFix m) => m a -> m (Event t (), a)
3737resizeDetector = resizeDetectorWithStyle ""
3838
reflex-dom/reflex-dom.cabal+8−10
@@ -10,12 +10,7 @@ Stability: Experimental
1010Category: FRP, Web, GUI, HTML, Javascript, Reactive, Reactivity, User Interfaces, User-interface
1111Build-type: Simple
1212cabal-version: >=1.24
13−-- Deal with https://github.com/haskell/cabal/issues/2544 / https://github.com/haskell/cabal/issues/367
14−extra-source-files: src/Reflex/Dom/Xhr/Foreign.hs
15− src/Reflex/Dom/WebSocket/Foreign.hs
16− src/Reflex/Dom/Xhr/ResponseType.hs
17− src/Reflex/Dom/Xhr/Exception.hs
18− java/org/reflexfrp/reflexdom/MainWidget.java
13+extra-source-files: java/org/reflexfrp/reflexdom/MainWidget.java
1914
2015flag use-warp
2116 description: Use jsaddle-warp server
@@ -58,6 +53,7 @@ library
5853 jsaddle
5954 c-sources: cbits/MainWidget.c
6055 include-dirs: cbits/include
56+ install-includes: MainWidget.h
6157 cpp-options: -DANDROID
6258 build-tools: hsc2hs
6359 build-depends:
@@ -114,6 +110,7 @@ library
114110 ghc-options: -fexpose-all-unfoldings
115111 if flag(use-reflex-optimizer)
116112 ghc-options: -fplugin=Reflex.Optimizer
113+ default-language: Haskell2010
117114
118115executable sortableList
119116 build-depends: base
@@ -130,13 +127,13 @@ executable sortableList
130127 hs-source-dirs: examples
131128 main-is: sortableList.hs
132129 ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2 -ferror-spans -fspecialise-aggressively
133− ghc-prof-options: -fprof-auto
134130 if !flag(build-examples)
135131 buildable: False
136132 if flag(expose-all-unfoldings)
137133 ghc-options: -fexpose-all-unfoldings
138134 if flag(use-reflex-optimizer)
139135 ghc-options: -fplugin=Reflex.Optimizer
136+ default-language: Haskell2010
140137
141138executable benchmark
142139 build-depends: base, reflex, reflex-dom, text, prim-uniq, dependent-map, containers, transformers, mtl, ghcjs-dom, ghc-prim, random, dependent-sum
@@ -145,6 +142,7 @@ executable benchmark
145142 ghc-options: -O2 -fspecialise-aggressively
146143 if !impl(ghcjs)
147144 buildable: False
145+ default-language: Haskell2010
148146
149147executable krausest
150148 build-depends: base, reflex, reflex-dom, text, prim-uniq, dependent-map, containers, transformers, mtl, ghcjs-dom, ghc-prim, random, dependent-sum, vector
@@ -152,11 +150,11 @@ executable krausest
152150 main-is: krausest.hs
153151 ghc-options: -O2 -fspecialise-aggressively
154152 if impl(ghcjs)
155− ghc-options: -dedupe
153+ ghcjs-options: -dedupe
156154 cpp-options: -DGHCJS_BROWSER -DGHCJS_GC_INTERVAL=60000
157155 else
158− --buildable: False
159− type: exitcode-stdio-1.0
156+ buildable: False
157+ default-language: Haskell2010
160158
161159source-repository head
162160 type: git