@@ -5,10 +5,11 @@ pub struct Sink[X] {
55 priv is_open : () -> Bool
66 priv has_cleanup : () -> Bool
77 priv cleanup : ((X ) -> Unit )?
8+ priv write_window_size : Int
89}
910
1011///|
11- let sink_write_window_size : Int = 64
12+ let default_sink_write_window_size : Int = 64
1213
1314///|
1415/// The write callback must either raise before consuming any value or return
@@ -21,8 +22,17 @@ pub fn[X] Sink::from_callbacks(
2122 close : async () -> Unit ,
2223 is_open : () -> Bool ,
2324 cleanup : ((X ) -> Unit )?,
25+ write_window_size : Int ,
2426) -> Sink [X ] {
25- { write, close, is_open, has_cleanup: () => cleanup is Some (_), cleanup }
27+ guard write_window_size > 0
28+ {
29+ write,
30+ close,
31+ is_open,
32+ has_cleanup: () => cleanup is Some (_),
33+ cleanup,
34+ write_window_size,
35+ }
2636}
2737
2838///|
@@ -34,13 +44,13 @@ pub async fn[X] Sink::write(self : Sink[X], data : ArrayView[X]) -> Int {
3444 if data.length() == 0 {
3545 return 0
3646 }
37- let length = if data.length() < sink_write_window_size {
47+ let length = if data.length() < self.write_window_size {
3848 data.length()
3949 } else {
40- sink_write_window_size
50+ self.write_window_size
4151 }
4252 // The callback may suspend, so it must not retain the caller's borrowed view.
43- let buffer = FixedArray ::makei(length, i => data[i ])
53+ let buffer = FixedArray ::from_array( data[:length ])
4454 let written = (self.write)(buffer[:])
4555 guard written >= 0 && written <= length
4656 if !(self.is_open)() && written < length && (self.has_cleanup)() {
@@ -60,12 +70,12 @@ pub async fn Sink::write_bytes(self : Sink[Byte], data : BytesView) -> Int {
6070 if data.length() == 0 {
6171 return 0
6272 }
63- let length = if data.length() < sink_write_window_size {
73+ let length = if data.length() < self.write_window_size {
6474 data.length()
6575 } else {
66- sink_write_window_size
76+ self.write_window_size
6777 }
68- let buffer = FixedArray ::makei(length, i => data[i] )
78+ let buffer = data[:length].to_fixedarray( )
6979 let written = (self.write)(buffer[:])
7080 guard written >= 0 && written <= length
7181 if !(self.is_open)() && written < length && (self.has_cleanup)() {
@@ -314,7 +324,7 @@ fn[X] fill_stream_pipe_from_writers(pipe : Ref[StreamPipe[X]]) -> Unit {
314324 guard take_stream_pipe_writer(pipe) is Some (writer) else { return }
315325 guard writer.value is Some (data) else { continue }
316326 let take = if available < data.length() { available } else { data.length() }
317- let chunk = FixedArray ::makei(take, i => data[i ])
327+ let chunk = FixedArray ::from_array( data[:take ])
318328 pipe.val.chunks.push_back(chunk)
319329 pipe.val.buffered = pipe.val.buffered + take
320330 wake_stream_pipe_writer(writer, take)
@@ -415,7 +425,7 @@ async fn[X] stream_pipe_write(
415425 } else {
416426 data.length()
417427 }
418- let chunk = FixedArray ::makei(take, i => data[i ])
428+ let chunk = FixedArray ::from_array( data[:take ])
419429 wake_stream_pipe_reader(reader, Some (chunk), false )
420430 return take
421431 }
@@ -424,13 +434,13 @@ async fn[X] stream_pipe_write(
424434 if pipe.val.capacity > 0 && pipe.val.buffered < pipe.val.capacity {
425435 let available = pipe.val.capacity - pipe.val.buffered
426436 let take = if available < data.length() { available } else { data.length() }
427- let chunk = FixedArray ::makei(take, i => data[i ])
437+ let chunk = FixedArray ::from_array( data[:take ])
428438 pipe.val.chunks.push_back(chunk)
429439 pipe.val.buffered = pipe.val.buffered + take
430440 return take
431441 }
432442 let writer = StreamPipeWriter ::{
433- value: Some (FixedArray ::makei (data.length(), i => data[i] )),
443+ value: Some (FixedArray ::from_array (data)),
434444 accepted: 0,
435445 coro: Some (current_coroutine()),
436446 }
@@ -463,7 +473,9 @@ async fn[X] stream_pipe_read(
463473 Some (head) => {
464474 let available = head.length() - pipe.val.head_pos
465475 let take = if count < available { count } else { available }
466- let result = FixedArray ::makei(take, i => head[pipe.val.head_pos + i])
476+ let result = FixedArray ::from_array(
477+ head[pipe.val.head_pos:pipe.val.head_pos + take],
478+ )
467479 pipe.val.head_pos = pipe.val.head_pos + take
468480 pipe.val.buffered = pipe.val.buffered - take
469481 if pipe.val.head_pos >= head.length() {
@@ -484,7 +496,7 @@ async fn[X] stream_pipe_read(
484496 Some (writer) => {
485497 guard writer.value is Some (data) else { continue }
486498 let take = if count < data.length() { count } else { data.length() }
487- let result = FixedArray ::makei(take, i => data[i ])
499+ let result = FixedArray ::from_array( data[:take ])
488500 wake_stream_pipe_writer(writer, take)
489501 return Some (result)
490502 }
@@ -740,6 +752,7 @@ fn[X] stream_pipe_sink(pipe : Ref[StreamPipe[X]]) -> Sink[X] {
740752 None => ()
741753 }
742754 }),
755+ write_window_size: default_sink_write_window_size,
743756 }
744757}
745758
0 commit comments