@@ -40,6 +40,8 @@ final class SearchViewModel: Store {
4040 }
4141
4242 enum SideEffect {
43+ case cancelSearch
44+ case debounceFetch( String )
4345 case fetch( String )
4446 }
4547
@@ -103,20 +105,21 @@ final class SearchViewModel: Store {
103105 state. isLoading = isLoading
104106 case . setSearching( let isSearching) :
105107 state. isSearching = isSearching
108+ if !isSearching {
109+ effects = [ . cancelSearch]
110+ }
106111 case . setSearchQuery( let query) :
107112 guard state. searchQuery != query else { return [ ] }
108113 state. searchQuery = query
109114 state. showAllTodos = false
110115 state. showAllWebPages = false
111116 let trimmed = query. trimmingCharacters ( in: . whitespacesAndNewlines)
112117 if trimmed. isEmpty {
113- cancelSearch ( )
114118 state. webPages = [ ]
115119 state. todos = [ ]
120+ effects = [ . cancelSearch]
116121 } else {
117- cancelSearch ( )
118- beginLoading ( . immediate)
119- scheduleDebouncedFetch ( trimmed)
122+ effects = [ . cancelSearch, . debounceFetch( trimmed) ]
120123 }
121124 case . applySearchQuery( let query) :
122125 effects = [ . fetch( query) ]
@@ -132,6 +135,11 @@ final class SearchViewModel: Store {
132135
133136 func run( _ effect: SideEffect ) {
134137 switch effect {
138+ case . cancelSearch:
139+ cancelSearch ( )
140+ case . debounceFetch( let query) :
141+ beginLoading ( . immediate)
142+ scheduleDebouncedFetch ( query)
135143 case . fetch( let query) :
136144 searchTasks [ . request] ? . cancel ( )
137145 let requestTask = Task { [ weak self] in
0 commit comments