Skip to content

Commit ffcd57d

Browse files
committed
feat: use uncurried
1 parent 120c82b commit ffcd57d

File tree

11 files changed

+102
-99
lines changed

11 files changed

+102
-99
lines changed

spago.lock

+16-16
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"foldable-traversable",
6565
"foreign",
6666
"foreign-object",
67-
"function s",
67+
"functions",
6868
"functors",
6969
"gen",
7070
"identity",
@@ -139,7 +139,7 @@
139139
"foreign-object",
140140
"fork",
141141
"free",
142-
"function s",
142+
"functions",
143143
"functors",
144144
"gen",
145145
"identity",
@@ -341,7 +341,7 @@
341341
"freeap": "7.0.0",
342342
"freer-free": "0.0.1",
343343
"freet": "7.0.0",
344-
"function s": "6.0.0",
344+
"functions": "6.0.0",
345345
"functor1": "3.0.0",
346346
"functors": "5.0.0",
347347
"fuzzy": "0.4.0",
@@ -733,7 +733,7 @@
733733
"either",
734734
"exceptions",
735735
"foldable-traversable",
736-
"function s",
736+
"functions",
737737
"maybe",
738738
"newtype",
739739
"parallel",
@@ -781,7 +781,7 @@
781781
"control",
782782
"either",
783783
"foreign-object",
784-
"function s",
784+
"functions",
785785
"gen",
786786
"maybe",
787787
"nonempty",
@@ -804,7 +804,7 @@
804804
"bifunctors",
805805
"control",
806806
"foldable-traversable",
807-
"function s",
807+
"functions",
808808
"maybe",
809809
"nonempty",
810810
"partial",
@@ -826,7 +826,7 @@
826826
"effect",
827827
"either",
828828
"exceptions",
829-
"function s",
829+
"functions",
830830
"maybe"
831831
]
832832
},
@@ -906,7 +906,7 @@
906906
"either",
907907
"enums",
908908
"foldable-traversable",
909-
"function s",
909+
"functions",
910910
"gen",
911911
"integers",
912912
"lists",
@@ -1018,7 +1018,7 @@
10181018
"integrity": "sha256-1ORiqoS3HW+qfwSZAppHPWy4/6AQysxZ2t29jcdUMNA=",
10191019
"dependencies": [
10201020
"either",
1021-
"function s",
1021+
"functions",
10221022
"identity",
10231023
"integers",
10241024
"lists",
@@ -1035,7 +1035,7 @@
10351035
"dependencies": [
10361036
"arrays",
10371037
"foldable-traversable",
1038-
"function s",
1038+
"functions",
10391039
"gen",
10401040
"lists",
10411041
"maybe",
@@ -1076,7 +1076,7 @@
10761076
"unsafe-coerce"
10771077
]
10781078
},
1079-
"function s": {
1079+
"functions": {
10801080
"type": "registry",
10811081
"version": "6.0.0",
10821082
"integrity": "sha256-adMyJNEnhGde2unHHAP79gPtlNjNqzgLB8arEOn9hLI=",
@@ -1253,7 +1253,7 @@
12531253
"dependencies": [
12541254
"effect",
12551255
"either",
1256-
"function s",
1256+
"functions",
12571257
"maybe",
12581258
"nullable",
12591259
"prelude",
@@ -1270,7 +1270,7 @@
12701270
"either",
12711271
"enums",
12721272
"exceptions",
1273-
"function s",
1273+
"functions",
12741274
"integers",
12751275
"js-date",
12761276
"maybe",
@@ -1357,7 +1357,7 @@
13571357
"integrity": "sha256-yiGBVl3AD+Guy4kNWWeN+zl1gCiJK+oeIFtZtPCw4+o=",
13581358
"dependencies": [
13591359
"effect",
1360-
"function s",
1360+
"functions",
13611361
"maybe"
13621362
]
13631363
},
@@ -1366,7 +1366,7 @@
13661366
"version": "9.0.1",
13671367
"integrity": "sha256-/9M6aeMDBdB4cwYDeJvLFprAHZ49EbtKQLIJsneXLIk=",
13681368
"dependencies": [
1369-
"function s",
1369+
"functions",
13701370
"maybe"
13711371
]
13721372
},
@@ -1533,7 +1533,7 @@
15331533
"version": "4.0.0",
15341534
"integrity": "sha256-Za5U85bTRJEfGK5Sk4hM41oXy84YQI0I8TL3WUn1Qzg=",
15351535
"dependencies": [
1536-
"function s",
1536+
"functions",
15371537
"prelude",
15381538
"unsafe-coerce"
15391539
]

src/React/Basic/DOM.js

+7-23
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,7 @@
1-
import * as ReactDOM from 'react-dom';
2-
3-
export function renderThen(jsx) {
4-
return (node) => (callback) => () =>
5-
ReactDOM.render(jsx, node, callback);
6-
}
7-
8-
export function hydrateThen(jsx) {
9-
return (node) => (callback) => () =>
10-
ReactDOM.hydrate(jsx, node, callback);
11-
}
12-
13-
export function unmount(node) {
14-
return () => ReactDOM.unmountComponentAtNode(node);
15-
}
16-
17-
export function createPortal(jsx) {
18-
return (node) => ReactDOM.createPortal(jsx, node);
19-
}
20-
21-
export function flushSync(callback) {
22-
return () => ReactDOM.flushSync(callback);
23-
}
1+
export {
2+
render as renderThenFn,
3+
hydrate as hydrateThenFn,
4+
unmountComponentAtNode,
5+
createPortal as createPortalFn,
6+
flushSync as flushSyncFn
7+
} from "react-dom";

src/React/Basic/DOM.purs

+18-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ module React.Basic.DOM
1919

2020
import Prelude
2121

22+
import Data.Function.Uncurried (Fn2, runFn2)
2223
import Effect (Effect)
24+
import Effect.Uncurried (EffectFn1, runEffectFn1, EffectFn3, runEffectFn3)
2325
import Prim.TypeError (class Warn, Text)
2426
import React.Basic (JSX)
2527
import React.Basic.DOM.Generated (Props_a, Props_abbr, Props_address, Props_area, Props_article, Props_aside, Props_audio, Props_b, Props_base, Props_bdi, Props_bdo, Props_blockquote, Props_body, Props_br, Props_button, Props_canvas, Props_caption, Props_cite, Props_code, Props_col, Props_colgroup, Props_data, Props_datalist, Props_dd, Props_del, Props_details, Props_dfn, Props_dialog, Props_div, Props_dl, Props_dt, Props_em, Props_embed, Props_fieldset, Props_figcaption, Props_figure, Props_footer, Props_form, Props_h1, Props_h2, Props_h3, Props_h4, Props_h5, Props_h6, Props_head, Props_header, Props_hgroup, Props_hr, Props_html, Props_i, Props_iframe, Props_img, Props_input, Props_ins, Props_kbd, Props_keygen, Props_label, Props_legend, Props_li, Props_link, Props_main, Props_map, Props_mark, Props_math, Props_menu, Props_menuitem, Props_meta, Props_meter, Props_nav, Props_noscript, Props_object, Props_ol, Props_optgroup, Props_option, Props_output, Props_p, Props_param, Props_picture, Props_pre, Props_progress, Props_q, Props_rb, Props_rp, Props_rt, Props_rtc, Props_ruby, Props_s, Props_samp, Props_script, Props_section, Props_select, Props_slot, Props_small, Props_source, Props_span, Props_strong, Props_style, Props_sub, Props_summary, Props_sup, Props_table, Props_tbody, Props_td, Props_template, Props_textarea, Props_tfoot, Props_th, Props_thead, Props_time, Props_title, Props_tr, Props_track, Props_u, Props_ul, Props_var, Props_video, Props_wbr, a, a', a_, abbr, abbr', abbr_, address, address', address_, area, area', article, article', article_, aside, aside', aside_, audio, audio', audio_, b, b', b_, base, base', bdi, bdi', bdi_, bdo, bdo', bdo_, blockquote, blockquote', blockquote_, body, body', body_, br, br', button, button', button_, canvas, canvas', canvas_, caption, caption', caption_, cite, cite', cite_, code, code', code_, col, col', colgroup, colgroup', colgroup_, data', data'', data_, datalist, datalist', datalist_, dd, dd', dd_, del, del', del_, details, details', details_, dfn, dfn', dfn_, dialog, dialog', dialog_, div, div', div_, dl, dl', dl_, dt, dt', dt_, em, em', em_, embed, embed', fieldset, fieldset', fieldset_, figcaption, figcaption', figcaption_, figure, figure', figure_, footer, footer', footer_, form, form', form_, h1, h1', h1_, h2, h2', h2_, h3, h3', h3_, h4, h4', h4_, h5, h5', h5_, h6, h6', h6_, head, head', head_, header, header', header_, hgroup, hgroup', hgroup_, hr, hr', html, html', html_, i, i', i_, iframe, iframe', iframe_, img, img', input, input', ins, ins', ins_, kbd, kbd', kbd_, keygen, keygen', keygen_, label, label', label_, legend, legend', legend_, li, li', li_, link, link', main, main', main_, map, map', map_, mark, mark', mark_, math, math', math_, menu, menu', menu_, menuitem, menuitem', menuitem_, meta, meta', meter, meter', meter_, nav, nav', nav_, noscript, noscript', noscript_, object, object', object_, ol, ol', ol_, optgroup, optgroup', optgroup_, option, option', option_, output, output', output_, p, p', p_, param, param', picture, picture', picture_, pre, pre', pre_, progress, progress', progress_, q, q', q_, rb, rb', rb_, rp, rp', rp_, rt, rt', rt_, rtc, rtc', rtc_, ruby, ruby', ruby_, s, s', s_, samp, samp', samp_, script, script', script_, section, section', section_, select, select', select_, slot, slot', slot_, small, small', small_, source, source', span, span', span_, strong, strong', strong_, style, style', style_, sub, sub', sub_, summary, summary', summary_, sup, sup', sup_, table, table', table_, tbody, tbody', tbody_, td, td', td_, template, template', template_, textarea, textarea', textarea_, tfoot, tfoot', tfoot_, th, th', th_, thead, thead', thead_, time, time', time_, title, title', title_, tr, tr', tr_, track, track', u, u', u_, ul, ul', ul_, var, var', var_, video, video', video_, wbr, wbr') as Generated
@@ -50,9 +52,9 @@ render'
5052
-> Element
5153
-> Effect Unit
5254
-> Effect Unit
53-
render' = renderThen
55+
render' = runEffectFn3 renderThenFn
5456

55-
foreign import renderThen :: JSX -> Element -> Effect Unit -> Effect Unit
57+
foreign import renderThenFn :: EffectFn3 JSX Element (Effect Unit) Unit
5658

5759
-- | Render or update/re-render a component tree into
5860
-- | a DOM element, attempting to reuse the existing
@@ -82,22 +84,28 @@ hydrate'
8284
-> Element
8385
-> Effect Unit
8486
-> Effect Unit
85-
hydrate' = hydrateThen
87+
hydrate' = runEffectFn3 hydrateThenFn
8688

87-
foreign import hydrateThen :: JSX -> Element -> Effect Unit -> Effect Unit
89+
foreign import hydrateThenFn :: EffectFn3 JSX Element (Effect Unit) Unit
8890

8991
-- | Attempt to unmount and clean up the React app
9092
-- | rendered into the given element. Returns `true`
9193
-- | if an app existed and was unmounted successfully.
9294
-- |
9395
-- | __*Note:* Relies on `ReactDOM.unmountComponentAtNode`__
9496
-- | __*Note:* `unmount` has been replaced with `Client.unmountRoot` in React 18
95-
foreign import unmount :: Element -> Effect Boolean
97+
unmount :: Element -> Effect Boolean
98+
unmount = runEffectFn1 unmountComponentAtNode
99+
100+
foreign import unmountComponentAtNode :: EffectFn1 Element Boolean
96101

97102
-- | Divert a render tree into a separate DOM node. The node's
98103
-- | content will be overwritten and managed by React, similar
99104
-- | to `render` and `hydrate`.
100-
foreign import createPortal :: JSX -> Element -> JSX
105+
createPortal :: JSX -> Element -> JSX
106+
createPortal = runFn2 createPortalFn
107+
108+
foreign import createPortalFn :: Fn2 JSX Element JSX
101109

102110
-- | Create a text node.
103111
text :: String -> JSX
@@ -112,4 +120,7 @@ text = unsafeCoerce
112120
-- | flushSync (setMessages (_ <> [msg]))
113121
-- | scrollToLastMessage
114122
-- | ```
115-
foreign import flushSync :: forall a. Effect a -> Effect a
123+
flushSync :: forall a. Effect a -> Effect a
124+
flushSync = runEffectFn1 flushSyncFn
125+
126+
foreign import flushSyncFn :: forall a. EffectFn1 (Effect a) a

src/React/Basic/DOM/Client.js

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import * as ReactDOMClient from "react-dom/client";
1+
export {
2+
createRoot as createRootFn,
3+
hydrateRoot as hydrateRootFn
4+
} from "react-dom/client";
25

3-
export const createRoot = (container) => () =>
4-
ReactDOMClient.createRoot(container);
6+
export const renderRootFn = (root, children) => root.render(children);
57

6-
export const hydrateRoot = (container) => (initialChildren) => () =>
7-
ReactDOMClient.hydrateRoot(container, initialChildren);
8-
9-
export const renderRoot = (root) => (children) => () => root.render(children);
10-
11-
export const unmountRoot = (root) => () => root.unmount(root);
8+
export const unmountRootFn = (root) => root.unmount(root);

src/React/Basic/DOM/Client.purs

+16-4
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,32 @@ import Prelude
44
import React.Basic (JSX)
55
import Web.DOM (Element)
66
import Effect (Effect)
7+
import Effect.Uncurried (EffectFn1, EffectFn2, runEffectFn1, runEffectFn2)
78

89
foreign import data ReactRoot :: Type
910

1011
-- | Create a React root for the supplied container and return the root.
1112
-- | The root can be used to render a React element into the DOM with `render.`
1213
-- | Replaces `ReactDOM.render` when the `.render` method is called and enables Concurrent Mode.
13-
foreign import createRoot :: Element -> Effect ReactRoot
14+
createRoot :: Element -> Effect ReactRoot
15+
createRoot = runEffectFn1 createRootFn
16+
foreign import createRootFn :: EffectFn1 Element ReactRoot
1417

1518
-- | Same as `createRoot`, but is used to hydrate a container whose HTML contents were rendered by ReactDOMServer.
1619
-- | React will attempt to attach event listeners to the existing markup.
17-
foreign import hydrateRoot :: Element -> JSX -> Effect ReactRoot
20+
hydrateRoot :: Element -> JSX -> Effect ReactRoot
21+
hydrateRoot = runEffectFn2 hydrateRootFn
22+
23+
foreign import hydrateRootFn :: EffectFn2 Element JSX ReactRoot
1824

1925
-- | Render children in `ReactRoot`
20-
foreign import renderRoot :: ReactRoot -> JSX -> Effect Unit
26+
renderRoot :: ReactRoot -> JSX -> Effect Unit
27+
renderRoot = runEffectFn2 renderRootFn
28+
29+
foreign import renderRootFn :: EffectFn2 ReactRoot JSX Unit
2130

2231
-- | Unmount the react root
23-
foreign import unmountRoot :: ReactRoot -> Effect Unit
32+
unmountRoot :: ReactRoot -> Effect Unit
33+
unmountRoot = runEffectFn1 unmountRootFn
34+
35+
foreign import unmountRootFn :: EffectFn1 ReactRoot Unit

src/React/Basic/DOM/Components/GlobalEvents.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ function checkPassiveSupported() {
88
"test",
99
null,
1010
Object.defineProperty({}, "passive", {
11+
// eslint-disable-next-line getter-return
1112
get: function() {
1213
_passiveSupported = true;
1314
}
@@ -92,4 +93,4 @@ export var unsafeWindowEventTarget = (function() {
9293
} else {
9394
return window;
9495
}
95-
})();
96+
})();

src/React/Basic/DOM/Events.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
"use strict";
2-
3-
export const propagateThis = (f) => (t) => () => {
1+
export function propagateThis(f, t) {
42
return f.call(t);
5-
}
3+
}

src/React/Basic/DOM/Events.purs

+4-3
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import Data.Maybe (Maybe)
5050
import Data.Nullable (toMaybe)
5151
import Effect (Effect)
5252
import Effect.Unsafe (unsafePerformEffect)
53+
import Effect.Uncurried (EffectFn2, runEffectFn2)
5354
import React.Basic.Events (EventFn, EventHandler, SyntheticEvent, handler, unsafeEventFn)
5455
import Unsafe.Coerce (unsafeCoerce)
5556
import Web.Event.Internal.Types (Event, EventTarget)
@@ -102,7 +103,7 @@ nativeEvent = unsafeEventFn \e -> (unsafeCoerce e).nativeEvent
102103

103104
preventDefault :: EventFn SyntheticEvent SyntheticEvent
104105
preventDefault = unsafeEventFn \e -> unsafePerformEffect do
105-
_ <- propagateThis (unsafeCoerce e).preventDefault e
106+
_ <- runEffectFn2 propagateThis (unsafeCoerce e).preventDefault e
106107
pure e
107108

108109
isDefaultPrevented :: EventFn SyntheticEvent Boolean
@@ -111,7 +112,7 @@ isDefaultPrevented = unsafeEventFn \e -> unsafePerformEffect do
111112

112113
stopPropagation :: EventFn SyntheticEvent SyntheticEvent
113114
stopPropagation = unsafeEventFn \e -> unsafePerformEffect do
114-
_ <- propagateThis (unsafeCoerce e).stopPropagation e
115+
_ <- runEffectFn2 propagateThis (unsafeCoerce e).stopPropagation e
115116
pure e
116117

117118
isPropagationStopped :: EventFn SyntheticEvent Boolean
@@ -208,4 +209,4 @@ clipboardData = unsafeEventFn \e -> toMaybe (unsafeCoerce e).clipboardData
208209
compositionData :: EventFn SyntheticEvent (Maybe String)
209210
compositionData = unsafeEventFn \e -> toMaybe (unsafeCoerce e).data
210211

211-
foreign import propagateThis :: forall f t a. f -> t -> Effect a
212+
foreign import propagateThis :: forall f t a. EffectFn2 f t a

0 commit comments

Comments
 (0)