public virtual void ProcessElement(StreamRecord <TElement> record)
        {
            var element      = record.Value;
            var newTimestamp = UserFunction.ExtractTimestamp(element, record.HasTimestamp ? record.Timestamp : long.MinValue);

            Output.Collect(record.Replace(record.Value, newTimestamp));

            var nextWatermark = UserFunction.CheckAndGetNextWatermark(element, newTimestamp);

            if (nextWatermark != null && nextWatermark.Timestamp > _currentWatermark)
            {
                _currentWatermark = nextWatermark.Timestamp;
                Output.EmitWatermark(nextWatermark);
            }
        }