const Rx = require('rxjs');
{
  const streamExample$ = Rx.Observable.create( observer => {
    const interval = setInterval(() => {
      observer.next(new Date());
    }, 500);
    setTimeout(() => {
      clearInterval(interval);
      observer.complete();
    }, 3000);
  });
  const callbackExample = callback => {
    if(typeof callback !== "function") throw ("Callback is not a function!");
    const interval = setInterval(() => {
      callback(new Date());
    }, 500);
    setTimeout(() => {
      clearInterval(interval);
      callback("Koniec callback-u!");
    }, 3000);
  };
  const promiseExample = callback => {
    if(typeof callback !== "function") throw ("Callback is not a function!");
    const interval = setInterval(() => {
      new Promise((resolve, reject) => {
        resolve(new Date());
      }).then(callback);
    }, 500);
    setTimeout(() => {
      clearInterval(interval);
      callback("Koniec promise-ów!");
    }, 3000);
  };
  streamExample$.subscribe(
    data => console.log("stream$: " , data),
    error => console.error(error),
    complete => console.log("Koniec streamu!")
  );
  callbackExample(data => console.log("Callback: ", data));
  promiseExample(data => console.log("Promise: ", data));
}