blob: c13b921c33284a0184a76f91e45a049fe7f26097 (
plain)
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
|
//
// StringStreamIterator.swift
// MullvadVPN
//
// Created by pronebird on 17/08/2020.
// Copyright © 2020 Mullvad VPN AB. All rights reserved.
//
#if DEBUG
import Foundation
class StringStreamIterator<Codec>: IteratorProtocol where Codec: UnicodeCodec {
let separator: Character
private var string = ""
private var data = [Codec.CodeUnit]()
private var parser = Codec.ForwardParser()
init(separator: Character) {
self.separator = separator
}
func append<S>(bytes: S) where S: Sequence, S.Element == Codec.CodeUnit {
data.append(contentsOf: bytes)
}
func next() -> String? {
var dataIterator = data.makeIterator()
var bytesRead = 0
defer {
if bytesRead > 0 {
data.removeSubrange(..<bytesRead)
}
}
while case .valid(let encodedScalar) = parser.parseScalar(from: &dataIterator) {
let unicodeScalar = Codec.decode(encodedScalar)
let character = Character(unicodeScalar)
bytesRead += encodedScalar.count
if character == separator {
let returnString = string
string = ""
return returnString
} else {
string.append(character)
}
}
return nil
}
}
#endif
|