@@ -80,7 +80,7 @@ extension HTMLKitUtilities {
8080 static func representationResult(
8181 encoding: HTMLEncoding ,
8282 encodedResult: String ,
83- representation: HTMLResultRepresentation
83+ representation: HTMLResultRepresentationAST
8484 ) -> String {
8585 switch representation {
8686 case . literal:
@@ -102,9 +102,25 @@ extension HTMLKitUtilities {
102102 return " InlineArray< \( chunks. count) , \( typeAnnotation) >([ \( chunks) ]) "
103103 #endif
104104 case . streamed( let optimized, let chunkSize) :
105- return streamed ( encoding: encoding, encodedResult: encodedResult, async : false , optimized: optimized, chunkSize: chunkSize, suspendDuration: nil )
106- case . streamedAsync( let optimized, let chunkSize, let suspendDuration) :
107- return streamed ( encoding: encoding, encodedResult: encodedResult, async : true , optimized: optimized, chunkSize: chunkSize, suspendDuration: suspendDuration)
105+ return streamed (
106+ encoding: encoding,
107+ encodedResult: encodedResult,
108+ async : false ,
109+ optimized: optimized,
110+ chunkSize: chunkSize,
111+ yieldVariableName: nil ,
112+ afterYield: nil
113+ )
114+ case . streamedAsync( let optimized, let chunkSize, let yieldVariableName, let afterYield) :
115+ return streamed (
116+ encoding: encoding,
117+ encodedResult: encodedResult,
118+ async : true ,
119+ optimized: optimized,
120+ chunkSize: chunkSize,
121+ yieldVariableName: yieldVariableName,
122+ afterYield: afterYield
123+ )
108124 default :
109125 break
110126 }
@@ -232,23 +248,34 @@ extension HTMLKitUtilities {
232248 async : Bool ,
233249 optimized: Bool ,
234250 chunkSize: Int ,
235- suspendDuration: Duration ?
251+ yieldVariableName: String ? ,
252+ afterYield: String ?
236253 ) -> String {
237254 var string = " AsyncStream { continuation in \n "
238255 if async {
239256 string += " Task { \n "
240257 }
241- let duration : String ?
242- if let suspendDuration {
243- duration = durationDebugDescription ( suspendDuration)
258+ var yieldVariableName : String ? = yieldVariableName
259+ if yieldVariableName == " _ " {
260+ yieldVariableName = nil
261+ }
262+ var afterYieldLogic : String ?
263+ if let afterYield {
264+ if let yieldVariableName {
265+ string += " var \( yieldVariableName) = 0 \n "
266+ }
267+ afterYieldLogic = afterYield
244268 } else {
245- duration = nil
269+ afterYieldLogic = nil
246270 }
247271 let chunks = chunks ( encoding: encoding, encodedResult: encodedResult, async : async , optimized: optimized, chunkSize: chunkSize)
248272 for chunk in chunks {
249273 string += " continuation.yield( " + chunk + " ) \n "
250- if let duration {
251- string += " try await Task.sleep(for: \( duration) ) \n "
274+ if let afterYieldLogic {
275+ string += " \( afterYieldLogic) \n "
276+ }
277+ if let yieldVariableName {
278+ string += " \( yieldVariableName) += 1 \n "
252279 }
253280 }
254281 string += " continuation.finish() \n } "
@@ -257,29 +284,4 @@ extension HTMLKitUtilities {
257284 }
258285 return string
259286 }
260- static func durationDebugDescription( _ duration: Duration ) -> String {
261- let ( seconds, attoseconds) = duration. components
262- var string : String
263- if attoseconds == 0 {
264- string = " .seconds( \( seconds) ) "
265- } else {
266- var nanoseconds = attoseconds / 1_000_000_000
267- nanoseconds += seconds * 1_000_000_000
268- string = " \( nanoseconds) "
269- if seconds == 0 {
270- if string. hasSuffix ( " 000000 " ) {
271- string. removeLast ( 6 )
272- string = " .milliseconds( \( string) ) "
273- } else if string. hasSuffix ( " 000 " ) {
274- string. removeLast ( 3 )
275- string = " .microseconds( \( string) ) "
276- } else {
277- string = " .nanoseconds( \( string) ) "
278- }
279- } else {
280- string = " .nanoseconds( \( nanoseconds) ) "
281- }
282- }
283- return string
284- }
285287}
0 commit comments