Semyon Zadorozhnyi
08/26/2021, 12:44 PMclass TriggerRepositoryImpl: TriggerRepository {
private val _events = MutableSharedFlow<Event>()
override fun observeTrigger(): Flow<Unit> = flow {
// Observe _events and match latest against validTriggerPatterns
// If there is a match - call emit(Unit)
}
override suspend fun addEvent(event: Event) {
_events.emit(event)
}
}
val validTriggerPatterns = listOf(
listOf(Event.ScreenOpen(Screen.Main), Event.ScreenOpen(Screen.Details)),
listOf(Event.CardCreated, Event.ScreenOpen(Screen.Main))
)
example:
addEvent(Event.ScreenOpen(Screen.Details))
addEvent(Event.ScreenOpen(Screen.Main))
addEvent(Event.ScreenOpen(Screen.Details)) <- previous and this events are in pattern
— emit(Unit)
addEvent(Event.CardCreated)
addEvent(Event.CardCreated)
addEvent(Event.ScreenOpen(Screen.Details))
addEvent(Event.CardCreated)
addEvent(Event.ScreenOpen(Screen.Main)) <- previous and this events are in pattern
— emit(Unit)Ivan Pavlov
08/26/2021, 3:08 PMrunningReduce
or runningFold
solves. You can take a look at sources and adapt it to your use caseNick Allen
08/26/2021, 5:55 PMflow {
val history = ArrayDeque<Event>()
_events.collect {
history.addLast(it)
if (history.size > MAX_PATTERN_SIZE) {
history.removeFirst()
}
if (validTriggerPatterns.any { pattern -> isMatch(history. pattern) } {
emit(Unit)
}
}
}