-
Notifications
You must be signed in to change notification settings - Fork 110
Expand file tree
/
Copy pathdemo.js
More file actions
125 lines (103 loc) · 2.63 KB
/
demo.js
File metadata and controls
125 lines (103 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
////////////////////////////////
// WebIDL compliant interface //
////////////////////////////////
class Book {
constructor(title, author, genre, pages) {
this.title = title;
this.author = author;
this.genre = genre || null;
this.pages = pages || 0;
}
}
class Library {
constructor(name) {
this.libraryName = name;
this.books = new Map();
}
get totalBooks() {
return this.books.size;
}
addBook(book) {
if (this.books.has(book.title)) {
return false; // Book already exists
}
this.books.set(book.title, book);
return true;
}
removeBook(title) {
return this.books.delete(title);
}
getBookByTitle(title) {
return this.books.get(title) || null;
}
listBooks() {
return Array.from(this.books.values());
}
renameLibrary(newName) {
this.libraryName = newName;
}
asAdvancedLibrary() {
const al = new AdvancedLibrary();
al.libraryName = this.libraryName;
al.books = this.books;
return al;
}
}
class AdvancedLibrary extends Library {
constructor() {
super();
}
asLibrary() {
return new Library("advanced-library");
}
filterBooks(name) {
return Array.from(this.books.values()).filter((book) => {
return (
book.title.toLowerCase().includes(name.toLowerCase()) ||
book.author.toLowerCase().includes(name.toLowerCase())
);
});
}
}
class BookManager {
constructor() {
this._library = null;
}
initLibrary(name) {
const library = new Library(name);
this._library = library;
}
library() {
if (!this._library) {
throw new Error("initLibrary must be called first!");
}
const library = this._library;
this._library = null;
return library;
}
}
// Wire up the implementations above to globalThis
// which will be used by the component implicitly
//
// While somewhat awkward, current jco bindings
// generate a member/namespace for every dash, so:
//
// "global-book-library" => globalThis.book.library
// "global-console" => globalThis.console
globalThis.book = {
library: {
AdvancedLibrary,
Library,
BookManager,
},
};
////////////////////////////////
// Usage of transpiled module //
////////////////////////////////
// NOTE: we use a dynamic import of our transpiled WebAssembly component
// to ensure that globalThis is setup prior to the component logic running
const { librarian } = await import("./dist/transpiled/librarian.js");
let library = librarian.createLocalLibrary();
library = librarian.addFavoriteBook(library);
const [_library, favorites] = librarian.getFavoriteBooks(library);
console.log("Librarian's favorite books:", favorites);