Skip to content

Commit

Permalink
Merge pull request #1682 from davidpcaldwell/refine-jrunscript-io-cha…
Browse files Browse the repository at this point in the history
…racterencoding

Improve API for inputstreams with encoding
  • Loading branch information
davidpcaldwell authored Sep 25, 2024
2 parents 43dab7e + 79c67c8 commit 15f0548
Show file tree
Hide file tree
Showing 2 changed files with 149 additions and 93 deletions.
103 changes: 64 additions & 39 deletions loader/jrunscript/io.fifty.ts
Original file line number Diff line number Diff line change
Expand Up @@ -451,11 +451,22 @@ namespace slime.jrunscript.runtime.io {
line: string
}

export type Processor<E> = {
means: slime.$api.fp.world.Means<InputStream,E>
handlers?: slime.$api.event.Handlers<E>
}

export interface StringProcessor {
all: (handlers: slime.$api.event.Handlers<Events<string>>) => Processor<Events<string>>
lines: (terminator: string) => (handlers: slime.$api.event.Handlers<LineEvents>) => Processor<LineEvents>
}

export interface Exports {
character: {
default: {
all: slime.$api.fp.world.Means<InputStream, Events<string>>
lines: (ending: string) => slime.$api.fp.world.Means<InputStream, LineEvents>
input: {
process: <E>(processor: Processor<E>) => (input: InputStream) => void

character: {
encoding: (encoding?: string) => StringProcessor
}
}
}
Expand All @@ -465,55 +476,69 @@ namespace slime.jrunscript.runtime.io {
fifty: slime.fifty.test.Kit
) {
const { verify } = fifty;
const { $api, jsh } = fifty.global;

fifty.tests.exports.character = fifty.test.Parent();
var original = "foo\nbar\nbaz";

fifty.tests.exports.character.default = fifty.test.Parent();
fifty.tests.exports.input = fifty.test.Parent();

var original = "foo\nbar\nbaz";
fifty.tests.exports.input.processor = fifty.test.Parent();

fifty.tests.exports.character.default.all = function() {
fifty.tests.exports.input.processor.string = function() {
var input = test.subject.InputStream.from.string.default(original);
var all: string;
$api.fp.world.Means.now({
means: test.subject.character.default.all,
order: input,
handlers: {
test.subject.input.process(
test.subject.input.character.encoding().all({
progress: function(e) {
all = e.detail;
}
}
});
})
)(input);
verify(all).is(original);
}

var lines = function(original: string, expected: string[]) {
var input = test.subject.InputStream.from.string.default(original);
var lines: string[] = [];
var all: string = "";
$api.fp.world.Means.now({
means: test.subject.character.default.lines("\n"),
order: input,
handlers: {
progress: function(e) {
all += e.detail;
},
line: function(e) {
lines.push(e.detail);
}
}
fifty.tests.exports.input.processor.lines = function() {
fifty.run(function noTerimnator() {
var input = test.subject.InputStream.from.string.default(original);
var all: string = "";
var lines: string[] = [];
test.subject.input.process(
test.subject.input.character.encoding().lines("\n")({
progress: function(e) {
all += e.detail;
},
line: function(e) {
lines.push(e.detail);
}
})
)(input);
verify(all).is(original);
verify(lines).length.is(3);
verify(lines)[0].is("foo");
verify(lines)[1].is("bar");
verify(lines)[2].is("baz");
});
verify(all).is(original);
verify(lines).length.is(expected.length);
for (var i=0; i<expected.length; i++) {
verify(lines)[i].is(expected[i]);
}
}

fifty.tests.exports.character.default.lines = function() {
lines(original, ["foo","bar","baz"]);
lines(original + "\n", ["foo","bar","baz",""]);
fifty.run(function terminator() {
var input = test.subject.InputStream.from.string.default(original + "\n");
var all: string = "";
var lines: string[] = [];
test.subject.input.process(
test.subject.input.character.encoding().lines("\n")({
progress: function(e) {
all += e.detail;
},
line: function(e) {
lines.push(e.detail);
}
})
)(input);
verify(all).is(original + "\n");
verify(lines).length.is(4);
verify(lines)[0].is("foo");
verify(lines)[1].is("bar");
verify(lines)[2].is("baz");
verify(lines)[3].is("");
})
}
}
//@ts-ignore
Expand Down
139 changes: 85 additions & 54 deletions loader/jrunscript/io.js
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,71 @@
}
};

var input = {
character: {
encoding: function(charset) {
if (!charset) charset = String(Packages.java.nio.charset.Charset.defaultCharset().name());
return {
all: function(input) {
return function(events) {
// TODO or use Packages.java.nio.charset.StandardCharsets.UTF_8?
var charset = String(Packages.java.nio.charset.Charset.defaultCharset().name());
var reader = input.character({ charset: charset });
$context._streams.readAll(
reader.java.adapt(),
new JavaAdapter(
Packages.inonit.script.runtime.io.Streams.ReadEvents,
{
progress: function(string) {
events.fire("progress", String(string));
},
error: function(e) {
// TODO improve
throw new Error();
},
done: function() {
events.fire("done");
}
}
)
);
}
},
lines: function(ending) {
return function(input) {
return function(events) {
var charset = String(Packages.java.nio.charset.Charset.defaultCharset().name());
var reader = input.character({ charset: charset });
$context._streams.readLines(
reader.java.adapt(),
ending,
new JavaAdapter(
Packages.inonit.script.runtime.io.Streams.ReadEvents,
{
progress: function(_string) {
var string = String(_string);
events.fire("progress", string);
var terminated = string.substring(string.length - ending.length) == ending;
events.fire("line", (terminated) ? string.substring(0, string.length - ending.length) : string);
},
error: function(e) {
// TODO improve
throw new Error();
},
done: function() {
events.fire("done");
}
}
)
);
}
}
}
}
}
}
};

$export({
InputStream: {
from: {
Expand Down Expand Up @@ -408,62 +473,28 @@
line: LINE_SEPARATOR
}
},
character: {
default: {
all: function(input) {
return function(events) {
// TODO or use Packages.java.nio.charset.StandardCharsets.UTF_8?
var charset = String(Packages.java.nio.charset.Charset.defaultCharset().name());
var reader = input.character({ charset: charset });
$context._streams.readAll(
reader.java.adapt(),
new JavaAdapter(
Packages.inonit.script.runtime.io.Streams.ReadEvents,
{
progress: function(string) {
events.fire("progress", String(string));
},
error: function(e) {
// TODO improve
throw new Error();
},
done: function() {
events.fire("done");
}
input: {
process: function(processor) {
return $api.fp.world.Means.output(processor);
},
character: {
encoding: function(encoding) {
return {
all: function(handlers) {
return {
means: input.character.encoding(encoding).all,
handlers: handlers
}
},
lines: function(terminator) {
return function(handlers) {
return {
means: input.character.encoding(encoding).lines(terminator),
handlers: handlers
}
)
);
}
},
lines: function(ending) {
return function(input) {
return function(events) {
var charset = String(Packages.java.nio.charset.Charset.defaultCharset().name());
var reader = input.character({ charset: charset });
$context._streams.readLines(
reader.java.adapt(),
ending,
new JavaAdapter(
Packages.inonit.script.runtime.io.Streams.ReadEvents,
{
progress: function(_string) {
var string = String(_string);
events.fire("progress", string);
var terminated = string.substring(string.length - ending.length) == ending;
events.fire("line", (terminated) ? string.substring(0, string.length - ending.length) : string);
},
error: function(e) {
// TODO improve
throw new Error();
},
done: function() {
events.fire("done");
}
}
)
);
}
}
};
}
}
}
}
Expand Down

0 comments on commit 15f0548

Please sign in to comment.