mergeIncomeNewMessages<T> method
List<T>
mergeIncomeNewMessages<T>({
- required List<
T> messages, - required bool isAddTop,
- required List<
T> addedMsgs, - required DateTime getMsgTime(
- T msg
- required bool isTimeTagMsg(
- T msg
- required T onCreateTimeTag(
- DateTime time
- required List<
String> timeTagPolicies, - required String getMsgId(
- T msg
- bool needRegenerateTimeTag = false,
override
- Add
addedMsgs
intomessages
and remove duplicated messages - Generate time tag amount
addedMsgs
(keep time tag in messages not to change) iftimeTagPolicies
is"5m", "20m", "1h", "3h"
, is mean create a tag in 5min, 20min, 1hour and 3 hour, after that 3hours, create a time tag each 3 hours Notice, messsages and addedMsgs should be already ordered by time dasc. It mean the function will not sort again
Implementation
@override
List<T> mergeIncomeNewMessages<T>(
{required List<T> messages,
required bool isAddTop,
required List<T> addedMsgs,
required DateTime Function(T msg) getMsgTime,
required bool Function(T msg) isTimeTagMsg,
required T Function(DateTime time) onCreateTimeTag,
required List<String> timeTagPolicies,
required String Function(T msg) getMsgId,
bool needRegenerateTimeTag = false}) {
// create map to enhance performance
var addedMsgMap = <String, T>{};
for (var addedMsg in addedMsgs) {
addedMsgMap[getMsgId(addedMsg)] = addedMsg;
}
var result = <T>[];
// remove duplicate
for (var msg in messages) {
var newMsg = msg;
if (!isTimeTagMsg(msg)) {
var msgId = getMsgId(msg);
if (addedMsgMap[msgId] != null) {
newMsg = addedMsgMap[msgId]!;
addedMsgMap.remove(msgId);
}
result.add(newMsg);
} else {
if (!needRegenerateTimeTag) {
result.add(newMsg);
}
}
}
// remove duplicate msg
var newAddedMsgs = <T>[];
for (var addedMsg in addedMsgs) {
if (addedMsgMap[getMsgId(addedMsg)] != null) {
newAddedMsgs.add(addedMsg);
}
}
if (!needRegenerateTimeTag) {
newAddedMsgs = generateTimeTags(
messages: newAddedMsgs,
getMsgTime: getMsgTime,
onCreateTimeTag: onCreateTimeTag,
timeTagPolicies: timeTagPolicies);
// Add to top, It mean load prev
if (isAddTop) {
for (var i = newAddedMsgs.length - 1; i >= 0; i--) {
result.insert(0, newAddedMsgs[i]);
}
} else {
result.addAll(newAddedMsgs);
}
} else {
if (isAddTop) {
for (var i = newAddedMsgs.length - 1; i >= 0; i--) {
result.insert(0, newAddedMsgs[i]);
}
} else {
result.addAll(newAddedMsgs);
}
result = generateTimeTags(
messages: result,
getMsgTime: getMsgTime,
onCreateTimeTag: onCreateTimeTag,
timeTagPolicies: timeTagPolicies);
}
return result;
}