MediumPythonJavaScriptTypeScript
Observer Pattern
PatternsAsyncFunctions
Implement a minimal Observable:
class Observable {
subscribe(observer) // observer: { next, error?, complete? }
// returns { unsubscribe() }
}solve(ops) replays a sequence of operations and returns all emitted values.
Operations: { type: 'next'|'error'|'complete'|'unsubscribe', value? }.
Emissions after complete or unsubscribe must be silently ignored.
Sample tests
Test #1Normal flow with completion
Input: [[{"type":"next","value":1},{"type":"next","value":2},{"type":"complete"}]]
Output: [{"type":"next","value":1},{"type":"next","value":2},{"type":"complete"}]
Test #2Emissions after complete are ignored
Input: [[{"type":"next","value":1},{"type":"complete"},{"type":"next","value":2}]]
Output: [{"type":"next","value":1},{"type":"complete"}]
Test #3Error terminates the stream
Input: [[{"type":"next","value":"a"},{"type":"error","value":"oops"},{"type":"next","value":"b"}]]
Output: [{"type":"next","value":"a"},{"type":"error","value":"oops"}]
Test #4Unsubscribe stops further emissions
Input: [[{"type":"next","value":1},{"type":"unsubscribe"},{"type":"next","value":2}]]
Output: [{"type":"next","value":1}]
Test #5Double complete → only first fires
Input: [[{"type":"complete"},{"type":"complete"}]]
Output: [{"type":"complete"}]