generateTimeTags<T> method

  1. @override
List<T> generateTimeTags<T>({
  1. required List<T> messages,
  2. required DateTime getMsgTime(
    1. T
    ),
  3. required T onCreateTimeTag(
    1. DateTime time
    ),
  4. required List<String> timeTagPolicies,
})
override

Generate time tag amount messages if timeTagPolicies is "5m", "20m", "1h", "3h", is mean create a tag in 5min, 20min, 1hour and 3 hour, timeTagPolicies support {s,m,h,d} after that 3hours, create a time tag each 3 hours

Implementation

@override
List<T> generateTimeTags<T>(
    {required List<T> messages,
    required DateTime Function(T) getMsgTime,
    required T Function(DateTime time) onCreateTimeTag,
    required List<String> timeTagPolicies}) {
  List<T> result = <T>[];
  var policies = parseTimeTagPolicies(timeTagPolicies);
  if (policies.isEmpty) {
    result = messages;
  } else {
    int curPoliIndex = 0;
    int curPolicy = policies[
        curPoliIndex >= policies.length ? policies.length : curPoliIndex];
    var nextPhraseTimestamp =
        DateTime.now().millisecondsSinceEpoch - curPolicy;
    for (var i = 0; i < messages.length; i++) {
      var curMsg = messages[i];
      var curMsgTime = getMsgTime(curMsg);
      var curMsgTimestamp = curMsgTime.millisecondsSinceEpoch;
      var needGenerateTimeTag = false;
      if (i == messages.length - 1) {
        needGenerateTimeTag = true;
      } else {
        var nextMsg = messages[i + 1];
        var nextMsgTimestamp = getMsgTime(nextMsg!).millisecondsSinceEpoch;

        while (true) {
          if (curMsgTimestamp >= nextPhraseTimestamp &&
              nextMsgTimestamp <= nextPhraseTimestamp) {
            needGenerateTimeTag = true;
            // Move next phase
            curPoliIndex++;
            curPolicy = policies[curPoliIndex >= policies.length
                ? policies.length - 1
                : curPoliIndex];
            nextPhraseTimestamp = nextPhraseTimestamp - curPolicy;
            break;
          } else if (curMsgTimestamp < nextPhraseTimestamp &&
              nextMsgTimestamp < nextPhraseTimestamp) {
            // Move next phase
            curPoliIndex++;
            curPolicy = policies[curPoliIndex >= policies.length
                ? policies.length - 1
                : curPoliIndex];
            nextPhraseTimestamp = nextPhraseTimestamp - curPolicy;
          } else {
            break;
          }
        }
      }

      result.add(curMsg);
      if (needGenerateTimeTag) {
        result.add(
            onCreateTimeTag(curMsgTime.add(const Duration(milliseconds: 1))));
      }
    }
  }

  return result;
}