logBuffered method

void logBuffered(
  1. Object identifier,
  2. MessagesBlockLogger messagesBlockLogger,
  3. Level level,
  4. String message,
)

Implementation

void logBuffered(Object identifier, MessagesBlockLogger messagesBlockLogger,
    logging.Level level, String message) {
  final buffer = _buffers[identifier] ??= [];

  buffer.add((level, message));

  Future<void>? call;

  call = _bufferedCalls[identifier] ??=
      Future.delayed(Duration(milliseconds: 100), () async {
    var blocks = buffer.splitBeforeIndexed((i, e) {
      if (i == 0) return false;
      var prev = buffer[i - 1];
      return prev.$1 != e.$1;
    });

    for (var block in blocks) {
      if (block.isNotEmpty) {
        var level = block.first.$1;
        var messages = block.map((b) => b.$2).toList();
        messagesBlockLogger(level, messages);
      }
    }

    var prevCall = _bufferedCalls[identifier];
    if (identical(prevCall, call)) {
      _bufferedCalls[identifier] = null;
    }
  });
}