宽窄优行-由【嘉易行】项目成品而来
younger_times
2023-04-06 a1ae6802080a22e6e6ce6d0935e95facb1daca5c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//
//  EKEntryCacher.swift
//  SwiftEntryKit
//
//  Created by Daniel Huri on 9/1/18.
//  Copyright © 2018 CocoaPods. All rights reserved.
//
 
import Foundation
 
struct CachedEntry {
    let view: EKEntryView
    let presentInsideKeyWindow: Bool
    let rollbackWindow: SwiftEntryKit.RollbackWindow
}
 
protocol EntryCachingHeuristic: class {
    var entries: [CachedEntry] { set get }
    var isEmpty: Bool { get }
    
    func dequeue() -> CachedEntry?
    func enqueue(entry: CachedEntry)
    
    func removeEntries(by name: String)
    func removeEntries(withPriorityLowerOrEqualTo priority: EKAttributes.Precedence.Priority)
    func remove(entry: CachedEntry)
    func removeAll()
    
    func contains(entryNamed name: String) -> Bool
}
 
extension EntryCachingHeuristic {
    
    var isEmpty: Bool {
        return entries.isEmpty
    }
    
    func contains(entryNamed name: String) -> Bool {
        return entries.contains { $0.view.attributes.name == name }
    }
    
    func dequeue() -> CachedEntry? {
        guard let first = entries.first else {
            return nil
        }
        entries.removeFirst()
        return first
    }
    
    func removeEntries(withPriorityLowerOrEqualTo priority: EKAttributes.Precedence.Priority) {
        while let index = (entries.firstIndex { $0.view.attributes.precedence.priority <= priority }) {
            entries.remove(at: index)
        }
    }
    
    func removeEntries(by name: String) {
        while let index = (entries.firstIndex { $0.view.attributes.name == name }) {
            entries.remove(at: index)
        }
    }
    
    func remove(entry: CachedEntry) {
        guard let index = (entries.firstIndex { $0.view == entry.view }) else {
            return
        }
        entries.remove(at: index)
    }
    
    func removeAll() {
        entries.removeAll()
    }
}
 
class EKEntryChronologicalQueue: EntryCachingHeuristic {
    
    var entries: [CachedEntry] = []
    
    func enqueue(entry: CachedEntry) {
        entries.append(entry)
    }
}
 
class EKEntryPriorityQueue: EntryCachingHeuristic {
    
    var entries: [CachedEntry] = []
    
    func enqueue(entry: CachedEntry) {
        let entryPriority = entry.view.attributes.precedence.priority
        let index = entries.firstIndex {
            return entryPriority > $0.view.attributes.precedence.priority
        }
        if let index = index {
            entries.insert(entry, at: index)
        } else {
            entries.append(entry)
        }
    }
}