code: function takeWhile(predicate) {
      return function* (iterable) {
          let i = 0;
          for (const item of iterable) {
              if (!predicate(item, i)) {
                  break;
              }
              yield item;
              i = i + 1;
          }
      };
  }
docs: Take and yield items in an iterable until the passed predicate fails, then abort the sequence