Skip to content
This repository was archived by the owner on Oct 4, 2020. It is now read-only.

Commit 872a115

Browse files
authored
Merge pull request #76 from purescript-contrib/read-nodes
Add `read*` functions for `Node`, `Document`, `Element`
2 parents ee79e6e + 61efe4a commit 872a115

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

src/DOM/Node/Types.purs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,20 @@
22
module DOM.Node.Types where
33

44
import Prelude
5+
6+
import Data.Foreign (F, Foreign)
57
import Data.Newtype (class Newtype)
8+
69
import DOM.Event.Types (EventTarget)
10+
711
import Unsafe.Coerce (unsafeCoerce)
12+
import DOM.Util.FFI (unsafeReadProtoTagged)
813

914
foreign import data Node :: *
1015

16+
readNode :: Foreign -> F Node
17+
readNode = unsafeReadProtoTagged "Node"
18+
1119
foreign import data NonElementParentNode :: *
1220
foreign import data ParentNode :: *
1321
foreign import data NonDocumentTypeChildNode :: *
@@ -18,6 +26,9 @@ foreign import data DOMTokenList :: *
1826

1927
foreign import data Document :: *
2028

29+
readDocument :: Foreign -> F Document
30+
readDocument = unsafeReadProtoTagged "Document"
31+
2132
documentToNonElementParentNode :: Document -> NonElementParentNode
2233
documentToNonElementParentNode = unsafeCoerce
2334

@@ -38,6 +49,9 @@ derive instance newtypeElementId :: Newtype ElementId _
3849
derive newtype instance eqElementId :: Eq ElementId
3950
derive newtype instance oOrdElementId :: Ord ElementId
4051

52+
readElement :: Foreign -> F Element
53+
readElement = unsafeReadProtoTagged "Element"
54+
4155
elementToParentNode :: Element -> ParentNode
4256
elementToParentNode = unsafeCoerce
4357

src/DOM/Util/FFI.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"use strict";
2+
3+
exports._unsafeReadProtoTagged = function (name) {
4+
return function (failure) {
5+
return function (success) {
6+
return function (value) {
7+
var obj = value;
8+
while (obj != null) {
9+
var proto = Object.getPrototypeOf(obj);
10+
var ctor = proto.constructor.name;
11+
if (ctor === name) {
12+
return success(value);
13+
} else if (ctor === "Object") {
14+
return failure(Object.getPrototypeOf(value).constructor.name);
15+
}
16+
obj = proto;
17+
}
18+
return failure(Object.getPrototypeOf(value).constructor.name);
19+
};
20+
};
21+
};
22+
};

src/DOM/Util/FFI.purs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module DOM.Util.FFI (unsafeReadProtoTagged) where
2+
3+
import Prelude
4+
5+
import Control.Monad.Except (except)
6+
7+
import Data.Either (Either(..))
8+
import Data.Foreign (F, Foreign, ForeignError(..))
9+
10+
foreign import _unsafeReadProtoTagged
11+
:: forall n
12+
. String
13+
-> (forall a. String -> F a)
14+
-> (forall a. a -> F a)
15+
-> Foreign
16+
-> F n
17+
18+
unsafeReadProtoTagged :: forall a. String -> Foreign -> F a
19+
unsafeReadProtoTagged name =
20+
_unsafeReadProtoTagged
21+
name
22+
(except <<< Left <<< pure <<< TypeMismatch name)
23+
(except <<< Right)

0 commit comments

Comments
 (0)