MediumPro challengePythonJavaScriptTypeScript

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 #1Double complete → only first fires
Input: [[{"type":"complete"},{"type":"complete"}]]
Output: [{"type":"complete"}]
Test #2Normal 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 #3Emissions after complete are ignored
Input: [[{"type":"next","value":1},{"type":"complete"},{"type":"next","value":2}]]
Output: [{"type":"next","value":1},{"type":"complete"}]
Test #4Error 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 #5Unsubscribe stops further emissions
Input: [[{"type":"next","value":1},{"type":"unsubscribe"},{"type":"next","value":2}]]
Output: [{"type":"next","value":1}]