View scrape-timestamps.js
const fs = require('fs'); | |
const fetch = require('node-fetch'); | |
const cheerio = require('cheerio'); | |
main().catch(err => console.error(err)); | |
async function main() { | |
const SCARE_RE = /^((\d{1,2}):(\d{1,2})(?::(\d{1,2}))?).*– (.+)$/; | |
const $ = cheerio.load(fs.readFileSync('./notebooks/movielist.html', 'utf8')); | |
const $movieNames = $('td.column-1 > a'); |
View 03-02-demystifying-rxjs-schedulers.ts
const syncScheduler: Scheduler = { | |
schedule(work) { | |
work(); | |
} | |
}; | |
const asyncScheduler: Scheduler = { | |
schedule(work) { | |
setTimeout(work, 0); | |
} |
View 03-01-demystifying-rxjs-scheduler-interface.ts
interface Scheduler { | |
schedule(work: Function): void; | |
} |
View 02-08-demystifying-rxjs-concatMap-test.ts
outer | |
.pipe(concatMap(createInner)) | |
.subscribe(x => console.log("[concatMap] outer:", x), undefined, () => | |
console.log("[concatMap] done!") | |
); |
View 02-07-demystifying-rxjs-concatMap.ts
function concatMap<T, R>( | |
project: (value: T, index: number) => Observable<R> | |
): OperatorFunction<T, R> { | |
let currentIndex = 0; | |
const buffer: Array<Observable<R>> = []; | |
const subscribeTo = ( | |
projected: Observable<R>, | |
obs: Observer<R>, | |
subscriptions: Set<Subscription> |
View 02-06-demystifying-rxjs-mergemap-test.ts
function sleep(ms: number) { | |
return new Promise(resolve => setTimeout(resolve, ms)); | |
} | |
function createInner(x: number) { | |
return new Observable(obs => { | |
(async () => { | |
for (let i = 0; i < 3; i++) { | |
if (i > 0) await sleep(500); | |
obs.next(10 * x); |
View 02-05-demystifying-rxjs-mergemap.ts
function mergeMap<T, R>( | |
project: (value: T, index: number) => Observable<R> | |
): OperatorFunction<T, R> { | |
let currentIndex = 0; | |
return source => | |
new Observable(obs => { | |
const subscriptions = new Set<Subscription>(); | |
const sub = source.subscribe( | |
x => { | |
const projected = project(x, currentIndex++); |
View 02-04-demystifying-rxjs-custom-op.ts
function computeSquaredSum(): OperatorFunction<number, number> { | |
return source => | |
source.pipe( | |
map(n => n * n), | |
reduce((s, n) => s + n, 0), | |
); | |
} | |
oneThroughTen | |
.pipe(computeSquaredSum()) | |
.subscribe(x => console.log("Squared sum w/ custom op =", x)); |
View 02-03-demystifying-rxjs-sqsum-test-1.ts
const oneThroughTen = of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) | |
oneThroughTen | |
.pipe( | |
map(n => n * n), | |
reduce((s, n) => s + n, 0) | |
) | |
.subscribe(sqSum => console.log("Squared sum =", sqSum)); |
View 05-demystifying-rxjs-fromEvent.ts
function fromEvent<T extends Event = Event>( | |
target: EventTarget, | |
eventName: string | |
): Observable<T> { | |
return new Observable(obs => { | |
const listener: EventListener = (evt: T) => { | |
obs.next(evt); | |
}; | |
target.addEventListener(eventName, listener); | |
return () => target.removeEventListener(eventName, listener); |
NewerOlder