Skip to content

Commit 4ef725d

Browse files
Rename to X/X_; reorder emitter arg
1 parent 7da1c36 commit 4ef725d

File tree

2 files changed

+137
-71
lines changed

2 files changed

+137
-71
lines changed

src/Node/EventEmitter.purs

Lines changed: 125 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44
-- | - whether listener is added to the front (i.e. `on`) or back (i.e. `prependListener`) of the array
55
-- | - whether a listener is automatically removed after the first event (i.e. `once` or `prependOnceListener`).
66
-- |
7-
-- | This module provides functions for each of the 2 callback-adding functions
7+
-- | This module provides functions for each of the above 4 callback-adding functions
88
-- | If `<fn>` is either `on`, `once`, `prependListener`, or `prependOnceListener`, then this module exposes
9-
-- | 1. `<fn>` - no programmable way to remove the listener
10-
-- | 2. `<fn>Subscribe` - returns a callback that removes the listener
11-
-- |
12-
-- | The documentation for the `on*` functions provide an example of how to handle events.
9+
-- | 1. `<fn>` - returns a callback that removes the listener
10+
-- | 2. `<fn>_` - no programmable way to remove the listener
1311
-- |
1412
-- | ## Defining events emitted by an `EventEmitter`
1513
-- |
@@ -53,13 +51,13 @@ module Node.EventEmitter
5351
, newListenerHandle
5452
, removeListenerHandle
5553
, on
56-
, onSubscribe
54+
, on_
5755
, once
58-
, onceSubscribe
56+
, once_
5957
, prependListener
60-
, prependListenerSubscribe
58+
, prependListener_
6159
, prependOnceListener
62-
, prependOnceListenerSubscribe
60+
, prependOnceListener_
6361
) where
6462

6563
import Prelude
@@ -157,46 +155,158 @@ removeListenerHandle :: EventHandle EventEmitter (Either JsSymbol String -> Effe
157155
removeListenerHandle = EventHandle "removeListener" $ \cb -> mkEffectFn1 \jsSymbol ->
158156
cb $ runFn3 symbolOrStr Left Right jsSymbol
159157

160-
-- | Adds the callback to the end of the `listeners` array and provides no way to remove it in the future.
158+
-- | Adds the listener to the **end** of the `listeners` array.
159+
-- | Returns a callback that will remove the listener from the event emitter's `listeners` array.
160+
-- | If the listener removal callback isn't needed, use `on_`.
161+
-- |
161162
-- | Intended usage:
162163
-- | ```
163-
-- | on errorHandle eventEmitter \error -> do
164+
-- | removeLoggerCallback <- eventEmitter # on errorHandle \error -> do
164165
-- | log $ "Got error: " <> Exception.message error
166+
-- | log $ "This listener will now be removed."
167+
-- | -- sometime later...
168+
-- | removeLoggerCallback
165169
-- | ```
166170
on
167171
:: forall emitter psCb jsCb
168172
. EventHandle emitter psCb jsCb
173+
-> psCb
169174
-> emitter
175+
-> Effect (Effect Unit)
176+
on (EventHandle eventName toJsCb) psCb eventEmitter =
177+
runEffectFn4 subscribeSameFunction unsafeOn (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
178+
179+
-- | Adds the callback to the **end** of the `listeners` array and provides no way to remove the listener in the future.
180+
-- | If you need a callback to remove the listener in the future, use `on`.
181+
-- | Intended usage:
182+
-- | ```
183+
-- | eventEmitter # on_ errorHandle \error -> do
184+
-- | log $ "Got error: " <> Exception.message error
185+
-- | ```
186+
on_
187+
:: forall emitter psCb jsCb
188+
. EventHandle emitter psCb jsCb
170189
-> psCb
190+
-> emitter
171191
-> Effect Unit
172-
on (EventHandle eventName toJsCb) eventEmitter psCb =
192+
on_ (EventHandle eventName toJsCb) psCb eventEmitter =
173193
runEffectFn3 unsafeOn (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
174194

195+
-- | Adds the listener to the **end** of the `listeners` array. The listener will be removed after it is invoked once.
196+
-- | Returns a callback that will remove the listener from the event emitter's listeners array.
197+
-- | If the listener removal callback isn't needed, use `once_`.
198+
-- |
199+
-- | Intended usage:
200+
-- | ```
201+
-- | removeLoggerCallback <- eventEmitter # once errorHandle \error -> do
202+
-- | log $ "Got error: " <> Exception.message error
203+
-- | log $ "This listener will now be removed."
204+
-- | -- sometime later...
205+
-- | removeLoggerCallback
206+
-- | ```
175207
once
176208
:: forall emitter psCb jsCb
177209
. EventHandle emitter psCb jsCb
210+
-> psCb
178211
-> emitter
212+
-> Effect (Effect Unit)
213+
once (EventHandle eventName toJsCb) psCb eventEmitter =
214+
runEffectFn4 subscribeSameFunction unsafeOnce (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
215+
216+
-- | Adds the listener to the **end** of the `listeners` array. The listener will be removed after it is invoked once.
217+
-- | Returns a callback that will remove the listener from the event emitter's listeners array.
218+
-- | If you need a callback to remove the listener in the future, use `once`.
219+
-- |
220+
-- | Intended usage:
221+
-- | ```
222+
-- | eventEmitter # once_ errorHandle \error -> do
223+
-- | log $ "Got error: " <> Exception.message error
224+
-- | ```
225+
once_
226+
:: forall emitter psCb jsCb
227+
. EventHandle emitter psCb jsCb
179228
-> psCb
229+
-> emitter
180230
-> Effect Unit
181-
once (EventHandle eventName toJsCb) eventEmitter psCb =
231+
once_ (EventHandle eventName toJsCb) psCb eventEmitter =
182232
runEffectFn3 unsafeOnce (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
183233

234+
-- | Adds the listener to the **start** of the `listeners` array.
235+
-- | Returns a callback that will remove the listener from the event emitter's listeners array.
236+
-- | If the listener removal callback isn't needed, use `prependListener_`.
237+
-- |
238+
-- | Intended usage:
239+
-- | ```
240+
-- | removeLoggerCallback <- eventEmitter # prependListener errorHandle \error -> do
241+
-- | log $ "Got error: " <> Exception.message error
242+
-- | log $ "This listener will now be removed."
243+
-- | -- sometime later...
244+
-- | removeLoggerCallback
245+
-- | ```
184246
prependListener
185247
:: forall emitter psCb jsCb
186248
. EventHandle emitter psCb jsCb
249+
-> psCb
187250
-> emitter
251+
-> Effect (Effect Unit)
252+
prependListener (EventHandle eventName toJsCb) psCb eventEmitter =
253+
runEffectFn4 subscribeSameFunction unsafePrependListener (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
254+
255+
-- | Adds the listener to the **start** of the `listeners` array.
256+
-- | Returns a callback that will remove the listener from the event emitter's listeners array.
257+
-- | If the listener removal callback isn't needed, use `prependListener`.
258+
-- |
259+
-- | Intended usage:
260+
-- | ```
261+
-- | eventEmitter # prependListener_ errorHandle \error -> do
262+
-- | log $ "Got error: " <> Exception.message error
263+
-- | ```
264+
prependListener_
265+
:: forall emitter psCb jsCb
266+
. EventHandle emitter psCb jsCb
188267
-> psCb
268+
-> emitter
189269
-> Effect Unit
190-
prependListener (EventHandle eventName toJsCb) eventEmitter psCb =
270+
prependListener_ (EventHandle eventName toJsCb) psCb eventEmitter =
191271
runEffectFn3 unsafePrependListener (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
192272

273+
-- | Adds the listener to the **start** of the `listeners` array. The listener will be removed after it is invoked once.
274+
-- | Returns a callback that will remove the listener from the event emitter's listeners array.
275+
-- | If the listener removal callback isn't needed, use `prependOnceListener_`.
276+
-- |
277+
-- | Intended usage:
278+
-- | ```
279+
-- | removeLoggerCallback <- eventEmitter # prependOnceListener errorHandle \error -> do
280+
-- | log $ "Got error: " <> Exception.message error
281+
-- | log $ "This listener will now be removed."
282+
-- | -- sometime later...
283+
-- | removeLoggerCallback
284+
-- | ```
193285
prependOnceListener
194286
:: forall emitter psCb jsCb
195287
. EventHandle emitter psCb jsCb
288+
-> psCb
196289
-> emitter
290+
-> Effect (Effect Unit)
291+
prependOnceListener (EventHandle eventName toJsCb) psCb eventEmitter =
292+
runEffectFn4 subscribeSameFunction unsafePrependOnceListener (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
293+
294+
-- | Adds the listener to the **start** of the `listeners` array. The listener will be removed after it is invoked once.
295+
-- | Returns a callback that will remove the listener from the event emitter's listeners array.
296+
-- | If you need a callback to remove the listener in the future, use `prependOnceListener`.
297+
-- |
298+
-- | Intended usage:
299+
-- | ```
300+
-- | eventEmitter # prependOnceListener_ errorHandle \error -> do
301+
-- | log $ "Got error: " <> Exception.message error
302+
-- | ```
303+
prependOnceListener_
304+
:: forall emitter psCb jsCb
305+
. EventHandle emitter psCb jsCb
197306
-> psCb
307+
-> emitter
198308
-> Effect Unit
199-
prependOnceListener (EventHandle eventName toJsCb) eventEmitter psCb =
309+
prependOnceListener_ (EventHandle eventName toJsCb) psCb eventEmitter =
200310
runEffectFn3 unsafePrependOnceListener (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
201311

202312
-- | Internal function that ensures the JS callback function is the same one
@@ -214,50 +324,6 @@ subscribeSameFunction = mkEffectFn4 \onXFn eventEmitter eventName jsCb -> do
214324
runEffectFn3 onXFn (unsafeCoerce eventEmitter) eventName jsCb
215325
pure $ runEffectFn3 unsafeOff (unsafeCoerce eventEmitter) eventName jsCb
216326

217-
-- | A variant of `on` that returns a callback that will remove the listener from the event emitter's listeners array.
218-
-- | Intended usage:
219-
-- | ```
220-
-- | removeLoggerCallback <- onSubscribe errorHandle eventEmitter \error -> do
221-
-- | log $ "Got error: " <> Exception.message error
222-
-- | -- sometime later...
223-
-- | removeLoggerCallback
224-
-- | ```
225-
onSubscribe
226-
:: forall emitter psCb jsCb
227-
. EventHandle emitter psCb jsCb
228-
-> emitter
229-
-> psCb
230-
-> Effect (Effect Unit)
231-
onSubscribe (EventHandle eventName toJsCb) eventEmitter psCb =
232-
runEffectFn4 subscribeSameFunction unsafeOn (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
233-
234-
onceSubscribe
235-
:: forall emitter psCb jsCb
236-
. EventHandle emitter psCb jsCb
237-
-> emitter
238-
-> psCb
239-
-> Effect (Effect Unit)
240-
onceSubscribe (EventHandle eventName toJsCb) eventEmitter psCb =
241-
runEffectFn4 subscribeSameFunction unsafeOnce (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
242-
243-
prependListenerSubscribe
244-
:: forall emitter psCb jsCb
245-
. EventHandle emitter psCb jsCb
246-
-> emitter
247-
-> psCb
248-
-> Effect (Effect Unit)
249-
prependListenerSubscribe (EventHandle eventName toJsCb) eventEmitter psCb =
250-
runEffectFn4 subscribeSameFunction unsafePrependListener (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
251-
252-
prependOnceListenerSubscribe
253-
:: forall emitter psCb jsCb
254-
. EventHandle emitter psCb jsCb
255-
-> emitter
256-
-> psCb
257-
-> Effect (Effect Unit)
258-
prependOnceListenerSubscribe (EventHandle eventName toJsCb) eventEmitter psCb =
259-
runEffectFn4 subscribeSameFunction unsafePrependOnceListener (unsafeCoerce eventEmitter) eventName $ toJsCb psCb
260-
261327
foreign import unsafeOn :: forall f. EffectFn3 EventEmitter String f Unit
262328
foreign import unsafeOff :: forall f. EffectFn3 EventEmitter String f Unit
263329
foreign import unsafeOnce :: forall f. EffectFn3 EventEmitter String f Unit

test/Test/Node/EventEmitter.purs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Data.Tuple.Nested ((/\))
77
import Effect.Class (liftEffect)
88
import Effect.Ref as Ref
99
import Effect.Uncurried (EffectFn1, EffectFn2, mkEffectFn1, runEffectFn1, runEffectFn2, runEffectFn3)
10-
import Node.EventEmitter (EventEmitter, EventHandle(..), on, onSubscribe, once, onceSubscribe, prependListener, prependListenerSubscribe, prependOnceListener, prependOnceListenerSubscribe, unsafeEmitFn)
10+
import Node.EventEmitter (EventEmitter, EventHandle(..), on, on_, once, once_, prependListener, prependListener_, prependOnceListener, prependOnceListener_, unsafeEmitFn)
1111
import Node.EventEmitter as EventEmitter
1212
import Node.EventEmitter.UtilTypes (EventHandle1)
1313
import Test.Spec (Spec, describe, it)
@@ -31,18 +31,18 @@ spec = describe "event-emitter" do
3131
describe "standard functions" do
3232
let
3333
fns =
34-
[ "on" /\ on
35-
, "once" /\ once
36-
, "prependListener" /\ prependListener
37-
, "prependOnceListener" /\ prependOnceListener
34+
[ "on_" /\ on_
35+
, "once_" /\ once_
36+
, "prependListener_" /\ prependListener_
37+
, "prependOnceListener_" /\ prependOnceListener_
3838
]
3939
for_ fns \(fnName /\ fn) -> do
4040
it (fnName <> " works") do
4141
liftEffect do
4242
let expected = "bar"
4343
ref <- Ref.new ""
4444
ee <- EventEmitter.new
45-
fn fooHandle ee \val -> do
45+
ee # fn fooHandle \val -> do
4646
Ref.write val ref
4747
void $ runEffectFn2 (unsafeEmitFn ee) "foo" expected
4848
val <- Ref.read ref
@@ -51,18 +51,18 @@ spec = describe "event-emitter" do
5151
describe "subscribe functions" do
5252
let
5353
fns =
54-
[ "onSubscribe" /\ onSubscribe
55-
, "onceSubscribe" /\ onceSubscribe
56-
, "prependListenerSubscribe" /\ prependListenerSubscribe
57-
, "prependOnceListenerSubscribe" /\ prependOnceListenerSubscribe
54+
[ "onSubscribe" /\ on
55+
, "onceSubscribe" /\ once
56+
, "prependListenerSubscribe" /\ prependListener
57+
, "prependOnceListenerSubscribe" /\ prependOnceListener
5858
]
5959
for_ fns \(fnName /\ fn) -> do
6060
it (fnName <> " - normal call works") do
6161
liftEffect do
6262
let expected = "bar"
6363
ref <- Ref.new ""
6464
ee <- EventEmitter.new
65-
void $ fn fooHandle ee \val -> do
65+
void $ ee # fn fooHandle \val -> do
6666
Ref.write val ref
6767
void $ runEffectFn2 (unsafeEmitFn ee) "foo" expected
6868
val <- Ref.read ref
@@ -72,7 +72,7 @@ spec = describe "event-emitter" do
7272
liftEffect do
7373
ref <- Ref.new ""
7474
ee <- EventEmitter.new
75-
remove <- fn fooHandle ee \val -> do
75+
remove <- ee # fn fooHandle \val -> do
7676
Ref.write val ref
7777
remove
7878
void $ runEffectFn2 (unsafeEmitFn ee) "foo" "bar"

0 commit comments

Comments
 (0)