filter_iterator.iterator = it;
filter_iterator.predicate = predicate;
- next :: ($T: type_expr, data: rawptr) -> (T, bool) {
- fi := cast(^FilterIterator(T)) data;
-
+ next :: ($T: type_expr, fi: ^FilterIterator(T)) -> (T, bool) {
value, cont := fi.iterator.next(fi.iterator.data);
if cont {
while !fi.predicate(value) {
}
}
- close :: ($T: type_expr, data: rawptr) {
- fi := cast(^FilterIterator(T)) data;
+ close :: ($T: type_expr, fi: ^FilterIterator(T)) {
fi.iterator.close(fi.iterator.data);
- cfree(data);
+ cfree(fi);
}
return .{
map_iterator.iterator = it;
map_iterator.transform = transform;
- next :: ($T: type_expr, $R: type_expr, data: rawptr) -> (R, bool) {
- mi := cast(^MapIterator(T, R)) data;
-
+ next :: ($T: type_expr, $R: type_expr, mi: ^MapIterator(T, R)) -> (R, bool) {
value, cont := mi.iterator.next(mi.iterator.data);
if !cont do return value, false;
return mi.transform(value), true;
}
- close :: ($T: type_expr, $R: type_expr, data: rawptr) {
- mi := cast(^MapIterator(T, R)) data;
+ close :: ($T: type_expr, $R: type_expr, mi: ^MapIterator(T, R)) {
mi.iterator.close(mi.iterator.data);
- cfree(data);
+ cfree(mi);
}
return .{
take_iterator.iterator = it;
take_iterator.remaining = count;
- next :: ($T: type_expr, data: rawptr) -> (T, bool) {
- ti := cast(^TakeIterator(T)) data;
+ next :: ($T: type_expr, ti: ^TakeIterator(T)) -> (T, bool) {
if ti.remaining == 0 do return __zero_value(T), false;
ti.remaining -= 1;
return ti.iterator.next(ti.iterator.data);
}
- close :: ($T: type_expr, data: rawptr) {
- ti := cast(^TakeIterator(T)) data;
+ close :: ($T: type_expr, ti: ^TakeIterator(T)) {
ti.iterator.close(ti.iterator.data);
- cfree(data);
+ cfree(ti);
}
return .{
take_iterator.iterator = it;
take_iterator.predicate = predicate;
- next :: ($T: type_expr, data: rawptr) -> (T, bool) {
- ti := cast(^TakeIterator(T)) data;
-
+ next :: ($T: type_expr, ti: ^TakeIterator(T)) -> (T, bool) {
value, cont := ti.iterator.next(ti.iterator.data);
if !cont do return value, false;
return value, ti.predicate(value);
}
- close :: ($T: type_expr, data: rawptr) {
- ti := cast(^TakeIterator(T)) data;
+ close :: ($T: type_expr, ti: ^TakeIterator(T)) {
ti.iterator.close(ti.iterator.data);
- cfree(data);
+ cfree(ti);
}
return .{
skip_iterator.iterator = it;
skip_iterator.to_skip = count;
- next :: ($T: type_expr, data: rawptr) -> (T, bool) {
- si := cast(^SkipIterator(T)) data;
-
+ next :: ($T: type_expr, si: ^SkipIterator(T)) -> (T, bool) {
while !si.skipped && si.to_skip > 0 {
si.to_skip -= 1;
value, cont := si.iterator.next(si.iterator.data);
return si.iterator.next(si.iterator.data);
}
- close :: ($T: type_expr, data: rawptr) {
- si := cast(^SkipIterator(T)) data;
+ close :: ($T: type_expr, si: ^SkipIterator(T)) {
si.iterator.close(si.iterator.data);
- cfree(data);
+ cfree(si);
}
return .{
zipped_iterator.iterator1 = left_iterator;
zipped_iterator.iterator2 = right_iterator;
- next :: ($T: type_expr, $R: type_expr, data: rawptr) -> (Zipped(T, R), bool) {
- zi := cast(^ZippedIterator(T, R)) data;
-
+ next :: ($T: type_expr, $R: type_expr, zi: ^ZippedIterator(T, R)) -> (Zipped(T, R), bool) {
v1, cont1 := zi.iterator1.next(zi.iterator1.data);
v2, cont2 := zi.iterator2.next(zi.iterator2.data);
return .{ v1, v2 }, cont1 && cont2;
}
- close :: ($T: type_expr, $R: type_expr, data: rawptr) {
- zi := cast(^ZippedIterator(T, R)) data;
+ close :: ($T: type_expr, $R: type_expr, zi: ^ZippedIterator(T, R)) {
zi.iterator1.close(zi.iterator1.data);
zi.iterator2.close(zi.iterator2.data);
- cfree(data);
+ cfree(zi);
}
return .{
const :: (value: $T) -> Iterator(T) {
next :: ($T: type_expr, data: rawptr) -> (T, bool) {
- value := *(cast(^T) data);
- return value, true;
+ return *(cast(^T) data), true;
}
allocated := cast(^T) calloc(sizeof T);
// ROBUSTNESS: Currently, this only gives the first file, which for a lot of purposes, will be enough.
// But if multiple files are dropped, the application will only know about the first one.
- ev.dataTransfer.items[0].getAsFile().arrayBuffer()
- .then(response => {
- // 0 is assumed to be reserved in request_file.onyx.
- requested_file_data[0] = response;
- push_event_to_buffer(esp, event_size, 0x08, [0x01, 0, response.byteLength]);
- })
- .catch(error => {
- push_event_to_buffer(esp, event_size, 0x08, [0x02, 0, 0]);
- });
+ var response = ev.dataTransfer.items[0].getAsFile();
+ response.arrayBuffer().then(data => {
+ // 0 is assumed to be reserved in request_file.onyx.
+ requested_file_data[0] = {
+ name: response.name,
+ data: data,
+ };
+ push_event_to_buffer(esp, event_size, 0x08, [0x01, 0, data.byteLength, response.name.length ]);
+ })
+ .catch(error => {
+ push_event_to_buffer(esp, event_size, 0x08, [0x02, 0, 0, 0]);
+ });
return false;
});
fetch(path)
.then(response => response.arrayBuffer())
.then(array_buffer => {
- requested_file_data[fileid] = array_buffer;
+ requested_file_data[fileid] = {
+ name: path,
+ data: array_buffer,
+ };
- push_event_to_buffer(esp, event_size, 0x09, [ 0x01, fileid, array_buffer.byteLength ]);
+ push_event_to_buffer(esp, event_size, 0x09, [ 0x01, fileid, array_buffer.byteLength, path.length ]);
})
.catch((error) => {
- push_event_to_buffer(esp, event_size, 0x09, [ 0x02, fileid, 0 ]);
+ push_event_to_buffer(esp, event_size, 0x09, [ 0x02, fileid, 0, 0 ]);
});
},
- get_requested_file_data(fileid, bufferptr, bufferlen) {
+ get_requested_file_data(fileid, bufferptr, bufferlen, nameptr, namelen) {
var file_data = requested_file_data[fileid];
if (file_data == null) return 0;
- if (bufferlen < file_data.byteLength) return 0;
+ if (bufferlen < file_data.data.byteLength) return 0;
let WASM_U8 = new Uint8Array(ONYX_MEMORY.buffer);
- var u8_data = new Uint8Array(file_data);
+ var u8_data = new Uint8Array(file_data.data);
WASM_U8.set(u8_data, bufferptr);
+ if (namelen >= file_data.name.length) {
+ var name_data = new TextEncoder().encode(file_data.name);
+ WASM_U8.set(name_data, nameptr);
+ }
+
requested_file_data[fileid] = null;
delete requested_file_data[fileid];