Skip to content

Commit b63e3e8

Browse files
committed
Avoid new function creation in PanResponder
This follows the discussion in facebook#37
1 parent 3b8f195 commit b63e3e8

File tree

2 files changed

+77
-63
lines changed

2 files changed

+77
-63
lines changed

src/panResponderRe.re

Lines changed: 60 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,23 @@
11
type t;
22

3-
type gestureState =
4-
{
3+
type gestureState = {
4+
stateID: float,
5+
moveX: float,
6+
moveY: float,
7+
x0: float,
8+
y0: float,
9+
dx: float,
10+
dy: float,
11+
vx: float,
12+
vy: float,
13+
numberActiveTouches: int
14+
};
15+
16+
external _create : 'a => t = "create" [@@bs.scope "PanResponder"] [@@bs.module "react-native"];
17+
18+
type jsGestureState =
19+
Js.t {
20+
.
521
stateID : float,
622
moveX : float,
723
moveY : float,
@@ -14,9 +30,24 @@ type gestureState =
1430
numberActiveTouches : int
1531
};
1632

17-
type callback 'a = RNEvent.NativeEvent.t => gestureState => 'a;
33+
type callback 'a = Js.t {. nativeEvent : RNEvent.NativeEvent.t} => jsGestureState => 'a;
1834

19-
external _create : 'a => t = "create" [@@bs.scope "PanResponder"] [@@bs.module "react-native"];
35+
let callback (x: RNEvent.NativeEvent.t => gestureState => 'a) :callback 'a =>
36+
fun event state =>
37+
x
38+
event##nativeEvent
39+
{
40+
dx: state##dx,
41+
dy: state##dy,
42+
moveX: state##moveX,
43+
moveY: state##moveY,
44+
numberActiveTouches: state##numberActiveTouches,
45+
stateID: state##stateID,
46+
vx: state##vx,
47+
vy: state##vy,
48+
x0: state##x0,
49+
y0: state##y0
50+
};
2051

2152
external shamelesslyWrapCallback : 'a => callback unit = "%identity";
2253

@@ -34,27 +65,10 @@ let animatedEvent l => {
3465
(Js.Obj.empty ())
3566
l;
3667
shamelesslyWrapCallback (
37-
AnimatedRe.event (Array.of_list [Js.null, Js.Null.return config]) {"useNativeDriver": Js.false_}
68+
AnimatedRe.event [|Js.null, Js.Null.return config|] {"useNativeDriver": Js.false_}
3869
)
3970
};
4071

41-
let convertCallback x =>
42-
switch x {
43-
| None => Js.undefined;
44-
| Some x => Js.Undefined.return (fun event state => x event##nativeEvent {
45-
dx: state##dx,
46-
dy: state##dy,
47-
moveX: state##moveX,
48-
moveY: state##moveY,
49-
numberActiveTouches: state##numberActiveTouches,
50-
stateID: state##stateID,
51-
vx: state##vx,
52-
vy: state##vy,
53-
x0: state##x0,
54-
y0: state##y0
55-
});
56-
};
57-
5872
let create
5973
onMoveShouldSetPanResponder::(onMoveShouldSetPanResponder: option (callback bool))=?
6074
onMoveShouldSetPanResponderCapture::
@@ -72,27 +86,27 @@ let create
7286
onPanResponderTerminationRequest::(onPanResponderTerminationRequest: option (callback bool))=?
7387
onShouldBlockNativeResponder::(onShouldBlockNativeResponder: option (callback bool))=?
7488
() =>
75-
_create
76-
{
77-
"onMoveShouldSetPanResponder": convertCallback onMoveShouldSetPanResponder,
78-
"onMoveShouldSetPanResponderCapture": convertCallback onMoveShouldSetPanResponderCapture,
79-
"onStartShouldSetPanResponder": convertCallback onStartShouldSetPanResponder,
80-
"onStartShouldSetPanResponderCapture": convertCallback onStartShouldSetPanResponderCapture,
81-
"onPanResponderReject": convertCallback onPanResponderReject,
82-
"onPanResponderGrant": convertCallback onPanResponderGrant,
83-
"onPanResponderStart": convertCallback onPanResponderStart,
84-
"onPanResponderEnd": convertCallback onPanResponderEnd,
85-
"onPanResponderRelease": convertCallback onPanResponderRelease,
86-
"onPanResponderMove":
87-
switch onPanResponderMove {
88-
| None => Js.undefined
89-
| Some x =>
90-
switch x {
91-
| `update l => Js.Undefined.return (animatedEvent l)
92-
| `callback (x: callback unit) => Js.Undefined.return x
93-
}
94-
},
95-
"onPanResponderTerminate": convertCallback onPanResponderTerminate,
96-
"onPanResponderTerminationRequest": convertCallback onPanResponderTerminationRequest,
97-
"onShouldBlockNativeResponder": convertCallback onShouldBlockNativeResponder
98-
};
89+
_create {
90+
"onMoveShouldSetPanResponder": Js.Undefined.from_opt onMoveShouldSetPanResponder,
91+
"onMoveShouldSetPanResponderCapture": Js.Undefined.from_opt onMoveShouldSetPanResponderCapture,
92+
"onStartShouldSetPanResponder": Js.Undefined.from_opt onStartShouldSetPanResponder,
93+
"onStartShouldSetPanResponderCapture":
94+
Js.Undefined.from_opt onStartShouldSetPanResponderCapture,
95+
"onPanResponderReject": Js.Undefined.from_opt onPanResponderReject,
96+
"onPanResponderGrant": Js.Undefined.from_opt onPanResponderGrant,
97+
"onPanResponderStart": Js.Undefined.from_opt onPanResponderStart,
98+
"onPanResponderEnd": Js.Undefined.from_opt onPanResponderEnd,
99+
"onPanResponderRelease": Js.Undefined.from_opt onPanResponderRelease,
100+
"onPanResponderMove":
101+
switch onPanResponderMove {
102+
| None => Js.undefined
103+
| Some x =>
104+
switch x {
105+
| `update l => Js.Undefined.return (animatedEvent l)
106+
| `callback (x: callback unit) => Js.Undefined.return x
107+
}
108+
},
109+
"onPanResponderTerminate": Js.Undefined.from_opt onPanResponderTerminate,
110+
"onPanResponderTerminationRequest": Js.Undefined.from_opt onPanResponderTerminationRequest,
111+
"onShouldBlockNativeResponder": Js.Undefined.from_opt onShouldBlockNativeResponder
112+
};

src/panResponderRe.rei

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
type t;
22

3-
type gestureState =
4-
{
5-
stateID : float,
6-
moveX : float,
7-
moveY : float,
8-
x0 : float,
9-
y0 : float,
10-
dx : float,
11-
dy : float,
12-
vx : float,
13-
vy : float,
14-
numberActiveTouches : int
15-
};
3+
type gestureState = {
4+
stateID: float,
5+
moveX: float,
6+
moveY: float,
7+
x0: float,
8+
y0: float,
9+
dx: float,
10+
dy: float,
11+
vx: float,
12+
vy: float,
13+
numberActiveTouches: int
14+
};
1615

16+
type callback 'a;
1717

18-
type callback 'a = RNEvent.NativeEvent.t => gestureState => 'a;
18+
let callback: (RNEvent.NativeEvent.t => gestureState => 'a) => callback 'a;
1919

2020
let create:
2121
onMoveShouldSetPanResponder::callback bool? =>
@@ -28,14 +28,14 @@ let create:
2828
onPanResponderEnd::callback unit? =>
2929
onPanResponderRelease::callback unit? =>
3030
onPanResponderMove::
31-
[<
31+
[
3232
| `callback (callback unit)
3333
| `update (
34-
list [< | `X AnimatedRe.Value.t | `XY AnimatedRe.ValueXY.t | `Y AnimatedRe.Value.t]
34+
list [ | `X AnimatedRe.Value.t | `XY AnimatedRe.ValueXY.t | `Y AnimatedRe.Value.t]
3535
)
3636
]? =>
3737
onPanResponderTerminate::callback unit? =>
3838
onPanResponderTerminationRequest::callback bool? =>
3939
onShouldBlockNativeResponder::callback bool? =>
4040
unit =>
41-
t;
41+
t;

0 commit comments

Comments
 (0)