Skip to content

Commit 533a969

Browse files
committed
Better coercions for CustomEvent, no F-read
1 parent 910b4d5 commit 533a969

File tree

8 files changed

+46
-36
lines changed

8 files changed

+46
-36
lines changed

bower.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"name": "purescript-web-dom",
3-
"homepage": "https://github.com/purescript-web/purescript-web-dom",
2+
"name": "purescript-web-events",
3+
"homepage": "https://github.com/purescript-web/purescript-web-events",
44
"license": "MIT",
55
"repository": {
66
"type": "git",
7-
"url": "git://github.com/purescript-web/purescript-web-dom.git"
7+
"url": "git://github.com/purescript-web/purescript-web-events.git"
88
},
99
"ignore": [
1010
"**/.*",
@@ -17,7 +17,6 @@
1717
"dependencies": {
1818
"purescript-datetime": "#compiler/0.12",
1919
"purescript-enums": "#compiler/0.12",
20-
"purescript-foreign": "#compiler/0.12",
2120
"purescript-nullable": "#compiler/0.12"
2221
}
2322
}

src/Web/Event/CustomEvent.purs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
module Web.Event.CustomEvent where
22

3-
import Foreign (F, Foreign, unsafeReadTagged)
3+
import Data.Maybe (Maybe)
44
import Unsafe.Coerce as U
55
import Web.Event.Event (Event)
6+
import Web.Internal.FFI (unsafeReadProtoTagged)
67

78
foreign import data CustomEvent :: Type
89

10+
fromEvent :: Event -> Maybe CustomEvent
11+
fromEvent = unsafeReadProtoTagged "CustomEvent"
12+
913
toEvent :: CustomEvent -> Event
1014
toEvent = U.unsafeCoerce
11-
12-
read :: Foreign -> F CustomEvent
13-
read = unsafeReadTagged "CustomEvent"

src/Web/Event/Event.purs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import Data.Newtype (class Newtype)
2323
import Data.Nullable (Nullable, toMaybe)
2424
import Effect (Effect)
2525
import Web.Event.EventPhase (EventPhase)
26-
import Web.Event.Types (Event) as Exports
27-
import Web.Event.Types (Event, EventTarget)
26+
import Web.Event.Internal.Types (Event) as Exports
27+
import Web.Event.Internal.Types (Event, EventTarget)
2828

2929
-- | The type of strings used for event types.
3030
newtype EventType = EventType String

src/Web/Event/EventTarget.js

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
1-
/* global EventTarget */
21
"use strict";
32

4-
exports._read = function (left) {
5-
return function (right) {
6-
return function (foreign) {
7-
return foreign instanceof EventTarget ? right(foreign) : left("Value is not an EventTarget");
8-
};
9-
};
10-
};
11-
123
exports.eventListener = function (fn) {
134
return function (event) {
145
return fn(event);

src/Web/Event/EventTarget.purs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
module Web.Event.EventTarget
22
( module Exports
3-
, read
43
, EventListener
54
, eventListener
65
, addEventListener
@@ -10,23 +9,10 @@ module Web.Event.EventTarget
109

1110
import Prelude
1211

13-
import Control.Monad.Except (except)
14-
import Data.Bifunctor (lmap)
15-
import Data.Either (Either(..))
1612
import Effect (Effect)
17-
import Foreign (F, Foreign, ForeignError(..))
1813
import Web.Event.Event (EventType)
19-
import Web.Event.Types (Event, EventTarget)
20-
import Web.Event.Types (EventTarget) as Exports
21-
22-
read :: Foreign -> F EventTarget
23-
read = except <<< lmap (pure <<< ForeignError) <<< _read Left Right
24-
25-
foreign import _read
26-
:: (forall a b. a -> Either a b)
27-
-> (forall a b. b -> Either a b)
28-
-> Foreign
29-
-> Either String EventTarget
14+
import Web.Event.Internal.Types (Event, EventTarget)
15+
import Web.Event.Internal.Types (EventTarget) as Exports
3016

3117
-- | A boxed function that can be used as an event listener. This is necessary
3218
-- | due to the underlying implementation of Effect functions.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module Web.Event.Types where
1+
module Web.Event.Internal.Types where
22

33
-- | Basic type for all DOM events.
44
foreign import data Event :: Type

src/Web/Internal/FFI.js

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

src/Web/Internal/FFI.purs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module Web.Internal.FFI (unsafeReadProtoTagged) where
2+
3+
import Data.Function.Uncurried (Fn4, runFn4)
4+
import Data.Maybe (Maybe(..))
5+
6+
unsafeReadProtoTagged :: forall a b. String -> a -> Maybe b
7+
unsafeReadProtoTagged name value =
8+
runFn4 _unsafeReadProtoTagged Nothing Just name value
9+
10+
foreign import _unsafeReadProtoTagged
11+
:: forall a b
12+
. Fn4
13+
(forall x. Maybe x)
14+
(forall x. x -> Maybe x)
15+
String
16+
a
17+
(Maybe b)

0 commit comments

Comments
 (0)