Skip to content

Commit e2845d6

Browse files
committed
Move all FFI to Util
1 parent dbfe6dd commit e2845d6

File tree

5 files changed

+72
-85
lines changed

5 files changed

+72
-85
lines changed

src/Halogen/VDom/DOM.purs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ import Control.Monad.Eff (Eff, foreachE)
1515
import Data.Array as Array
1616
import Data.Function.Uncurried as Fn
1717
import Data.Maybe (Maybe(..))
18+
import Data.Nullable (toNullable)
1819
import Data.Tuple (Tuple(..), fst)
1920

2021
import DOM (DOM)
2122
import DOM.Node.Types (Element, Node, Document, elementToNode) as DOM
2223

2324
import Halogen.VDom.Machine (Step(..), Machine)
2425
import Halogen.VDom.Machine as Machine
25-
import Halogen.VDom.Types (VDom(..), ElemSpec(..), ElemName(..), Namespace(..), runGraft)
26+
import Halogen.VDom.Types (VDom(..), ElemSpec(..), Namespace(..), runGraft)
2627
import Halogen.VDom.Util as Util
2728

2829
type VDomMachine eff a b = Machine (Eff eff) a b
@@ -87,7 +88,7 @@ buildElem
8788
buildElem (VDomSpec spec) = render
8889
where
8990
render es1@(ElemSpec ns1 name1 as1) ch1 = do
90-
el ← Fn.runFn3 createElem ns1 name1 spec.document
91+
el ← Fn.runFn3 Util.createElement (toNullable ns1) name1 spec.document
9192
let
9293
node = DOM.elementToNode el
9394
onChild = Fn.mkFn2 \ix child → do
@@ -147,7 +148,7 @@ buildKeyed
147148
buildKeyed (VDomSpec spec) = render
148149
where
149150
render es1@(ElemSpec ns1 name1 as1) ch1 = do
150-
el ← Fn.runFn3 createElem ns1 name1 spec.document
151+
el ← Fn.runFn3 Util.createElement (toNullable ns1) name1 spec.document
151152
let
152153
node = DOM.elementToNode el
153154
onChild = Fn.mkFn3 \k ix (Tuple _ vdom) → do
@@ -219,14 +220,6 @@ buildWidget (VDomSpec spec) = render
219220
halt
220221
buildVDom (VDomSpec spec) vdom
221222

222-
createElem
223-
eff
224-
. Fn.Fn3 (Maybe Namespace) ElemName DOM.Document (Eff (dom DOM | eff) DOM.Element)
225-
createElem = Fn.mkFn3 \ns (ElemName name) doc →
226-
case ns of
227-
NothingFn.runFn2 Util.createElement name doc
228-
Just (Namespace n) → Fn.runFn3 Util.createElementNS n name doc
229-
230223
eqElemSpec
231224
a
232225
. Fn.Fn2 (ElemSpec a) (ElemSpec a) Boolean

src/Halogen/VDom/DOM/Prop.js

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/Halogen/VDom/DOM/Prop.purs

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Halogen.VDom.DOM.Prop
22
( Prop(..)
3-
, Namespace(..)
43
, ElemRef(..)
54
, PropValue
65
, propFromString
@@ -16,16 +15,16 @@ import Control.Monad.Eff.Ref (REF)
1615
import Control.Monad.Eff.Ref as Ref
1716
import Data.Maybe (Maybe(..), maybe)
1817
import Data.StrMap as StrMap
19-
import Data.Nullable (Nullable, toNullable)
18+
import Data.Nullable (toNullable)
2019
import Data.Function.Uncurried as Fn
21-
import Data.Newtype (class Newtype)
2220
import Data.Tuple (Tuple(..), fst, snd)
2321
import DOM (DOM)
24-
import DOM.Event.EventTarget (EventListener, eventListener) as DOM
22+
import DOM.Event.EventTarget (eventListener) as DOM
2523
import DOM.Event.Types (EventType(..), Event) as DOM
2624
import DOM.HTML.Types (HTMLElement) as DOM
2725
import DOM.Node.Types (Element) as DOM
2826
import Halogen.VDom as V
27+
import Halogen.VDom.Types (Namespace(..))
2928
import Halogen.VDom.Util as Util
3029
import Unsafe.Coerce (unsafeCoerce)
3130

@@ -40,10 +39,6 @@ instance functorProp ∷ Functor Prop where
4039
map f (Ref g) = Ref (map f <$> g)
4140
map f p = unsafeCoerce p
4241

43-
newtype Namespace = Namespace String
44-
45-
derive instance newtypeNamespaceNewtype Namespace _
46-
4742
data ElemRef a
4843
= Created a
4944
| Removed a
@@ -106,7 +101,7 @@ buildProp emit el = render
106101
applyProp events = Fn.mkFn3 \_ _ v →
107102
case v of
108103
Attribute ns attr val → do
109-
Fn.runFn4 setAttribute (toNullable ns) attr val el
104+
Fn.runFn4 Util.setAttribute (toNullable ns) attr val el
110105
pure v
111106
Property prop val → do
112107
Fn.runFn3 setProperty prop val el
@@ -118,7 +113,7 @@ buildProp emit el = render
118113
f' ← Ref.readRef ref
119114
mbEmit (f' ev)
120115
Fn.runFn3 Util.pokeMutMap ty (Tuple listener ref) events
121-
Fn.runFn3 addEventListener ty listener el
116+
Fn.runFn3 Util.addEventListener ty listener el
122117
pure v
123118
Ref f → do
124119
mbEmit (f (Created (unsafeElementToHTMLElement el)))
@@ -129,7 +124,7 @@ buildProp emit el = render
129124
Attribute _ _ val1, Attribute ns2 attr2 val2 →
130125
case val1 /= val2 of
131126
truedo
132-
Fn.runFn4 setAttribute (toNullable ns2) attr2 val2 el
127+
Fn.runFn4 Util.setAttribute (toNullable ns2) attr2 val2 el
133128
pure v2
134129
_ →
135130
Util.effPure v2
@@ -160,13 +155,13 @@ buildProp emit el = render
160155
removeProp prevEvents = Fn.mkFn2 \_ v →
161156
case v of
162157
Attribute ns attr _ →
163-
Fn.runFn3 removeAttribute (toNullable ns) attr el
158+
Fn.runFn3 Util.removeAttribute (toNullable ns) attr el
164159
Property prop _ →
165160
Fn.runFn2 removeProperty prop el
166161
Handler (DOM.EventType ty) _ → do
167162
let
168163
handler = Fn.runFn2 Util.unsafeLookup ty prevEvents
169-
Fn.runFn3 removeEventListener ty (fst handler) el
164+
Fn.runFn3 Util.removeEventListener ty (fst handler) el
170165
Ref _ →
171166
Util.effUnit
172167

@@ -189,15 +184,3 @@ unsafeGetProperty = Util.unsafeGetAny
189184

190185
removeProperty eff. Fn.Fn2 String DOM.Element (Eff (dom DOM | eff) Unit)
191186
removeProperty = Util.unsafeDeleteAny
192-
193-
foreign import setAttribute
194-
eff. Fn.Fn4 (Nullable Namespace) String String DOM.Element (Eff (dom DOM | eff) Unit)
195-
196-
foreign import removeAttribute
197-
eff. Fn.Fn3 (Nullable Namespace) String DOM.Element (Eff (dom DOM | eff) Unit)
198-
199-
foreign import addEventListener
200-
eff. Fn.Fn3 String (DOM.EventListener (dom DOM | eff)) DOM.Element (Eff (dom DOM | eff) Unit)
201-
202-
foreign import removeEventListener
203-
eff. Fn.Fn3 String (DOM.EventListener (dom DOM | eff)) DOM.Element (Eff (dom DOM | eff) Unit)

src/Halogen/VDom/Util.js

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,13 @@ exports.setTextContent = function (s, n) {
122122
};
123123
};
124124

125-
exports.createElement = function (name, doc) {
125+
exports.createElement = function (ns, name, doc) {
126126
return function () {
127-
return doc.createElement(name)
128-
};
129-
};
130-
131-
exports.createElementNS = function (ns, name, doc) {
132-
return function () {
133-
return doc.createElementNS(ns, name);
127+
if (ns != null) {
128+
return doc.createElementNS(ns, name);
129+
} else {
130+
return doc.createElement(name)
131+
}
134132
};
135133
};
136134

@@ -153,4 +151,36 @@ exports.removeChild = function (a, b) {
153151

154152
exports.unsafeParent = function (a) {
155153
return a.parentNode;
156-
};
154+
};
155+
156+
exports.setAttribute = function (ns, attr, val, el) {
157+
return function () {
158+
if (ns != null) {
159+
el.setAttributeNS(ns, attr, val);
160+
} else {
161+
el.setAttribute(attr, val);
162+
}
163+
};
164+
};
165+
166+
exports.removeAttribute = function (ns, attr, el) {
167+
return function () {
168+
if (ns != null) {
169+
el.removeAttributeNS(ns, attr);
170+
} else {
171+
el.removeAttribute(attr);
172+
}
173+
};
174+
};
175+
176+
exports.addEventListener = function (ev, listener, el) {
177+
return function () {
178+
el.addEventListener(ev, listener, false);
179+
};
180+
};
181+
182+
exports.removeEventListener = function (ev, listener, el) {
183+
return function () {
184+
el.removeEventListener(ev, listener, false);
185+
};
186+
};

src/Halogen/VDom/Util.purs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,28 @@ module Halogen.VDom.Util
2121
, createTextNode
2222
, setTextContent
2323
, createElement
24-
, createElementNS
2524
, insertChildIx
2625
, removeChild
2726
, unsafeParent
27+
, setAttribute
28+
, removeAttribute
29+
, addEventListener
30+
, removeEventListener
2831
) where
2932

3033
import Prelude
3134
import Control.Monad.Eff (Eff)
3235
import Control.Monad.Eff.Ref (REF)
3336
import Data.Function.Uncurried as Fn
37+
import Data.Nullable (Nullable)
3438
import Data.StrMap (StrMap)
3539
import Data.StrMap as StrMap
3640
import Data.StrMap.ST (STStrMap)
3741
import Data.StrMap.ST as STStrMap
3842
import DOM (DOM)
43+
import DOM.Event.EventTarget (EventListener) as DOM
3944
import DOM.Node.Types (Document, Element, Node) as DOM
45+
import Halogen.VDom.Types (Namespace, ElemName)
4046
import Unsafe.Coerce (unsafeCoerce)
4147

4248
effPure eff a. a Eff eff a
@@ -137,11 +143,7 @@ foreign import setTextContent
137143

138144
foreign import createElement
139145
eff
140-
. Fn.Fn2 String DOM.Document (Eff (dom DOM | eff) DOM.Element)
141-
142-
foreign import createElementNS
143-
eff
144-
. Fn.Fn3 String String DOM.Document (Eff (dom DOM | eff) DOM.Element)
146+
. Fn.Fn3 (Nullable Namespace) ElemName DOM.Document (Eff (dom DOM | eff) DOM.Element)
145147

146148
foreign import insertChildIx
147149
eff
@@ -152,4 +154,16 @@ foreign import removeChild
152154
. Fn.Fn2 DOM.Node DOM.Node (Eff (dom DOM | eff) Unit)
153155

154156
foreign import unsafeParent
155-
DOM.Node DOM.Node
157+
DOM.Node DOM.Node
158+
159+
foreign import setAttribute
160+
eff. Fn.Fn4 (Nullable Namespace) String String DOM.Element (Eff (dom DOM | eff) Unit)
161+
162+
foreign import removeAttribute
163+
eff. Fn.Fn3 (Nullable Namespace) String DOM.Element (Eff (dom DOM | eff) Unit)
164+
165+
foreign import addEventListener
166+
eff. Fn.Fn3 String (DOM.EventListener (dom DOM | eff)) DOM.Element (Eff (dom DOM | eff) Unit)
167+
168+
foreign import removeEventListener
169+
eff. Fn.Fn3 String (DOM.EventListener (dom DOM | eff)) DOM.Element (Eff (dom DOM | eff) Unit)

0 commit comments

Comments
 (0)