Solution

class MyObservable {
  constructor(subscribeFn) {
    this._subscribeFn = subscribeFn;
  }

  subscribe(observer) {
    this._subscribeFn(observer);
  }
}

// Example usage:
const myObservable = new MyObservable((observer) => {
  observer.next('Hello world!'); // Emit initial data
  setTimeout(() => {
    observer.next('Data after 1 second');
  }, 1000);
  setTimeout(() => {
    observer.complete(); // Signal completion (no more data)
  }, 2000);
});

myObservable.subscribe({
  next(data) {
    console.log('Received data:', data);
  },
  error(err) {
    console.error('Error:', err);
  },
  complete() {
    console.log('Observable completed');
  },
});