Skip to content

Commit

Permalink
Signals are now classes. For easier typing.
Browse files Browse the repository at this point in the history
  • Loading branch information
hmans committed Apr 16, 2022
1 parent edd7787 commit 107d328
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 18 deletions.
26 changes: 11 additions & 15 deletions src/Signal.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,22 @@
export function Signal<Payload extends any = void>() {
type Listener = (payload: Payload) => void
export class Signal<Payload = void, Listener extends Function = (payload: Payload) => void> {
private listeners = new Array<Listener>()

const listeners = new Array<Listener>()

function add(fn: Listener) {
listeners.push(fn)
add(fn: Listener) {
this.listeners.push(fn)
}

function remove(fn: Listener) {
const pos = listeners.indexOf(fn, 0)
if (pos > -1) listeners.splice(pos, 1)
remove(fn: Listener) {
const pos = this.listeners.indexOf(fn, 0)
if (pos > -1) this.listeners.splice(pos, 1)
}

function clear() {
listeners.length = 0
clear() {
this.listeners.length = 0
}

function emit(payload: Payload) {
for (const listener of listeners) {
emit(payload: Payload) {
for (const listener of this.listeners) {
listener(payload)
}
}

return { add, remove, clear, emit }
}
14 changes: 11 additions & 3 deletions test/Signal.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ describe("Signal", () => {
it("provides a signal that listeners can be added to which are then called back once the signal is invoked", () => {
let proof = ""

const signal = Signal<string>()
const signal = new Signal<string>()
signal.add((payload) => (proof = payload))
signal.emit("it works")

Expand All @@ -16,7 +16,7 @@ describe("Signal", () => {
let proof = ""
const listener = (payload: string) => (proof = payload)

const signal = Signal<string>()
const signal = new Signal<string>()
signal.add(listener)
signal.emit("it works")
expect(proof).toEqual("it works")
Expand All @@ -32,7 +32,7 @@ describe("Signal", () => {
let proof = ""
const listener = (payload: string) => (proof = payload)

const signal = Signal<string>()
const signal = new Signal<string>()
signal.add(listener)
signal.emit("it works")
expect(proof).toEqual("it works")
Expand All @@ -42,4 +42,12 @@ describe("Signal", () => {
expect(proof).toEqual("it works")
})
})

it("supports signals without payloads", () => {
let count = 0
const signal = new Signal()
signal.add(() => count++)
signal.emit()
expect(count).toEqual(1)
})
})

0 comments on commit 107d328

Please sign in to comment.