generateTimeTags<T> method
List<T>
generateTimeTags<T>({
- required List<
T> messages, - required DateTime getMsgTime(
- T
- required T onCreateTimeTag(
- DateTime time
- 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;
}