From 8e3ef12b4027d5910dc5bf271b0c1107b7af9f70 Mon Sep 17 00:00:00 2001 From: Trung Phan Date: Mon, 22 Jan 2024 21:55:55 +0700 Subject: [PATCH 1/4] TrungPH: Submit exercise from 1 -> 10 --- TrungPH/ex1.js | 21 +++++++ TrungPH/ex1.ts | 25 ++++++++ TrungPH/ex10.js | 135 ++++++++++++++++++++++++++++++++++++++++++++ TrungPH/ex10.ts | 117 ++++++++++++++++++++++++++++++++++++++ TrungPH/ex2.js | 30 ++++++++++ TrungPH/ex2.ts | 42 ++++++++++++++ TrungPH/ex3.js | 41 ++++++++++++++ TrungPH/ex3.ts | 54 ++++++++++++++++++ TrungPH/ex4.js | 33 +++++++++++ TrungPH/ex4.ts | 49 ++++++++++++++++ TrungPH/ex5.js | 41 ++++++++++++++ TrungPH/ex5.ts | 58 +++++++++++++++++++ TrungPH/ex6.js | 37 ++++++++++++ TrungPH/ex6.ts | 56 ++++++++++++++++++ TrungPH/ex7.js | 74 ++++++++++++++++++++++++ TrungPH/ex7.ts | 96 +++++++++++++++++++++++++++++++ TrungPH/ex8.js | 47 ++++++++++++++++ TrungPH/ex8.ts | 72 ++++++++++++++++++++++++ TrungPH/ex9.js | 93 ++++++++++++++++++++++++++++++ TrungPH/ex9.ts | 147 ++++++++++++++++++++++++++++++++++++++++++++++++ 20 files changed, 1268 insertions(+) create mode 100644 TrungPH/ex1.js create mode 100644 TrungPH/ex1.ts create mode 100644 TrungPH/ex10.js create mode 100644 TrungPH/ex10.ts create mode 100644 TrungPH/ex2.js create mode 100644 TrungPH/ex2.ts create mode 100644 TrungPH/ex3.js create mode 100644 TrungPH/ex3.ts create mode 100644 TrungPH/ex4.js create mode 100644 TrungPH/ex4.ts create mode 100644 TrungPH/ex5.js create mode 100644 TrungPH/ex5.ts create mode 100644 TrungPH/ex6.js create mode 100644 TrungPH/ex6.ts create mode 100644 TrungPH/ex7.js create mode 100644 TrungPH/ex7.ts create mode 100644 TrungPH/ex8.js create mode 100644 TrungPH/ex8.ts create mode 100644 TrungPH/ex9.js create mode 100644 TrungPH/ex9.ts diff --git a/TrungPH/ex1.js b/TrungPH/ex1.js new file mode 100644 index 0000000..c98ca25 --- /dev/null +++ b/TrungPH/ex1.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logPerson = exports.users = void 0; +exports.users = [ + { + name: 'Max Mustermann', + age: 25, + occupation: 'Chimney sweep' + }, + { + name: 'Kate Müller', + age: 23, + occupation: 'Astronaut' + } +]; +function logPerson(user) { + console.log(" - ".concat(user.name, ", ").concat(user.age)); +} +exports.logPerson = logPerson; +console.log('Users:'); +exports.users.forEach(logPerson); diff --git a/TrungPH/ex1.ts b/TrungPH/ex1.ts new file mode 100644 index 0000000..90a6f66 --- /dev/null +++ b/TrungPH/ex1.ts @@ -0,0 +1,25 @@ +interface User { + name: string; + age: number; + occupation: string; +} + +export const users: User[] = [ + { + name: 'Max Mustermann', + age: 25, + occupation: 'Chimney sweep' + }, + { + name: 'Kate Müller', + age: 23, + occupation: 'Astronaut' + } +]; + +export function logPerson(user: User) { + console.log(` - ${user.name}, ${user.age}`); +} + +console.log('Users:'); +users.forEach(logPerson); \ No newline at end of file diff --git a/TrungPH/ex10.js b/TrungPH/ex10.js new file mode 100644 index 0000000..25dc02a --- /dev/null +++ b/TrungPH/ex10.js @@ -0,0 +1,135 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.api = exports.promisify = void 0; +var admins = [ + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } +]; +var users = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' } +]; +function promisify(fn) { + return function () { return new Promise(function (resolve, reject) { + fn(function (response) { + if (response.status === 'success') { + resolve(response.data); + } + else { + reject(new Error(response.error)); + } + }); + }); }; +} +exports.promisify = promisify; +var oldApi = { + requestAdmins: function (callback) { + callback({ + status: 'success', + data: admins + }); + }, + requestUsers: function (callback) { + callback({ + status: 'success', + data: users + }); + }, + requestCurrentServerTime: function (callback) { + callback({ + status: 'success', + data: Date.now() + }); + }, + requestCoffeeMachineQueueLength: function (callback) { + callback({ + status: 'error', + error: 'Numeric value has exceeded Number.MAX_SAFE_INTEGER.' + }); + } +}; +exports.api = { + requestAdmins: promisify(oldApi.requestAdmins), + requestUsers: promisify(oldApi.requestUsers), + requestCurrentServerTime: promisify(oldApi.requestCurrentServerTime), + requestCoffeeMachineQueueLength: promisify(oldApi.requestCoffeeMachineQueueLength) +}; +function logPerson(person) { + console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(person.type === 'admin' ? person.role : person.occupation)); +} +function startTheApp() { + return __awaiter(this, void 0, void 0, function () { + var _a, _b, _c, _d, _e, _f, _g; + return __generator(this, function (_h) { + switch (_h.label) { + case 0: + console.log('Admins:'); + return [4 /*yield*/, exports.api.requestAdmins()]; + case 1: + (_h.sent()).forEach(logPerson); + console.log(); + console.log('Users:'); + return [4 /*yield*/, exports.api.requestUsers()]; + case 2: + (_h.sent()).forEach(logPerson); + console.log(); + console.log('Server time:'); + _b = (_a = console).log; + _c = " ".concat; + _d = Date.bind; + return [4 /*yield*/, exports.api.requestCurrentServerTime()]; + case 3: + _b.apply(_a, [_c.apply(" ", [new (_d.apply(Date, [void 0, _h.sent()]))().toLocaleString()])]); + console.log(); + console.log('Coffee machine queue length:'); + _f = (_e = console).log; + _g = " ".concat; + return [4 /*yield*/, exports.api.requestCoffeeMachineQueueLength()]; + case 4: + _f.apply(_e, [_g.apply(" ", [_h.sent()])]); + return [2 /*return*/]; + } + }); + }); +} +startTheApp().then(function () { + console.log('Success!'); +}, function (e) { + console.log("Error: \"".concat(e.message, "\", but it's fine, sometimes errors are inevitable.")); +}); diff --git a/TrungPH/ex10.ts b/TrungPH/ex10.ts new file mode 100644 index 0000000..22ffe6e --- /dev/null +++ b/TrungPH/ex10.ts @@ -0,0 +1,117 @@ +interface User { + type: 'user'; + name: string; + age: number; + occupation: string; +} + +interface Admin { + type: 'admin'; + name: string; + age: number; + role: string; +} + +type Person = User | Admin; + +const admins: Admin[] = [ + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } +]; + +const users: User[] = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' } +]; + +export type ApiResponse = ( + { + status: 'success'; + data: T; + } | + { + status: 'error'; + error: string; + } +); + +type callbackFunction = (callback: (response: ApiResponse) => void) => void; +type promiseFunction = () => Promise; + +export function promisify(fn: callbackFunction): promiseFunction { + return () => new Promise((resolve, reject) => { + fn((response) => { + if (response.status === 'success') { + resolve(response.data); + } else { + reject(new Error(response.error)); + } + }); + }); +} + +const oldApi = { + requestAdmins(callback: (response: ApiResponse) => void) { + callback({ + status: 'success', + data: admins + }); + }, + requestUsers(callback: (response: ApiResponse) => void) { + callback({ + status: 'success', + data: users + }); + }, + requestCurrentServerTime(callback: (response: ApiResponse) => void) { + callback({ + status: 'success', + data: Date.now() + }); + }, + requestCoffeeMachineQueueLength(callback: (response: ApiResponse) => void) { + callback({ + status: 'error', + error: 'Numeric value has exceeded Number.MAX_SAFE_INTEGER.' + }); + } +}; + +export const api = { + requestAdmins: promisify(oldApi.requestAdmins), + requestUsers: promisify(oldApi.requestUsers), + requestCurrentServerTime: promisify(oldApi.requestCurrentServerTime), + requestCoffeeMachineQueueLength: promisify(oldApi.requestCoffeeMachineQueueLength) +}; + +function logPerson(person: Person) { + console.log( + ` - ${person.name}, ${person.age}, ${person.type === 'admin' ? person.role : person.occupation}` + ); +} + +async function startTheApp() { + console.log('Admins:'); + (await api.requestAdmins()).forEach(logPerson); + console.log(); + + console.log('Users:'); + (await api.requestUsers()).forEach(logPerson); + console.log(); + + console.log('Server time:'); + console.log(` ${new Date(await api.requestCurrentServerTime()).toLocaleString()}`); + console.log(); + + console.log('Coffee machine queue length:'); + console.log(` ${await api.requestCoffeeMachineQueueLength()}`); +} + +startTheApp().then( + () => { + console.log('Success!'); + }, + (e: Error) => { + console.log(`Error: "${e.message}", but it's fine, sometimes errors are inevitable.`); + } +); diff --git a/TrungPH/ex2.js b/TrungPH/ex2.js new file mode 100644 index 0000000..e21a1a8 --- /dev/null +++ b/TrungPH/ex2.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logPerson = exports.persons = void 0; +exports.persons = [ + { + name: 'Max Mustermann', + age: 25, + occupation: 'Chimney sweep' + }, + { + name: 'Jane Doe', + age: 32, + role: 'Administrator' + }, + { + name: 'Kate Müller', + age: 23, + occupation: 'Astronaut' + }, + { + name: 'Bruce Willis', + age: 64, + role: 'World saver' + } +]; +function logPerson(person) { + console.log(" - ".concat(person.name, ", ").concat(person.age)); +} +exports.logPerson = logPerson; +exports.persons.forEach(logPerson); diff --git a/TrungPH/ex2.ts b/TrungPH/ex2.ts new file mode 100644 index 0000000..c0e0852 --- /dev/null +++ b/TrungPH/ex2.ts @@ -0,0 +1,42 @@ +interface User { + name: string; + age: number; + occupation: string; +} + +interface Admin { + name: string; + age: number; + role: string; +} + +export type Person = User | Admin; + +export const persons: Person[] = [ + { + name: 'Max Mustermann', + age: 25, + occupation: 'Chimney sweep' + }, + { + name: 'Jane Doe', + age: 32, + role: 'Administrator' + }, + { + name: 'Kate Müller', + age: 23, + occupation: 'Astronaut' + }, + { + name: 'Bruce Willis', + age: 64, + role: 'World saver' + } +]; + +export function logPerson(person: Person) { + console.log(` - ${person.name}, ${person.age}`); +} + +persons.forEach(logPerson); \ No newline at end of file diff --git a/TrungPH/ex3.js b/TrungPH/ex3.js new file mode 100644 index 0000000..fe5761d --- /dev/null +++ b/TrungPH/ex3.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logPerson = exports.persons = void 0; +exports.persons = [ + { + type: 'user', + name: 'Max Mustermann', + age: 25, + occupation: 'Chimney sweep' + }, + { + type: 'admin', + name: 'Jane Doe', + age: 32, + role: 'Administrator' + }, + { + type: 'user', + name: 'Kate Müller', + age: 23, + occupation: 'Astronaut' + }, + { + type: 'admin', + name: 'Bruce Willis', + age: 64, + role: 'World saver' + } +]; +function logPerson(person) { + var additionalInformation; + if (person.type === 'admin') { + additionalInformation = person.role; + } + else { + additionalInformation = person.occupation; + } + console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(additionalInformation)); +} +exports.logPerson = logPerson; +exports.persons.forEach(logPerson); diff --git a/TrungPH/ex3.ts b/TrungPH/ex3.ts new file mode 100644 index 0000000..65c05f5 --- /dev/null +++ b/TrungPH/ex3.ts @@ -0,0 +1,54 @@ +interface User { + type: 'user'; + name: string; + age: number; + occupation: string; +} + +interface Admin { + type: 'admin'; + name: string; + age: number; + role: string; +} + +export type Person = User | Admin; + +export const persons: Person[] = [ + { + type: 'user', + name: 'Max Mustermann', + age: 25, + occupation: 'Chimney sweep' + }, + { + type: 'admin', + name: 'Jane Doe', + age: 32, + role: 'Administrator' + }, + { + type: 'user', + name: 'Kate Müller', + age: 23, + occupation: 'Astronaut' + }, + { + type: 'admin', + name: 'Bruce Willis', + age: 64, + role: 'World saver' + } +]; + +export function logPerson(person: Person) { + let additionalInformation: string; + if (person.type === 'admin') { + additionalInformation = person.role; + } else { + additionalInformation = person.occupation; + } + console.log(` - ${person.name}, ${person.age}, ${additionalInformation}`); +} + +persons.forEach(logPerson); \ No newline at end of file diff --git a/TrungPH/ex4.js b/TrungPH/ex4.js new file mode 100644 index 0000000..2e531de --- /dev/null +++ b/TrungPH/ex4.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logPerson = exports.isUser = exports.isAdmin = exports.persons = void 0; +exports.persons = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } +]; +function isAdmin(person) { + return person.type === 'admin'; +} +exports.isAdmin = isAdmin; +function isUser(person) { + return person.type === 'user'; +} +exports.isUser = isUser; +function logPerson(person) { + var additionalInformation = ''; + if (isAdmin(person)) { + additionalInformation = person.role; + } + if (isUser(person)) { + additionalInformation = person.occupation; + } + console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(additionalInformation)); +} +exports.logPerson = logPerson; +console.log('Admins:'); +exports.persons.filter(isAdmin).forEach(logPerson); +console.log(); +console.log('Users:'); +exports.persons.filter(isUser).forEach(logPerson); diff --git a/TrungPH/ex4.ts b/TrungPH/ex4.ts new file mode 100644 index 0000000..a208707 --- /dev/null +++ b/TrungPH/ex4.ts @@ -0,0 +1,49 @@ +interface User { + type: 'user'; + name: string; + age: number; + occupation: string; +} + +interface Admin { + type: 'admin'; + name: string; + age: number; + role: string; +} + +export type Person = User | Admin; + +export const persons: Person[] = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } +]; + +export function isAdmin(person: Person) { + return person.type === 'admin'; +} + +export function isUser(person: Person) { + return person.type === 'user'; +} + +export function logPerson(person: Person) { + let additionalInformation: string = ''; + if (isAdmin(person)) { + additionalInformation = (person as Admin).role; + } + if (isUser(person)) { + additionalInformation = (person as User).occupation; + } + console.log(` - ${person.name}, ${person.age}, ${additionalInformation}`); +} + +console.log('Admins:'); +persons.filter(isAdmin).forEach(logPerson); + +console.log(); + +console.log('Users:'); +persons.filter(isUser).forEach(logPerson); \ No newline at end of file diff --git a/TrungPH/ex5.js b/TrungPH/ex5.js new file mode 100644 index 0000000..96f8c3d --- /dev/null +++ b/TrungPH/ex5.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.filterUsers = exports.logPerson = exports.isUser = exports.isAdmin = exports.persons = void 0; +exports.persons = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, + { type: 'user', name: 'Wilson', age: 23, occupation: 'Ball' }, + { type: 'admin', name: 'Agent Smith', age: 23, role: 'Administrator' } +]; +var isAdmin = function (person) { return person.type === 'admin'; }; +exports.isAdmin = isAdmin; +var isUser = function (person) { return person.type === 'user'; }; +exports.isUser = isUser; +function logPerson(person) { + var additionalInformation = ''; + if ((0, exports.isAdmin)(person)) { + additionalInformation = person.role; + } + if ((0, exports.isUser)(person)) { + additionalInformation = person.occupation; + } + console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(additionalInformation)); +} +exports.logPerson = logPerson; +function filterUsers(persons, criteria) { + if (!criteria) + return persons.filter(exports.isUser); // return all users if no criteria is specified + return persons.filter(exports.isUser).filter(function (user) { + var criteriaKeys = Object.keys(criteria); + return criteriaKeys.every(function (fieldName) { + return user[fieldName] === criteria[fieldName]; + }); + }); +} +exports.filterUsers = filterUsers; +console.log('Users of age 23:'); +filterUsers(exports.persons, { + age: 23 +}).forEach(logPerson); diff --git a/TrungPH/ex5.ts b/TrungPH/ex5.ts new file mode 100644 index 0000000..a418a01 --- /dev/null +++ b/TrungPH/ex5.ts @@ -0,0 +1,58 @@ +interface User { + type: 'user'; + name: string; + age: number; + occupation: string; +} + +interface Admin { + type: 'admin'; + name: string; + age: number; + role: string; +} + +export type Person = User | Admin; + +export const persons: Person[] = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, + { type: 'user', name: 'Wilson', age: 23, occupation: 'Ball' }, + { type: 'admin', name: 'Agent Smith', age: 23, role: 'Administrator' } +]; + +export const isAdmin = (person: Person): person is Admin => person.type === 'admin'; +export const isUser = (person: Person): person is User => person.type === 'user'; + +export function logPerson(person: Person) { + let additionalInformation = ''; + if (isAdmin(person)) { + additionalInformation = person.role; + } + if (isUser(person)) { + additionalInformation = person.occupation; + } + console.log(` - ${person.name}, ${person.age}, ${additionalInformation}`); +} + +export function filterUsers(persons: Person[], criteria?: Partial): User[] { + if (!criteria) return persons.filter(isUser); // return all users if no criteria is specified + + return persons.filter(isUser).filter((user) => { + const criteriaKeys = Object.keys(criteria) as (keyof User)[]; + return criteriaKeys.every((fieldName) => { + return user[fieldName] === criteria[fieldName]; + }); + }); +} + +console.log('Users of age 23:'); + +filterUsers( + persons, + { + age: 23 + } +).forEach(logPerson); \ No newline at end of file diff --git a/TrungPH/ex6.js b/TrungPH/ex6.js new file mode 100644 index 0000000..fd7cdbc --- /dev/null +++ b/TrungPH/ex6.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.adminsOfAge23 = exports.usersOfAge23 = exports.filterPersons = exports.getObjKeys = exports.logPerson = exports.persons = void 0; +exports.persons = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, + { type: 'user', name: 'Wilson', age: 23, occupation: 'Ball' }, + { type: 'admin', name: 'Agent Smith', age: 23, role: 'Anti-virus engineer' } +]; +function logPerson(person) { + console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(person.type === 'admin' ? person.role : person.occupation)); +} +exports.logPerson = logPerson; +function getObjKeys(obj) { + return Object.keys(obj); +} +exports.getObjKeys = getObjKeys; +function filterPersons(persons, personType, criteria) { + return persons + .filter(function (person) { return person.type === personType; }) + .filter(function (person) { + var criteriaKeys = getObjKeys(criteria); + return criteriaKeys.every(function (fieldName) { + return person[fieldName] === criteria[fieldName]; + }); + }); +} +exports.filterPersons = filterPersons; +exports.usersOfAge23 = filterPersons(exports.persons, 'user', { age: 23 }); +exports.adminsOfAge23 = filterPersons(exports.persons, 'admin', { age: 23 }); +console.log('Users of age 23:'); +exports.usersOfAge23.forEach(logPerson); +console.log(); +console.log('Admins of age 23:'); +exports.adminsOfAge23.forEach(logPerson); diff --git a/TrungPH/ex6.ts b/TrungPH/ex6.ts new file mode 100644 index 0000000..67d0e4d --- /dev/null +++ b/TrungPH/ex6.ts @@ -0,0 +1,56 @@ +interface User { + type: 'user'; + name: string; + age: number; + occupation: string; +} + +interface Admin { + type: 'admin'; + name: string; + age: number; + role: string; +} + +export type Person = User | Admin; + +export const persons: Person[] = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, + { type: 'user', name: 'Wilson', age: 23, occupation: 'Ball' }, + { type: 'admin', name: 'Agent Smith', age: 23, role: 'Anti-virus engineer' } +]; + +export function logPerson(person: Person) { + console.log( + ` - ${person.name}, ${person.age}, ${person.type === 'admin' ? person.role : person.occupation}` + ); +} + +export function getObjKeys(obj: T): (keyof T)[] { + return Object.keys(obj) as (keyof T)[]; +} + +export function filterPersons(persons: Person[], personType: string, criteria: Partial): Person[] { + return persons + .filter((person) => person.type === personType) + .filter((person) => { + let criteriaKeys = getObjKeys(criteria) as (keyof Person)[]; + return criteriaKeys.every((fieldName) => { + return person[fieldName] === criteria[fieldName]; + }); + }); +} + +export const usersOfAge23 = filterPersons(persons, 'user', { age: 23 }); +export const adminsOfAge23 = filterPersons(persons, 'admin', { age: 23 }); + +console.log('Users of age 23:'); +usersOfAge23.forEach(logPerson); + +console.log(); + +console.log('Admins of age 23:'); +adminsOfAge23.forEach(logPerson); \ No newline at end of file diff --git a/TrungPH/ex7.js b/TrungPH/ex7.js new file mode 100644 index 0000000..08d21c3 --- /dev/null +++ b/TrungPH/ex7.js @@ -0,0 +1,74 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.swap = void 0; +function logUser(user) { + var pos = users.indexOf(user) + 1; + console.log(" - #".concat(pos, " User: ").concat(user.name, ", ").concat(user.age, ", ").concat(user.occupation)); +} +function logAdmin(admin) { + var pos = admins.indexOf(admin) + 1; + console.log(" - #".concat(pos, " Admin: ").concat(admin.name, ", ").concat(admin.age, ", ").concat(admin.role)); +} +var admins = [ + { + type: 'admin', + name: 'Will Bruces', + age: 30, + role: 'Overseer' + }, + { + type: 'admin', + name: 'Steve', + age: 40, + role: 'Steve' + } +]; +var users = [ + { + type: 'user', + name: 'Moses', + age: 70, + occupation: 'Desert guide' + }, + { + type: 'user', + name: 'Superman', + age: 28, + occupation: 'Ordinary person' + } +]; +function swap(v1, v2) { + return [v2, v1]; +} +exports.swap = swap; +function test1() { + console.log('test1:'); + var _a = swap(admins[0], users[1]), secondUser = _a[0], firstAdmin = _a[1]; + logUser(secondUser); + logAdmin(firstAdmin); +} +function test2() { + console.log('test2:'); + var _a = swap(users[0], admins[1]), secondAdmin = _a[0], firstUser = _a[1]; + logAdmin(secondAdmin); + logUser(firstUser); +} +function test3() { + console.log('test3:'); + var _a = swap(users[0], users[1]), secondUser = _a[0], firstUser = _a[1]; + logUser(secondUser); + logUser(firstUser); +} +function test4() { + console.log('test4:'); + var _a = swap(admins[1], admins[0]), firstAdmin = _a[0], secondAdmin = _a[1]; + logAdmin(firstAdmin); + logAdmin(secondAdmin); +} +function test5() { + console.log('test5:'); + var _a = swap(123, 'Hello World'), stringValue = _a[0], numericValue = _a[1]; + console.log(" - String: ".concat(stringValue)); + console.log(" - Numeric: ".concat(numericValue)); +} +[test1, test2, test3, test4, test5].forEach(function (test) { return test(); }); diff --git a/TrungPH/ex7.ts b/TrungPH/ex7.ts new file mode 100644 index 0000000..9fb334b --- /dev/null +++ b/TrungPH/ex7.ts @@ -0,0 +1,96 @@ +interface User { + type: 'user'; + name: string; + age: number; + occupation: string; +} + +interface Admin { + type: 'admin'; + name: string; + age: number; + role: string; +} + +export type Person = User | Admin; + +function logUser(user: User) { + const pos = users.indexOf(user) + 1; + console.log(` - #${pos} User: ${user.name}, ${user.age}, ${user.occupation}`); +} + +function logAdmin(admin: Admin) { + const pos = admins.indexOf(admin) + 1; + console.log(` - #${pos} Admin: ${admin.name}, ${admin.age}, ${admin.role}`); +} + +const admins: Admin[] = [ + { + type: 'admin', + name: 'Will Bruces', + age: 30, + role: 'Overseer' + }, + { + type: 'admin', + name: 'Steve', + age: 40, + role: 'Steve' + } +]; + +const users: User[] = [ + { + type: 'user', + name: 'Moses', + age: 70, + occupation: 'Desert guide' + }, + { + type: 'user', + name: 'Superman', + age: 28, + occupation: 'Ordinary person' + } +]; + +export function swap(v1: Input1, v2: Input2): [Input2, Input1] { + return [v2, v1]; +} + +function test1() { + console.log('test1:'); + const [secondUser, firstAdmin] = swap(admins[0], users[1]); + logUser(secondUser); + logAdmin(firstAdmin); +} + +function test2() { + console.log('test2:'); + const [secondAdmin, firstUser] = swap(users[0], admins[1]); + logAdmin(secondAdmin); + logUser(firstUser); +} + +function test3() { + console.log('test3:'); + const [secondUser, firstUser] = swap(users[0], users[1]); + logUser(secondUser); + logUser(firstUser); +} + +function test4() { + console.log('test4:'); + const [firstAdmin, secondAdmin] = swap(admins[1], admins[0]); + logAdmin(firstAdmin); + logAdmin(secondAdmin); +} + +function test5() { + console.log('test5:'); + const [stringValue, numericValue] = swap(123, 'Hello World'); + console.log(` - String: ${stringValue}`); + console.log(` - Numeric: ${numericValue}`); +} + +[test1, test2, test3, test4, test5].forEach((test) => test()); diff --git a/TrungPH/ex8.js b/TrungPH/ex8.js new file mode 100644 index 0000000..b1b9418 --- /dev/null +++ b/TrungPH/ex8.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logPerson = exports.persons = void 0; +exports.persons = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, + { + type: 'powerUser', + name: 'Nikki Stone', + age: 45, + role: 'Moderator', + occupation: 'Cat groomer' + } +]; +function isAdmin(person) { + return person.type === 'admin'; +} +function isUser(person) { + return person.type === 'user'; +} +function isPowerUser(person) { + return person.type === 'powerUser'; +} +function logPerson(person) { + var additionalInformation = ''; + if (isAdmin(person)) { + additionalInformation = person.role; + } + if (isUser(person)) { + additionalInformation = person.occupation; + } + if (isPowerUser(person)) { + additionalInformation = "".concat(person.role, ", ").concat(person.occupation); + } + console.log("".concat(person.name, ", ").concat(person.age, ", ").concat(additionalInformation)); +} +exports.logPerson = logPerson; +console.log('Admins:'); +exports.persons.filter(isAdmin).forEach(logPerson); +console.log(); +console.log('Users:'); +exports.persons.filter(isUser).forEach(logPerson); +console.log(); +console.log('Power users:'); +exports.persons.filter(isPowerUser).forEach(logPerson); diff --git a/TrungPH/ex8.ts b/TrungPH/ex8.ts new file mode 100644 index 0000000..cc2b07d --- /dev/null +++ b/TrungPH/ex8.ts @@ -0,0 +1,72 @@ +interface User { + type: 'user'; + name: string; + age: number; + occupation: string; +} + +interface Admin { + type: 'admin'; + name: string; + age: number; + role: string; +} + +type PowerUser = Omit & Omit & { + type: 'powerUser'; +}; + +export type Person = User | Admin | PowerUser; + +export const persons: Person[] = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, + { + type: 'powerUser', + name: 'Nikki Stone', + age: 45, + role: 'Moderator', + occupation: 'Cat groomer' + } +]; + +function isAdmin(person: Person): person is Admin { + return person.type === 'admin'; +} + +function isUser(person: Person): person is User { + return person.type === 'user'; +} + +function isPowerUser(person: Person): person is PowerUser { + return person.type === 'powerUser'; +} + +export function logPerson(person: Person) { + let additionalInformation: string = ''; + if (isAdmin(person)) { + additionalInformation = person.role; + } + if (isUser(person)) { + additionalInformation = person.occupation; + } + if (isPowerUser(person)) { + additionalInformation = `${person.role}, ${person.occupation}`; + } + console.log(`${person.name}, ${person.age}, ${additionalInformation}`); +} + +console.log('Admins:'); +persons.filter(isAdmin).forEach(logPerson); + +console.log(); + +console.log('Users:'); +persons.filter(isUser).forEach(logPerson); + +console.log(); + +console.log('Power users:'); +persons.filter(isPowerUser).forEach(logPerson); diff --git a/TrungPH/ex9.js b/TrungPH/ex9.js new file mode 100644 index 0000000..bdb1181 --- /dev/null +++ b/TrungPH/ex9.js @@ -0,0 +1,93 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.requestCoffeeMachineQueueLength = exports.requestCurrentServerTime = exports.requestUsers = exports.requestAdmins = void 0; +var admins = [ + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } +]; +var users = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' } +]; +function requestAdmins(callback) { + callback({ + status: 'success', + data: admins + }); +} +exports.requestAdmins = requestAdmins; +function requestUsers(callback) { + callback({ + status: 'success', + data: users + }); +} +exports.requestUsers = requestUsers; +function requestCurrentServerTime(callback) { + callback({ + status: 'success', + data: Date.now() + }); +} +exports.requestCurrentServerTime = requestCurrentServerTime; +function requestCoffeeMachineQueueLength(callback) { + callback({ + status: 'error', + error: 'Numeric value has exceeded Number.MAX_SAFE_INTEGER.' + }); +} +exports.requestCoffeeMachineQueueLength = requestCoffeeMachineQueueLength; +function logPerson(person) { + console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(person.type === 'admin' ? person.role : person.occupation)); +} +function startTheApp(callback) { + requestAdmins(function (adminsResponse) { + console.log('Admins:'); + if (adminsResponse.status === 'success') { + adminsResponse.data.forEach(logPerson); + } + else { + return callback(new Error(adminsResponse.error)); + } + console.log(); + requestUsers(function (usersResponse) { + console.log('Users:'); + if (usersResponse.status === 'success') { + usersResponse.data.forEach(logPerson); + } + else { + return callback(new Error(usersResponse.error)); + } + console.log(); + requestCurrentServerTime(function (serverTimeResponse) { + console.log('Server time:'); + if (serverTimeResponse.status === 'success') { + console.log(" ".concat(new Date(serverTimeResponse.data).toLocaleString())); + } + else { + return callback(new Error(serverTimeResponse.error)); + } + console.log(); + requestCoffeeMachineQueueLength(function (coffeeMachineQueueLengthResponse) { + console.log('Coffee machine queue length:'); + if (coffeeMachineQueueLengthResponse.status === 'success') { + console.log(" ".concat(coffeeMachineQueueLengthResponse.data)); + } + else { + return callback(new Error(coffeeMachineQueueLengthResponse.error)); + } + callback(null); + }); + }); + }); + }); +} +startTheApp(function (e) { + console.log(); + if (e) { + console.log("Error: \"".concat(e.message, "\", but it's fine, sometimes errors are inevitable.")); + } + else { + console.log('Success!'); + } +}); diff --git a/TrungPH/ex9.ts b/TrungPH/ex9.ts new file mode 100644 index 0000000..aa8d163 --- /dev/null +++ b/TrungPH/ex9.ts @@ -0,0 +1,147 @@ +interface User { + type: 'user'; + name: string; + age: number; + occupation: string; +} + +interface Admin { + type: 'admin'; + name: string; + age: number; + role: string; +} + +type Person = User | Admin; + +const admins: Admin[] = [ + { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, + { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } +]; + +const users: User[] = [ + { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, + { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' } +]; + +export type ApiResponse = ( + { + status: 'success'; + data: T; + } | + { + status: 'error'; + error: string; + } +); + +type AdminsApiResponse = ( + { + status: 'success'; + data: Admin[]; + } | + { + status: 'error'; + error: string; + } +); + +export function requestAdmins(callback: (response: AdminsApiResponse) => void) { + callback({ + status: 'success', + data: admins + }); +} + +type UsersApiResponse = ( + { + status: 'success'; + data: User[]; + } | + { + status: 'error'; + error: string; + } +); + +export function requestUsers(callback: (response: UsersApiResponse) => void) { + callback({ + status: 'success', + data: users + }); +} + +export function requestCurrentServerTime(callback: (response: ApiResponse) => void) { + callback({ + status: 'success', + data: Date.now() + }); +} + +export function requestCoffeeMachineQueueLength(callback: (response: ApiResponse) => void) { + callback({ + status: 'error', + error: 'Numeric value has exceeded Number.MAX_SAFE_INTEGER.' + }); +} + +function logPerson(person: Person) { + console.log( + ` - ${person.name}, ${person.age}, ${person.type === 'admin' ? person.role : person.occupation}` + ); +} + +function startTheApp(callback: (error: Error | null) => void) { + requestAdmins((adminsResponse) => { + console.log('Admins:'); + if (adminsResponse.status === 'success') { + adminsResponse.data.forEach(logPerson); + } else { + return callback(new Error(adminsResponse.error)); + } + + console.log(); + + requestUsers((usersResponse) => { + console.log('Users:'); + if (usersResponse.status === 'success') { + usersResponse.data.forEach(logPerson); + } else { + return callback(new Error(usersResponse.error)); + } + + console.log(); + + requestCurrentServerTime((serverTimeResponse) => { + console.log('Server time:'); + if (serverTimeResponse.status === 'success') { + console.log(` ${new Date(serverTimeResponse.data).toLocaleString()}`); + } else { + return callback(new Error(serverTimeResponse.error)); + } + + console.log(); + + requestCoffeeMachineQueueLength((coffeeMachineQueueLengthResponse) => { + console.log('Coffee machine queue length:'); + if (coffeeMachineQueueLengthResponse.status === 'success') { + console.log(` ${coffeeMachineQueueLengthResponse.data}`); + } else { + return callback(new Error(coffeeMachineQueueLengthResponse.error)); + } + + callback(null); + }); + }); + }); + }); +} + +startTheApp((e: Error | null) => { + console.log(); + if (e) { + console.log(`Error: "${e.message}", but it's fine, sometimes errors are inevitable.`) + } else { + console.log('Success!'); + } +}); \ No newline at end of file From 4a00c9934cf304ac8430dfd5a8e5fbc5ab500ff8 Mon Sep 17 00:00:00 2001 From: Trung Phan Date: Tue, 23 Jan 2024 21:43:11 +0700 Subject: [PATCH 2/4] Submit exercise 1 - 10 --- TrungPH/ex1.js | 21 -------- TrungPH/ex10.js | 135 ------------------------------------------------ TrungPH/ex2.js | 30 ----------- TrungPH/ex3.js | 41 --------------- TrungPH/ex4.js | 33 ------------ TrungPH/ex5.js | 41 --------------- TrungPH/ex6.js | 37 ------------- TrungPH/ex7.js | 74 -------------------------- TrungPH/ex8.js | 47 ----------------- TrungPH/ex9.js | 93 --------------------------------- 10 files changed, 552 deletions(-) delete mode 100644 TrungPH/ex1.js delete mode 100644 TrungPH/ex10.js delete mode 100644 TrungPH/ex2.js delete mode 100644 TrungPH/ex3.js delete mode 100644 TrungPH/ex4.js delete mode 100644 TrungPH/ex5.js delete mode 100644 TrungPH/ex6.js delete mode 100644 TrungPH/ex7.js delete mode 100644 TrungPH/ex8.js delete mode 100644 TrungPH/ex9.js diff --git a/TrungPH/ex1.js b/TrungPH/ex1.js deleted file mode 100644 index c98ca25..0000000 --- a/TrungPH/ex1.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.logPerson = exports.users = void 0; -exports.users = [ - { - name: 'Max Mustermann', - age: 25, - occupation: 'Chimney sweep' - }, - { - name: 'Kate Müller', - age: 23, - occupation: 'Astronaut' - } -]; -function logPerson(user) { - console.log(" - ".concat(user.name, ", ").concat(user.age)); -} -exports.logPerson = logPerson; -console.log('Users:'); -exports.users.forEach(logPerson); diff --git a/TrungPH/ex10.js b/TrungPH/ex10.js deleted file mode 100644 index 25dc02a..0000000 --- a/TrungPH/ex10.js +++ /dev/null @@ -1,135 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.api = exports.promisify = void 0; -var admins = [ - { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, - { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } -]; -var users = [ - { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, - { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' } -]; -function promisify(fn) { - return function () { return new Promise(function (resolve, reject) { - fn(function (response) { - if (response.status === 'success') { - resolve(response.data); - } - else { - reject(new Error(response.error)); - } - }); - }); }; -} -exports.promisify = promisify; -var oldApi = { - requestAdmins: function (callback) { - callback({ - status: 'success', - data: admins - }); - }, - requestUsers: function (callback) { - callback({ - status: 'success', - data: users - }); - }, - requestCurrentServerTime: function (callback) { - callback({ - status: 'success', - data: Date.now() - }); - }, - requestCoffeeMachineQueueLength: function (callback) { - callback({ - status: 'error', - error: 'Numeric value has exceeded Number.MAX_SAFE_INTEGER.' - }); - } -}; -exports.api = { - requestAdmins: promisify(oldApi.requestAdmins), - requestUsers: promisify(oldApi.requestUsers), - requestCurrentServerTime: promisify(oldApi.requestCurrentServerTime), - requestCoffeeMachineQueueLength: promisify(oldApi.requestCoffeeMachineQueueLength) -}; -function logPerson(person) { - console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(person.type === 'admin' ? person.role : person.occupation)); -} -function startTheApp() { - return __awaiter(this, void 0, void 0, function () { - var _a, _b, _c, _d, _e, _f, _g; - return __generator(this, function (_h) { - switch (_h.label) { - case 0: - console.log('Admins:'); - return [4 /*yield*/, exports.api.requestAdmins()]; - case 1: - (_h.sent()).forEach(logPerson); - console.log(); - console.log('Users:'); - return [4 /*yield*/, exports.api.requestUsers()]; - case 2: - (_h.sent()).forEach(logPerson); - console.log(); - console.log('Server time:'); - _b = (_a = console).log; - _c = " ".concat; - _d = Date.bind; - return [4 /*yield*/, exports.api.requestCurrentServerTime()]; - case 3: - _b.apply(_a, [_c.apply(" ", [new (_d.apply(Date, [void 0, _h.sent()]))().toLocaleString()])]); - console.log(); - console.log('Coffee machine queue length:'); - _f = (_e = console).log; - _g = " ".concat; - return [4 /*yield*/, exports.api.requestCoffeeMachineQueueLength()]; - case 4: - _f.apply(_e, [_g.apply(" ", [_h.sent()])]); - return [2 /*return*/]; - } - }); - }); -} -startTheApp().then(function () { - console.log('Success!'); -}, function (e) { - console.log("Error: \"".concat(e.message, "\", but it's fine, sometimes errors are inevitable.")); -}); diff --git a/TrungPH/ex2.js b/TrungPH/ex2.js deleted file mode 100644 index e21a1a8..0000000 --- a/TrungPH/ex2.js +++ /dev/null @@ -1,30 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.logPerson = exports.persons = void 0; -exports.persons = [ - { - name: 'Max Mustermann', - age: 25, - occupation: 'Chimney sweep' - }, - { - name: 'Jane Doe', - age: 32, - role: 'Administrator' - }, - { - name: 'Kate Müller', - age: 23, - occupation: 'Astronaut' - }, - { - name: 'Bruce Willis', - age: 64, - role: 'World saver' - } -]; -function logPerson(person) { - console.log(" - ".concat(person.name, ", ").concat(person.age)); -} -exports.logPerson = logPerson; -exports.persons.forEach(logPerson); diff --git a/TrungPH/ex3.js b/TrungPH/ex3.js deleted file mode 100644 index fe5761d..0000000 --- a/TrungPH/ex3.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.logPerson = exports.persons = void 0; -exports.persons = [ - { - type: 'user', - name: 'Max Mustermann', - age: 25, - occupation: 'Chimney sweep' - }, - { - type: 'admin', - name: 'Jane Doe', - age: 32, - role: 'Administrator' - }, - { - type: 'user', - name: 'Kate Müller', - age: 23, - occupation: 'Astronaut' - }, - { - type: 'admin', - name: 'Bruce Willis', - age: 64, - role: 'World saver' - } -]; -function logPerson(person) { - var additionalInformation; - if (person.type === 'admin') { - additionalInformation = person.role; - } - else { - additionalInformation = person.occupation; - } - console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(additionalInformation)); -} -exports.logPerson = logPerson; -exports.persons.forEach(logPerson); diff --git a/TrungPH/ex4.js b/TrungPH/ex4.js deleted file mode 100644 index 2e531de..0000000 --- a/TrungPH/ex4.js +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.logPerson = exports.isUser = exports.isAdmin = exports.persons = void 0; -exports.persons = [ - { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, - { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, - { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, - { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } -]; -function isAdmin(person) { - return person.type === 'admin'; -} -exports.isAdmin = isAdmin; -function isUser(person) { - return person.type === 'user'; -} -exports.isUser = isUser; -function logPerson(person) { - var additionalInformation = ''; - if (isAdmin(person)) { - additionalInformation = person.role; - } - if (isUser(person)) { - additionalInformation = person.occupation; - } - console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(additionalInformation)); -} -exports.logPerson = logPerson; -console.log('Admins:'); -exports.persons.filter(isAdmin).forEach(logPerson); -console.log(); -console.log('Users:'); -exports.persons.filter(isUser).forEach(logPerson); diff --git a/TrungPH/ex5.js b/TrungPH/ex5.js deleted file mode 100644 index 96f8c3d..0000000 --- a/TrungPH/ex5.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.filterUsers = exports.logPerson = exports.isUser = exports.isAdmin = exports.persons = void 0; -exports.persons = [ - { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, - { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, - { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, - { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, - { type: 'user', name: 'Wilson', age: 23, occupation: 'Ball' }, - { type: 'admin', name: 'Agent Smith', age: 23, role: 'Administrator' } -]; -var isAdmin = function (person) { return person.type === 'admin'; }; -exports.isAdmin = isAdmin; -var isUser = function (person) { return person.type === 'user'; }; -exports.isUser = isUser; -function logPerson(person) { - var additionalInformation = ''; - if ((0, exports.isAdmin)(person)) { - additionalInformation = person.role; - } - if ((0, exports.isUser)(person)) { - additionalInformation = person.occupation; - } - console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(additionalInformation)); -} -exports.logPerson = logPerson; -function filterUsers(persons, criteria) { - if (!criteria) - return persons.filter(exports.isUser); // return all users if no criteria is specified - return persons.filter(exports.isUser).filter(function (user) { - var criteriaKeys = Object.keys(criteria); - return criteriaKeys.every(function (fieldName) { - return user[fieldName] === criteria[fieldName]; - }); - }); -} -exports.filterUsers = filterUsers; -console.log('Users of age 23:'); -filterUsers(exports.persons, { - age: 23 -}).forEach(logPerson); diff --git a/TrungPH/ex6.js b/TrungPH/ex6.js deleted file mode 100644 index fd7cdbc..0000000 --- a/TrungPH/ex6.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.adminsOfAge23 = exports.usersOfAge23 = exports.filterPersons = exports.getObjKeys = exports.logPerson = exports.persons = void 0; -exports.persons = [ - { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, - { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, - { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, - { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, - { type: 'user', name: 'Wilson', age: 23, occupation: 'Ball' }, - { type: 'admin', name: 'Agent Smith', age: 23, role: 'Anti-virus engineer' } -]; -function logPerson(person) { - console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(person.type === 'admin' ? person.role : person.occupation)); -} -exports.logPerson = logPerson; -function getObjKeys(obj) { - return Object.keys(obj); -} -exports.getObjKeys = getObjKeys; -function filterPersons(persons, personType, criteria) { - return persons - .filter(function (person) { return person.type === personType; }) - .filter(function (person) { - var criteriaKeys = getObjKeys(criteria); - return criteriaKeys.every(function (fieldName) { - return person[fieldName] === criteria[fieldName]; - }); - }); -} -exports.filterPersons = filterPersons; -exports.usersOfAge23 = filterPersons(exports.persons, 'user', { age: 23 }); -exports.adminsOfAge23 = filterPersons(exports.persons, 'admin', { age: 23 }); -console.log('Users of age 23:'); -exports.usersOfAge23.forEach(logPerson); -console.log(); -console.log('Admins of age 23:'); -exports.adminsOfAge23.forEach(logPerson); diff --git a/TrungPH/ex7.js b/TrungPH/ex7.js deleted file mode 100644 index 08d21c3..0000000 --- a/TrungPH/ex7.js +++ /dev/null @@ -1,74 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.swap = void 0; -function logUser(user) { - var pos = users.indexOf(user) + 1; - console.log(" - #".concat(pos, " User: ").concat(user.name, ", ").concat(user.age, ", ").concat(user.occupation)); -} -function logAdmin(admin) { - var pos = admins.indexOf(admin) + 1; - console.log(" - #".concat(pos, " Admin: ").concat(admin.name, ", ").concat(admin.age, ", ").concat(admin.role)); -} -var admins = [ - { - type: 'admin', - name: 'Will Bruces', - age: 30, - role: 'Overseer' - }, - { - type: 'admin', - name: 'Steve', - age: 40, - role: 'Steve' - } -]; -var users = [ - { - type: 'user', - name: 'Moses', - age: 70, - occupation: 'Desert guide' - }, - { - type: 'user', - name: 'Superman', - age: 28, - occupation: 'Ordinary person' - } -]; -function swap(v1, v2) { - return [v2, v1]; -} -exports.swap = swap; -function test1() { - console.log('test1:'); - var _a = swap(admins[0], users[1]), secondUser = _a[0], firstAdmin = _a[1]; - logUser(secondUser); - logAdmin(firstAdmin); -} -function test2() { - console.log('test2:'); - var _a = swap(users[0], admins[1]), secondAdmin = _a[0], firstUser = _a[1]; - logAdmin(secondAdmin); - logUser(firstUser); -} -function test3() { - console.log('test3:'); - var _a = swap(users[0], users[1]), secondUser = _a[0], firstUser = _a[1]; - logUser(secondUser); - logUser(firstUser); -} -function test4() { - console.log('test4:'); - var _a = swap(admins[1], admins[0]), firstAdmin = _a[0], secondAdmin = _a[1]; - logAdmin(firstAdmin); - logAdmin(secondAdmin); -} -function test5() { - console.log('test5:'); - var _a = swap(123, 'Hello World'), stringValue = _a[0], numericValue = _a[1]; - console.log(" - String: ".concat(stringValue)); - console.log(" - Numeric: ".concat(numericValue)); -} -[test1, test2, test3, test4, test5].forEach(function (test) { return test(); }); diff --git a/TrungPH/ex8.js b/TrungPH/ex8.js deleted file mode 100644 index b1b9418..0000000 --- a/TrungPH/ex8.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.logPerson = exports.persons = void 0; -exports.persons = [ - { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, - { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, - { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' }, - { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' }, - { - type: 'powerUser', - name: 'Nikki Stone', - age: 45, - role: 'Moderator', - occupation: 'Cat groomer' - } -]; -function isAdmin(person) { - return person.type === 'admin'; -} -function isUser(person) { - return person.type === 'user'; -} -function isPowerUser(person) { - return person.type === 'powerUser'; -} -function logPerson(person) { - var additionalInformation = ''; - if (isAdmin(person)) { - additionalInformation = person.role; - } - if (isUser(person)) { - additionalInformation = person.occupation; - } - if (isPowerUser(person)) { - additionalInformation = "".concat(person.role, ", ").concat(person.occupation); - } - console.log("".concat(person.name, ", ").concat(person.age, ", ").concat(additionalInformation)); -} -exports.logPerson = logPerson; -console.log('Admins:'); -exports.persons.filter(isAdmin).forEach(logPerson); -console.log(); -console.log('Users:'); -exports.persons.filter(isUser).forEach(logPerson); -console.log(); -console.log('Power users:'); -exports.persons.filter(isPowerUser).forEach(logPerson); diff --git a/TrungPH/ex9.js b/TrungPH/ex9.js deleted file mode 100644 index bdb1181..0000000 --- a/TrungPH/ex9.js +++ /dev/null @@ -1,93 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.requestCoffeeMachineQueueLength = exports.requestCurrentServerTime = exports.requestUsers = exports.requestAdmins = void 0; -var admins = [ - { type: 'admin', name: 'Jane Doe', age: 32, role: 'Administrator' }, - { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } -]; -var users = [ - { type: 'user', name: 'Max Mustermann', age: 25, occupation: 'Chimney sweep' }, - { type: 'user', name: 'Kate Müller', age: 23, occupation: 'Astronaut' } -]; -function requestAdmins(callback) { - callback({ - status: 'success', - data: admins - }); -} -exports.requestAdmins = requestAdmins; -function requestUsers(callback) { - callback({ - status: 'success', - data: users - }); -} -exports.requestUsers = requestUsers; -function requestCurrentServerTime(callback) { - callback({ - status: 'success', - data: Date.now() - }); -} -exports.requestCurrentServerTime = requestCurrentServerTime; -function requestCoffeeMachineQueueLength(callback) { - callback({ - status: 'error', - error: 'Numeric value has exceeded Number.MAX_SAFE_INTEGER.' - }); -} -exports.requestCoffeeMachineQueueLength = requestCoffeeMachineQueueLength; -function logPerson(person) { - console.log(" - ".concat(person.name, ", ").concat(person.age, ", ").concat(person.type === 'admin' ? person.role : person.occupation)); -} -function startTheApp(callback) { - requestAdmins(function (adminsResponse) { - console.log('Admins:'); - if (adminsResponse.status === 'success') { - adminsResponse.data.forEach(logPerson); - } - else { - return callback(new Error(adminsResponse.error)); - } - console.log(); - requestUsers(function (usersResponse) { - console.log('Users:'); - if (usersResponse.status === 'success') { - usersResponse.data.forEach(logPerson); - } - else { - return callback(new Error(usersResponse.error)); - } - console.log(); - requestCurrentServerTime(function (serverTimeResponse) { - console.log('Server time:'); - if (serverTimeResponse.status === 'success') { - console.log(" ".concat(new Date(serverTimeResponse.data).toLocaleString())); - } - else { - return callback(new Error(serverTimeResponse.error)); - } - console.log(); - requestCoffeeMachineQueueLength(function (coffeeMachineQueueLengthResponse) { - console.log('Coffee machine queue length:'); - if (coffeeMachineQueueLengthResponse.status === 'success') { - console.log(" ".concat(coffeeMachineQueueLengthResponse.data)); - } - else { - return callback(new Error(coffeeMachineQueueLengthResponse.error)); - } - callback(null); - }); - }); - }); - }); -} -startTheApp(function (e) { - console.log(); - if (e) { - console.log("Error: \"".concat(e.message, "\", but it's fine, sometimes errors are inevitable.")); - } - else { - console.log('Success!'); - } -}); From 0c4dc409b001fa06fbd444d42ce297e717de8155 Mon Sep 17 00:00:00 2001 From: Trung Phan Date: Mon, 29 Jan 2024 17:30:04 +0700 Subject: [PATCH 3/4] Fix comments ex4, 6, 9 --- TrungPH/ex1.ts | 2 +- TrungPH/ex2.ts | 2 +- TrungPH/ex3.ts | 2 +- TrungPH/ex4.ts | 8 ++++---- TrungPH/ex5.ts | 2 +- TrungPH/ex6.ts | 10 ++++------ TrungPH/ex9.ts | 28 +++++----------------------- 7 files changed, 17 insertions(+), 37 deletions(-) diff --git a/TrungPH/ex1.ts b/TrungPH/ex1.ts index 90a6f66..661bd87 100644 --- a/TrungPH/ex1.ts +++ b/TrungPH/ex1.ts @@ -22,4 +22,4 @@ export function logPerson(user: User) { } console.log('Users:'); -users.forEach(logPerson); \ No newline at end of file +users.forEach(logPerson); diff --git a/TrungPH/ex2.ts b/TrungPH/ex2.ts index c0e0852..39b3a15 100644 --- a/TrungPH/ex2.ts +++ b/TrungPH/ex2.ts @@ -39,4 +39,4 @@ export function logPerson(person: Person) { console.log(` - ${person.name}, ${person.age}`); } -persons.forEach(logPerson); \ No newline at end of file +persons.forEach(logPerson); diff --git a/TrungPH/ex3.ts b/TrungPH/ex3.ts index 65c05f5..1279874 100644 --- a/TrungPH/ex3.ts +++ b/TrungPH/ex3.ts @@ -51,4 +51,4 @@ export function logPerson(person: Person) { console.log(` - ${person.name}, ${person.age}, ${additionalInformation}`); } -persons.forEach(logPerson); \ No newline at end of file +persons.forEach(logPerson); diff --git a/TrungPH/ex4.ts b/TrungPH/ex4.ts index a208707..a53e841 100644 --- a/TrungPH/ex4.ts +++ b/TrungPH/ex4.ts @@ -21,21 +21,21 @@ export const persons: Person[] = [ { type: 'admin', name: 'Bruce Willis', age: 64, role: 'World saver' } ]; -export function isAdmin(person: Person) { +export function isAdmin(person: Person): person is Admin { return person.type === 'admin'; } -export function isUser(person: Person) { +export function isUser(person: Person): person is User { return person.type === 'user'; } export function logPerson(person: Person) { let additionalInformation: string = ''; if (isAdmin(person)) { - additionalInformation = (person as Admin).role; + additionalInformation = person.role; } if (isUser(person)) { - additionalInformation = (person as User).occupation; + additionalInformation = person.occupation; } console.log(` - ${person.name}, ${person.age}, ${additionalInformation}`); } diff --git a/TrungPH/ex5.ts b/TrungPH/ex5.ts index a418a01..a323ede 100644 --- a/TrungPH/ex5.ts +++ b/TrungPH/ex5.ts @@ -55,4 +55,4 @@ filterUsers( { age: 23 } -).forEach(logPerson); \ No newline at end of file +).forEach(logPerson); diff --git a/TrungPH/ex6.ts b/TrungPH/ex6.ts index 67d0e4d..a5b9430 100644 --- a/TrungPH/ex6.ts +++ b/TrungPH/ex6.ts @@ -29,15 +29,13 @@ export function logPerson(person: Person) { ); } -export function getObjKeys(obj: T): (keyof T)[] { - return Object.keys(obj) as (keyof T)[]; -} - +export function filterPersons(persons: Person[], personType: User['type'], criteria: Partial>): User[]; +export function filterPersons(persons: Person[], personType: Admin['type'], criteria: Partial>): Admin[]; export function filterPersons(persons: Person[], personType: string, criteria: Partial): Person[] { return persons .filter((person) => person.type === personType) .filter((person) => { - let criteriaKeys = getObjKeys(criteria) as (keyof Person)[]; + let criteriaKeys = Object.keys(criteria) as (keyof Person)[]; return criteriaKeys.every((fieldName) => { return person[fieldName] === criteria[fieldName]; }); @@ -53,4 +51,4 @@ usersOfAge23.forEach(logPerson); console.log(); console.log('Admins of age 23:'); -adminsOfAge23.forEach(logPerson); \ No newline at end of file +adminsOfAge23.forEach(logPerson); diff --git a/TrungPH/ex9.ts b/TrungPH/ex9.ts index aa8d163..0dc781f 100644 --- a/TrungPH/ex9.ts +++ b/TrungPH/ex9.ts @@ -35,16 +35,9 @@ export type ApiResponse = ( } ); -type AdminsApiResponse = ( - { - status: 'success'; - data: Admin[]; - } | - { - status: 'error'; - error: string; - } -); +type AdminsApiResponse = ApiResponse; + +type UsersApiResponse = ApiResponse; export function requestAdmins(callback: (response: AdminsApiResponse) => void) { callback({ @@ -53,17 +46,6 @@ export function requestAdmins(callback: (response: AdminsApiResponse) => void) { }); } -type UsersApiResponse = ( - { - status: 'success'; - data: User[]; - } | - { - status: 'error'; - error: string; - } -); - export function requestUsers(callback: (response: UsersApiResponse) => void) { callback({ status: 'success', @@ -78,7 +60,7 @@ export function requestCurrentServerTime(callback: (response: ApiResponse) => void) { +export function requestCoffeeMachineQueueLength(callback: (response: ApiResponse) => void) { callback({ status: 'error', error: 'Numeric value has exceeded Number.MAX_SAFE_INTEGER.' @@ -144,4 +126,4 @@ startTheApp((e: Error | null) => { } else { console.log('Success!'); } -}); \ No newline at end of file +}); From 6f983da1a355d2e575fdb10a6d160c18ca1b1b5b Mon Sep 17 00:00:00 2001 From: Trung Phan Date: Mon, 29 Jan 2024 20:59:02 +0700 Subject: [PATCH 4/4] Submit exercises 11 -> 13 --- TrungPH/ex11.d.ts | 41 +++++++++++++++++++++++++++++++++++++++++ TrungPH/ex12.d.ts | 17 +++++++++++++++++ TrungPH/ex13.d.ts | 12 ++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 TrungPH/ex11.d.ts create mode 100644 TrungPH/ex12.d.ts create mode 100644 TrungPH/ex13.d.ts diff --git a/TrungPH/ex11.d.ts b/TrungPH/ex11.d.ts new file mode 100644 index 0000000..e6ff463 --- /dev/null +++ b/TrungPH/ex11.d.ts @@ -0,0 +1,41 @@ + +declare module 'str-utils' { + // export const ... + // export function ... + + /** +* Reverses a string. +* @param {String} value +* @return {String} +*/ +export function strReverse(value: string): string; + +/** +* Converts a string to lower case. +* @param {String} value +* @return {String} +*/ +export function strToLower(value: string): string; + +/** +* Converts a string to upper case. +* @param {String} value +* @return {String} +*/ +export function strToUpper(value: string): string; + +/** +* Randomizes characters of a string. +* @param {String} value +* @return {String} +*/ +export function strRandomize(value: string): string; + +/** +* Inverts case of a string. +* @param {String} value +* @return {String} +*/ +export function strInvertCase(value: string): string; + +} diff --git a/TrungPH/ex12.d.ts b/TrungPH/ex12.d.ts new file mode 100644 index 0000000..b8319ef --- /dev/null +++ b/TrungPH/ex12.d.ts @@ -0,0 +1,17 @@ +declare module 'stats' { + type Comparator = (a: T, b: T) => number; + type GetIndex = (input: T[], comparator: Comparator) => number; + + export const getMinIndex: GetIndex; + export const getMedianIndex: GetIndex; + export const getMaxIndex: GetIndex; + + + type GetElement = (input: T[], comparator: Comparator) => null | T; + + export const getMinElement: GetElement; + export const getMedianElement: GetElement; + export const getMaxElement: GetElement; + + export const getAverageValue: (input: T[], getValue: (item: T) => number) => number | null; +} diff --git a/TrungPH/ex13.d.ts b/TrungPH/ex13.d.ts new file mode 100644 index 0000000..aaf86bc --- /dev/null +++ b/TrungPH/ex13.d.ts @@ -0,0 +1,12 @@ +// This enables module augmentation mode. +import 'date-wizard'; + +declare module 'date-wizard' { + interface DateDetails { + hours: number; + minutes: number, + seconds: number + } + + function pad(input: number): string +}