init(src, flags) {
      const p = this;
      p.stamp = src.stamp;
      p.encode = src.encode;
      if (src.fields && !(flags & NO_FIELDS)) {
        p.fields = src.fields;
      }
      if (flags & ADD) {
        p.addF = src.addF;
        p.add = src.add;
      } else {
        p.addF = null;
        p.add = [];
      }
      if (flags & REM) {
        p.remF = src.remF;
        p.rem = src.rem;
      } else {
        p.remF = null;
        p.rem = [];
      }
      if (flags & MOD$1) {
        p.modF = src.modF;
        p.mod = src.mod;
      } else {
        p.modF = null;
        p.mod = [];
      }
      if (flags & NO_SOURCE) {
        p.srcF = null;
        p.source = null;
      } else {
        p.srcF = src.srcF;
        p.source = src.source;
        if (src.cleans) p.cleans = src.cleans;
      }
      return p;
    }
Initialize this pulse based on the values of another pulse. This method
is used internally by {@link fork} to initialize a new forked tuple.
The dataflow, time stamp and field modification values are copied over.
By default, new empty ADD, REM and MOD arrays are created.
@param {Pulse} src - The source pulse to copy from.
@param {number} flags - Integer of boolean flags indicating which (if any)
  tuple arrays should be copied to the new pulse. The supported flag values
  are ADD, REM and MOD. Array references are copied directly: new array
  instances are not created. By default, source data arrays are copied
  to the new pulse. Use the NO_SOURCE flag to enforce a null source.
@return {Pulse} - Returns this Pulse instance.