Update implementations for simplified binary syntax.
As part of this, I noticed a problem when updating the Rust implementation. With the BF..84 design for annotations, if you are wanting to skip annotations—for example, if you're parsing incrementally, SAX-style, ignoring annotations—then with any parenthesised form you have to remember to check for and skip something after reading a term. This is awkward, so I want to revisit the design of annotations and go back to the prefix-form (85..) of the current-mainline design.
This commit is contained in:
parent
6cbfefc76d
commit
b7a2acf65b
|
@ -218,19 +218,11 @@ PRESERVES_INLINE int preserves_pool_alloc_bytes(preserves_pool_t *pool,
|
|||
typedef enum preserves_binary_format_tag {
|
||||
PRESERVES_BINARY_FORMAT_TAG_FALSE = 0x80,
|
||||
PRESERVES_BINARY_FORMAT_TAG_TRUE = 0x81,
|
||||
PRESERVES_BINARY_FORMAT_TAG_FLOAT = 0x82,
|
||||
PRESERVES_BINARY_FORMAT_TAG_DOUBLE = 0x83,
|
||||
PRESERVES_BINARY_FORMAT_TAG_END = 0x84,
|
||||
PRESERVES_BINARY_FORMAT_TAG_ANNOTATION = 0x85,
|
||||
PRESERVES_BINARY_FORMAT_TAG_EMBEDDED = 0x86,
|
||||
PRESERVES_BINARY_FORMAT_TAG_IEEE754 = 0x87,
|
||||
|
||||
PRESERVES_BINARY_FORMAT_TAG_SMALL_INTEGER_LO = 0x90,
|
||||
PRESERVES_BINARY_FORMAT_TAG_SMALL_INTEGER_HI = 0x9F,
|
||||
|
||||
PRESERVES_BINARY_FORMAT_TAG_MEDIUM_INTEGER_LO = 0xA0,
|
||||
PRESERVES_BINARY_FORMAT_TAG_MEDIUM_INTEGER_HI = 0xAF,
|
||||
|
||||
PRESERVES_BINARY_FORMAT_TAG_LARGE_INTEGER = 0xB0,
|
||||
PRESERVES_BINARY_FORMAT_TAG_SIGNED_INTEGER = 0xB0,
|
||||
PRESERVES_BINARY_FORMAT_TAG_STRING = 0xB1,
|
||||
PRESERVES_BINARY_FORMAT_TAG_BYTE_STRING = 0xB2,
|
||||
PRESERVES_BINARY_FORMAT_TAG_SYMBOL = 0xB3,
|
||||
|
@ -239,6 +231,8 @@ typedef enum preserves_binary_format_tag {
|
|||
PRESERVES_BINARY_FORMAT_TAG_SEQUENCE = 0xB5,
|
||||
PRESERVES_BINARY_FORMAT_TAG_SET = 0xB6,
|
||||
PRESERVES_BINARY_FORMAT_TAG_DICTIONARY = 0xB7,
|
||||
|
||||
PRESERVES_BINARY_FORMAT_TAG_ANNOTATION = 0xBF,
|
||||
} preserves_binary_format_tag_t;
|
||||
|
||||
PRESERVES_OUTOFLINE
|
||||
|
@ -247,12 +241,10 @@ PRESERVES_OUTOFLINE
|
|||
switch (tag) {
|
||||
case PRESERVES_BINARY_FORMAT_TAG_FALSE: return "FALSE";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_TRUE: return "TRUE";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_FLOAT: return "FLOAT";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_DOUBLE: return "DOUBLE";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_END: return "END";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_ANNOTATION: return "ANNOTATION";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_EMBEDDED: return "EMBEDDED";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_LARGE_INTEGER: return "LARGE_INTEGER";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_IEEE754: return "IEEE754";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_SIGNED_INTEGER: return "SIGNED_INTEGER";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_STRING: return "STRING";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_BYTE_STRING: return "BYTE_STRING";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_SYMBOL: return "SYMBOL";
|
||||
|
@ -260,16 +252,8 @@ PRESERVES_OUTOFLINE
|
|||
case PRESERVES_BINARY_FORMAT_TAG_SEQUENCE: return "SEQUENCE";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_SET: return "SET";
|
||||
case PRESERVES_BINARY_FORMAT_TAG_DICTIONARY: return "DICTIONARY";
|
||||
default:
|
||||
if ((tag >= PRESERVES_BINARY_FORMAT_TAG_SMALL_INTEGER_LO) &&
|
||||
(tag <= PRESERVES_BINARY_FORMAT_TAG_SMALL_INTEGER_HI)) {
|
||||
return "SMALL_INTEGER";
|
||||
} else if ((tag >= PRESERVES_BINARY_FORMAT_TAG_MEDIUM_INTEGER_LO) &&
|
||||
(tag <= PRESERVES_BINARY_FORMAT_TAG_MEDIUM_INTEGER_HI)) {
|
||||
return "MEDIUM_INTEGER";
|
||||
} else {
|
||||
return "UNKNOWN";
|
||||
}
|
||||
case PRESERVES_BINARY_FORMAT_TAG_ANNOTATION: return "ANNOTATION";
|
||||
default: return "UNKNOWN";
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -328,9 +312,11 @@ typedef enum preserves_error_code {
|
|||
PRESERVES_END_UNEXPECTED_END,
|
||||
PRESERVES_END_DICTIONARY_MISSING_VALUE,
|
||||
PRESERVES_END_RECORD_MISSING_LABEL,
|
||||
PRESERVES_END_ANNOTATION_TOO_SHORT,
|
||||
PRESERVES_END_VARINT_TOO_BIG,
|
||||
PRESERVES_END_INVALID_UTF8,
|
||||
PRESERVES_END_INVALID_TAG,
|
||||
PRESERVES_END_INVALID_IEEE754,
|
||||
} preserves_error_code_t;
|
||||
|
||||
PRESERVES_OUTOFLINE(char const *preserves_error_code_name(preserves_error_code_t code), {
|
||||
|
@ -343,9 +329,11 @@ PRESERVES_OUTOFLINE(char const *preserves_error_code_name(preserves_error_code_t
|
|||
case PRESERVES_END_UNEXPECTED_END: return "UNEXPECTED_END";
|
||||
case PRESERVES_END_DICTIONARY_MISSING_VALUE: return "DICTIONARY_MISSING_VALUE";
|
||||
case PRESERVES_END_RECORD_MISSING_LABEL: return "RECORD_MISSING_LABEL";
|
||||
case PRESERVES_END_ANNOTATION_TOO_SHORT: return "ANNOTATION_TOO_SHORT";
|
||||
case PRESERVES_END_VARINT_TOO_BIG: return "VARINT_TOO_BIG";
|
||||
case PRESERVES_END_INVALID_UTF8: return "INVALID_UTF8";
|
||||
case PRESERVES_END_INVALID_TAG: return "INVALID_TAG";
|
||||
case PRESERVES_END_INVALID_IEEE754: return "INVALID_IEEE754";
|
||||
default: return "UNKNOWN";
|
||||
}
|
||||
});
|
||||
|
@ -406,23 +394,19 @@ PRESERVES_OUTOFLINE
|
|||
- repr=PRESERVES_ESCAPED -> len, data._unsigned as absolute offset within input to utf-8 bytes
|
||||
that need Symbol-style backslash-escapes interpreted
|
||||
|
||||
PRESERVES_RECORD, PRESERVES_SEQUENCE, PRESERVES_SET, PRESERVES_DICTIONARY:
|
||||
PRESERVES_RECORD, PRESERVES_SEQUENCE, PRESERVES_SET, PRESERVES_DICTIONARY, PRESERVES_ANNOTATION:
|
||||
- repr==PRESERVES_REPR_NONE,
|
||||
- len counts number of items:
|
||||
- PRESERVES_RECORD -> number of fields plus one (for the label)
|
||||
- PRESERVES_SEQUENCE -> number of items
|
||||
- PRESERVES_SET -> number of items
|
||||
- PRESERVES_DICTIONARY -> twice the number of key-value pairs
|
||||
- PRESERVES_ANNOTATION -> number of annotations plus one (for the underlying item)
|
||||
- for PRESERVES_ANNOTATION, the annotated item will not be a PRESERVES_ANNOTATION
|
||||
- data._unsigned as relative offset within index to next item,
|
||||
starting from this entry; zero means "no end known"
|
||||
|
||||
PRESERVES_EMBEDDED: repr==PRESERVES_REPR_NONE, len==0, following item is the embedded value
|
||||
PRESERVES_ANNOTATION:
|
||||
- repr=PRESERVES_REPR_NONE,
|
||||
- len counts number of annotations,
|
||||
- data._unsigned as relative offset within index to annotated
|
||||
item, starting from this entry; zero means "no end known"
|
||||
- the annotated item will not be a PRESERVES_ANNOTATION
|
||||
|
||||
PRESERVES_END_MARKER: repr==PRESERVES_REPR_NONE, len==0, data._err
|
||||
*/
|
||||
|
@ -452,7 +436,6 @@ typedef struct preserves_reader {
|
|||
size_t stack_top; /* ascending empty */
|
||||
size_t input_pos; /* ascending full */
|
||||
size_t index_pos; /* ascending empty */
|
||||
bool annotation_tag_seen;
|
||||
} preserves_reader_t;
|
||||
|
||||
typedef struct preserves_reader_result {
|
||||
|
@ -472,7 +455,6 @@ PRESERVES_INLINE preserves_reader_t preserves_create_reader(void) {
|
|||
.stack_top = 0,
|
||||
.input_pos = 0,
|
||||
.index_pos = 0,
|
||||
.annotation_tag_seen = false,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -483,7 +465,6 @@ PRESERVES_OUTOFLINE(void preserves_free_reader(preserves_reader_t *r), {
|
|||
r->stack_top = 0;
|
||||
r->input_pos = 0;
|
||||
r->index_pos = 0;
|
||||
r->annotation_tag_seen = false;
|
||||
});
|
||||
|
||||
PRESERVES_IMPLEMENTATION_CHUNK
|
||||
|
@ -501,8 +482,8 @@ PRESERVES_IMPLEMENTATION_CHUNK
|
|||
}
|
||||
|
||||
static inline int _preserves_reader_next(preserves_reader_t *r) {
|
||||
if (r->input_pos >= r->input.len) return -1;
|
||||
int result = PRESERVES_ARRAY_ELEMENT(&r->input, uint8_t, r->input_pos);
|
||||
int result = _preserves_reader_peek(r);
|
||||
if (result == -1) return -1;
|
||||
r->input_pos++;
|
||||
return result;
|
||||
}
|
||||
|
@ -553,11 +534,6 @@ PRESERVES_IMPLEMENTATION_CHUNK
|
|||
return base;
|
||||
}
|
||||
|
||||
static inline bool _preserves_reader_in_annotations(preserves_reader_t *r) {
|
||||
return (r->stack_top > 0) &&
|
||||
(_preserves_reader_stack_top_entry(r)->type == PRESERVES_ANNOTATION);
|
||||
}
|
||||
|
||||
static inline void _preserves_reader_inc_collection_len(preserves_reader_t *r, size_t *count_ptr) {
|
||||
if (r->stack_top > 0) {
|
||||
check_for_embedded:
|
||||
|
@ -578,10 +554,6 @@ PRESERVES_IMPLEMENTATION_CHUNK
|
|||
static inline preserves_index_entry_t *_preserves_reader_emit_entry(preserves_reader_t *r,
|
||||
size_t *count_ptr,
|
||||
preserves_index_entry_t e) {
|
||||
if (!r->annotation_tag_seen && _preserves_reader_in_annotations(r)) {
|
||||
/* printf("(popping annotation collector)\n"); */
|
||||
_preserves_reader_finish_seq(r);
|
||||
}
|
||||
if (count_ptr != NULL) {
|
||||
_preserves_reader_inc_collection_len(r, count_ptr);
|
||||
}
|
||||
|
@ -594,8 +566,6 @@ PRESERVES_IMPLEMENTATION_CHUNK
|
|||
*ix = e;
|
||||
r->index_pos++;
|
||||
|
||||
r->annotation_tag_seen = false;
|
||||
|
||||
return ix;
|
||||
}
|
||||
|
||||
|
@ -618,19 +588,25 @@ PRESERVES_IMPLEMENTATION_CHUNK
|
|||
}
|
||||
}
|
||||
|
||||
static inline int _preserves_reader_varint(preserves_reader_t *r, size_t *v) {
|
||||
static inline size_t _preserves_reader_varint(preserves_reader_t *r, preserves_error_code_t *code) {
|
||||
unsigned int shift_amount = 0;
|
||||
size_t result = 0;
|
||||
while (true) {
|
||||
int b = _preserves_reader_next(r);
|
||||
if (b == -1) return -1;
|
||||
if (b == -1) {
|
||||
*code = PRESERVES_END_INCOMPLETE_INPUT;
|
||||
return 0;
|
||||
}
|
||||
result |= (b & 0x7f) << shift_amount;
|
||||
if (b & 0x80) {
|
||||
shift_amount += 7;
|
||||
if (shift_amount > ((sizeof(size_t) * 8) - 7)) return -2;
|
||||
if (shift_amount > ((sizeof(size_t) * 8) - 7)) {
|
||||
*code = PRESERVES_END_VARINT_TOO_BIG;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
*v = result;
|
||||
return 0;
|
||||
*code = PRESERVES_END_NO_ERROR;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -742,12 +718,9 @@ PRESERVES_IMPLEMENTATION_CHUNK
|
|||
size_t *count_ptr,
|
||||
preserves_type_tag_t type,
|
||||
bool should_check_utf8) {
|
||||
size_t len = 0;
|
||||
switch (_preserves_reader_varint(r, &len)) {
|
||||
case -1: return PRESERVES_END_INCOMPLETE_INPUT;
|
||||
case -2: return PRESERVES_END_VARINT_TOO_BIG;
|
||||
default: break;
|
||||
}
|
||||
preserves_error_code_t varint_err = PRESERVES_END_NO_ERROR;
|
||||
size_t len = _preserves_reader_varint(r, &varint_err);
|
||||
if (varint_err != PRESERVES_END_NO_ERROR) return varint_err;
|
||||
size_t starting_pos = r->input_pos;
|
||||
uint8_t *maybe_utf = _preserves_reader_next_bytes(r, len);
|
||||
if (should_check_utf8 && (check_utf8(maybe_utf, len) == -1)) {
|
||||
|
@ -784,7 +757,7 @@ PRESERVES_IMPLEMENTATION_CHUNK
|
|||
PRESERVES_INLINE preserves_index_entry_t *preserves_skip_annotations(preserves_index_entry_t *ix) {
|
||||
if (ix == NULL) return NULL;
|
||||
if (ix->type != PRESERVES_ANNOTATION) return ix;
|
||||
ix += ix->data._unsigned;
|
||||
ix++;
|
||||
if (ix->type == PRESERVES_ANNOTATION) abort();
|
||||
return ix;
|
||||
}
|
||||
|
@ -799,11 +772,10 @@ PRESERVES_OUTOFLINE
|
|||
/* printf(" %02d: (%5lu) ", i, ip); */
|
||||
/* preserves_dump_index_entry(stdout, &r->input, _preserves_reader_index_entry(r, ip), true); */
|
||||
/* } */
|
||||
/* printf("pos %lu (%05lx), count %lu, annotation tag seen %d: ", */
|
||||
/* printf("pos %lu (%05lx), count %lu: ", */
|
||||
/* r->input_pos, */
|
||||
/* r->input_pos, */
|
||||
/* count, */
|
||||
/* r->annotation_tag_seen); */
|
||||
/* count); */
|
||||
int b = _preserves_reader_next(r);
|
||||
/* printf("tag 0x%02x %s\n", b, preserves_binary_format_tag_name(b)); */
|
||||
if (b == -1) return _preserves_reader_finish(r, PRESERVES_END_INCOMPLETE_INPUT);
|
||||
|
@ -823,36 +795,43 @@ PRESERVES_OUTOFLINE
|
|||
}}));
|
||||
break;
|
||||
|
||||
case PRESERVES_BINARY_FORMAT_TAG_FLOAT: {
|
||||
uint8_t *bs = _preserves_reader_next_bytes(r, 4);
|
||||
case PRESERVES_BINARY_FORMAT_TAG_IEEE754: {
|
||||
preserves_error_code_t varint_err = PRESERVES_END_NO_ERROR;
|
||||
size_t len = _preserves_reader_varint(r, &varint_err);
|
||||
if (varint_err != PRESERVES_END_NO_ERROR) return _preserves_reader_finish(r, varint_err);
|
||||
uint8_t *bs = _preserves_reader_next_bytes(r, len);
|
||||
if (bs == NULL) return _preserves_reader_finish(r, PRESERVES_END_INCOMPLETE_INPUT);
|
||||
uint32_t i;
|
||||
memcpy(&i, bs, 4);
|
||||
i = ntohl(i);
|
||||
float f;
|
||||
memcpy(&f, &i, 4);
|
||||
RETURN_ON_FAIL(_preserves_reader_emit_entry(r, &count, (preserves_index_entry_t) {
|
||||
.type = PRESERVES_FLOAT, .repr = PRESERVES_REPR_NONE, .len = 0, .data = {
|
||||
._float = f
|
||||
}}));
|
||||
break;
|
||||
}
|
||||
|
||||
case PRESERVES_BINARY_FORMAT_TAG_DOUBLE: {
|
||||
uint8_t *bs = _preserves_reader_next_bytes(r, 8);
|
||||
if (bs == NULL) return _preserves_reader_finish(r, PRESERVES_END_INCOMPLETE_INPUT);
|
||||
uint32_t lo, hi;
|
||||
memcpy(&hi, bs, 4);
|
||||
memcpy(&lo, bs + 4, 4);
|
||||
lo = ntohl(lo);
|
||||
hi = ntohl(hi);
|
||||
uint64_t i = (((uint64_t) hi) << 32) | ((uint64_t) lo);
|
||||
double f;
|
||||
memcpy(&f, &i, 8);
|
||||
RETURN_ON_FAIL(_preserves_reader_emit_entry(r, &count, (preserves_index_entry_t) {
|
||||
.type = PRESERVES_DOUBLE, .repr = PRESERVES_REPR_NONE, .len = 0, .data = {
|
||||
._double = f
|
||||
}}));
|
||||
switch (len) {
|
||||
case 4: {
|
||||
uint32_t i;
|
||||
memcpy(&i, bs, 4);
|
||||
i = ntohl(i);
|
||||
float f;
|
||||
memcpy(&f, &i, 4);
|
||||
RETURN_ON_FAIL(_preserves_reader_emit_entry(r, &count, (preserves_index_entry_t) {
|
||||
.type = PRESERVES_FLOAT, .repr = PRESERVES_REPR_NONE, .len = 0, .data = {
|
||||
._float = f
|
||||
}}));
|
||||
break;
|
||||
}
|
||||
case 8: {
|
||||
uint32_t lo, hi;
|
||||
memcpy(&hi, bs, 4);
|
||||
memcpy(&lo, bs + 4, 4);
|
||||
lo = ntohl(lo);
|
||||
hi = ntohl(hi);
|
||||
uint64_t i = (((uint64_t) hi) << 32) | ((uint64_t) lo);
|
||||
double f;
|
||||
memcpy(&f, &i, 8);
|
||||
RETURN_ON_FAIL(_preserves_reader_emit_entry(r, &count, (preserves_index_entry_t) {
|
||||
.type = PRESERVES_DOUBLE, .repr = PRESERVES_REPR_NONE, .len = 0, .data = {
|
||||
._double = f
|
||||
}}));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return _preserves_reader_finish(r, PRESERVES_END_INVALID_IEEE754);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -868,26 +847,19 @@ PRESERVES_OUTOFLINE
|
|||
if ((base->type == PRESERVES_RECORD) && (base->len == 0)) {
|
||||
return _preserves_reader_finish(r, PRESERVES_END_RECORD_MISSING_LABEL);
|
||||
}
|
||||
break;
|
||||
|
||||
case PRESERVES_BINARY_FORMAT_TAG_ANNOTATION:
|
||||
if (r->annotation_tag_seen || !_preserves_reader_in_annotations(r)) {
|
||||
RETURN_ON_FAIL(_preserves_reader_push(r, PRESERVES_ANNOTATION));
|
||||
if ((base->type == PRESERVES_ANNOTATION) && (base->len < 2)) {
|
||||
return _preserves_reader_finish(r, PRESERVES_END_ANNOTATION_TOO_SHORT);
|
||||
}
|
||||
r->annotation_tag_seen = true;
|
||||
break;
|
||||
|
||||
case PRESERVES_BINARY_FORMAT_TAG_EMBEDDED:
|
||||
RETURN_ON_FAIL(_preserves_reader_push(r, PRESERVES_EMBEDDED));
|
||||
break;
|
||||
|
||||
case PRESERVES_BINARY_FORMAT_TAG_LARGE_INTEGER: {
|
||||
size_t len = 0;
|
||||
switch (_preserves_reader_varint(r, &len)) {
|
||||
case -1: return _preserves_reader_finish(r, PRESERVES_END_INCOMPLETE_INPUT);
|
||||
case -2: return _preserves_reader_finish(r, PRESERVES_END_VARINT_TOO_BIG);
|
||||
default: break;
|
||||
}
|
||||
case PRESERVES_BINARY_FORMAT_TAG_SIGNED_INTEGER: {
|
||||
preserves_error_code_t varint_err = PRESERVES_END_NO_ERROR;
|
||||
size_t len = _preserves_reader_varint(r, &varint_err);
|
||||
if (varint_err != PRESERVES_END_NO_ERROR) return _preserves_reader_finish(r, varint_err);
|
||||
if (_preserves_reader_decode_intbytes(r, &count, len) == -1) {
|
||||
return _preserves_reader_finish(r, PRESERVES_END_INCOMPLETE_INPUT);
|
||||
}
|
||||
|
@ -931,22 +903,12 @@ PRESERVES_OUTOFLINE
|
|||
RETURN_ON_FAIL(_preserves_reader_push(r, PRESERVES_DICTIONARY));
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((b >= PRESERVES_BINARY_FORMAT_TAG_SMALL_INTEGER_LO) &&
|
||||
(b <= PRESERVES_BINARY_FORMAT_TAG_SMALL_INTEGER_HI)) {
|
||||
int64_t value = b - PRESERVES_BINARY_FORMAT_TAG_SMALL_INTEGER_LO;
|
||||
if (value > 12) value -= 16;
|
||||
RETURN_ON_FAIL(_preserves_emit_small_int(r, &count, false, value));
|
||||
} else if ((b >= PRESERVES_BINARY_FORMAT_TAG_MEDIUM_INTEGER_LO) &&
|
||||
(b <= PRESERVES_BINARY_FORMAT_TAG_MEDIUM_INTEGER_HI)) {
|
||||
size_t len = (b - PRESERVES_BINARY_FORMAT_TAG_MEDIUM_INTEGER_LO) + 1;
|
||||
if (_preserves_reader_decode_intbytes(r, &count, len) == -1) {
|
||||
return _preserves_reader_finish(r, PRESERVES_END_INCOMPLETE_INPUT);
|
||||
}
|
||||
} else {
|
||||
return _preserves_reader_finish(r, PRESERVES_END_INVALID_TAG);
|
||||
}
|
||||
case PRESERVES_BINARY_FORMAT_TAG_ANNOTATION:
|
||||
RETURN_ON_FAIL(_preserves_reader_push(r, PRESERVES_ANNOTATION));
|
||||
break;
|
||||
|
||||
default:
|
||||
return _preserves_reader_finish(r, PRESERVES_END_INVALID_TAG);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -975,7 +937,6 @@ PRESERVES_OUTOFLINE
|
|||
r->stack_top = 0;
|
||||
r->input_pos = 0;
|
||||
r->index_pos = 0;
|
||||
r->annotation_tag_seen = false;
|
||||
preserves_bytes_move(&r->input, input);
|
||||
|
||||
return preserves_read_binary_continue(r, count);
|
||||
|
@ -1039,11 +1000,11 @@ PRESERVES_IMPLEMENTATION_CHUNK
|
|||
case PRESERVES_SEQUENCE:
|
||||
case PRESERVES_SET:
|
||||
case PRESERVES_DICTIONARY:
|
||||
case PRESERVES_ANNOTATION:
|
||||
fprintf(f, " skip %lu", i->data._unsigned - 1);
|
||||
break;
|
||||
|
||||
case PRESERVES_EMBEDDED:
|
||||
case PRESERVES_ANNOTATION:
|
||||
break;
|
||||
|
||||
case PRESERVES_END_MARKER:
|
||||
|
|
|
@ -24,14 +24,14 @@ TEST(Value, Basics) {
|
|||
}
|
||||
|
||||
TEST(BinaryReader, Negative257) {
|
||||
istringstream input("\xA1\xFE\xFF");
|
||||
istringstream input("\xB0\x02\xFE\xFF");
|
||||
auto v = BinaryReader<>(input).next();
|
||||
ASSERT_TRUE(v);
|
||||
ASSERT_EQ(v->to_signed(), -257);
|
||||
}
|
||||
|
||||
TEST(BinaryReader, Negative127) {
|
||||
istringstream input("\xA0\x81");
|
||||
istringstream input("\xB0\x01\x81");
|
||||
auto v = BinaryReader<>(input).next();
|
||||
ASSERT_TRUE(v);
|
||||
ASSERT_EQ(v->to_signed(), -127);
|
||||
|
@ -42,9 +42,10 @@ TEST(BinaryWriter, Negative257) {
|
|||
BinaryWriter w(s);
|
||||
w << -257;
|
||||
std::string output(s.str());
|
||||
ASSERT_EQ(output[0], char(BinaryTag::MediumInteger_lo) + 1);
|
||||
ASSERT_EQ(output[1], char(0xFE));
|
||||
ASSERT_EQ(output[2], char(0xFF));
|
||||
ASSERT_EQ(output[0], char(BinaryTag::SignedInteger));
|
||||
ASSERT_EQ(output[1], char(0x02));
|
||||
ASSERT_EQ(output[2], char(0xFE));
|
||||
ASSERT_EQ(output[3], char(0xFF));
|
||||
}
|
||||
|
||||
TEST(BinaryWriter, Negative127) {
|
||||
|
@ -52,8 +53,9 @@ TEST(BinaryWriter, Negative127) {
|
|||
BinaryWriter w(s);
|
||||
w << -127;
|
||||
std::string output(s.str());
|
||||
ASSERT_EQ(output[0], char(BinaryTag::MediumInteger_lo));
|
||||
ASSERT_EQ(output[1], char(0x81));
|
||||
ASSERT_EQ(output[0], char(BinaryTag::SignedInteger));
|
||||
ASSERT_EQ(output[1], char(0x01));
|
||||
ASSERT_EQ(output[2], char(0x81));
|
||||
}
|
||||
|
||||
TEST(BinaryReader, ReadSamples) {
|
||||
|
|
|
@ -95,30 +95,18 @@ namespace Preserves {
|
|||
switch (tag) {
|
||||
case BinaryTag::False: return Value<T>::from_bool(false);
|
||||
case BinaryTag::True: return Value<T>::from_bool(true);
|
||||
case BinaryTag::Float: return next_float().map(Value<T>::from_float);
|
||||
case BinaryTag::Double: return next_double().map(Value<T>::from_double);
|
||||
case BinaryTag::End: end_sentinel = true; return boost::none;
|
||||
case BinaryTag::Annotation: {
|
||||
std::vector<Value<T>> annotations;
|
||||
while (true) {
|
||||
auto ann = next();
|
||||
if (!ann) return boost::none;
|
||||
annotations.push_back(*ann);
|
||||
if (BinaryTag(i.peek()) != BinaryTag::Annotation) break;
|
||||
i.get();
|
||||
}
|
||||
auto underlying = next();
|
||||
if (!underlying) return boost::none;
|
||||
return Value<T>(new AnnotatedValue<T>(std::move(annotations), *underlying));
|
||||
}
|
||||
case BinaryTag::Embedded:
|
||||
return BinaryReader<>(i).next().map(decodeEmbedded).map(Value<T>::from_embedded);
|
||||
case BinaryTag::SmallInteger_lo ... BinaryTag::SmallInteger_hi: {
|
||||
int64_t n = int64_t(tag) - int64_t(BinaryTag::SmallInteger_lo);
|
||||
return Value<T>::from_int(n <= 12 ? n : n - 16);
|
||||
}
|
||||
case BinaryTag::MediumInteger_lo ... BinaryTag::MediumInteger_hi: {
|
||||
int n = int(tag) - int(BinaryTag::MediumInteger_lo) + 1;
|
||||
case BinaryTag::Ieee754: return varint(i).flat_map([&](size_t len)-> boost::optional<Value<T>> {
|
||||
switch (len) {
|
||||
case 4: return next_float().map(Value<T>::from_float);
|
||||
case 8: return next_double().map(Value<T>::from_double);
|
||||
default: return boost::none;
|
||||
}
|
||||
});
|
||||
case BinaryTag::SignedInteger: return varint(i).flat_map([&](size_t n)-> boost::optional<Value<T>> {
|
||||
if (n == 0) return Value<T>::from_int(uint64_t(0));
|
||||
if (n < 9) return next_machineword(n, false);
|
||||
if (n == 9) {
|
||||
// We can handle this with uint64_t if it's unsigned and the first byte is 0.
|
||||
|
@ -128,9 +116,6 @@ namespace Preserves {
|
|||
}
|
||||
}
|
||||
return next_bignum(n);
|
||||
}
|
||||
case BinaryTag::SignedInteger: return varint(i).flat_map([&](size_t len) {
|
||||
return next_bignum(len);
|
||||
});
|
||||
case BinaryTag::String: return varint(i).flat_map([&](size_t len)-> boost::optional<Value<T>> {
|
||||
auto s = std::make_shared<String<T>>(std::string());
|
||||
|
@ -192,6 +177,21 @@ namespace Preserves {
|
|||
s->values.emplace(*k, *v);
|
||||
}
|
||||
}
|
||||
|
||||
case BinaryTag::Annotation: return next().flat_map([&](auto underlying)-> boost::optional<Value<T>> {
|
||||
std::vector<Value<T>> annotations;
|
||||
while (true) {
|
||||
bool end_rec = false;
|
||||
auto ann = _next(end_rec);
|
||||
if (end_rec) {
|
||||
if (annotations.size() == 0) return boost::none;
|
||||
return Value<T>(new AnnotatedValue<T>(std::move(annotations), underlying));
|
||||
}
|
||||
if (!ann) return boost::none;
|
||||
annotations.push_back(*ann);
|
||||
}
|
||||
});
|
||||
|
||||
default:
|
||||
return boost::none;
|
||||
}
|
||||
|
|
|
@ -11,15 +11,9 @@ namespace Preserves {
|
|||
enum class BinaryTag {
|
||||
False = 0x80,
|
||||
True = 0x81,
|
||||
Float = 0x82,
|
||||
Double = 0x83,
|
||||
End = 0x84,
|
||||
Annotation = 0x85,
|
||||
Embedded = 0x86,
|
||||
SmallInteger_lo = 0x90,
|
||||
SmallInteger_hi = 0x9f,
|
||||
MediumInteger_lo = 0xa0,
|
||||
MediumInteger_hi = 0xaf,
|
||||
Ieee754 = 0x87,
|
||||
SignedInteger = 0xb0,
|
||||
String = 0xb1,
|
||||
ByteString = 0xb2,
|
||||
|
@ -28,6 +22,7 @@ namespace Preserves {
|
|||
Sequence = 0xb5,
|
||||
Set = 0xb6,
|
||||
Dictionary = 0xb7,
|
||||
Annotation = 0xbf,
|
||||
};
|
||||
|
||||
template <uint64_t wholeTest, uint64_t bitTest>
|
||||
|
@ -90,12 +85,9 @@ namespace Preserves {
|
|||
}
|
||||
|
||||
BinaryWriter& bignum(std::vector<uint8_t> const& n) {
|
||||
if (n.size() == 0) return (*this) << BinaryTag::SmallInteger_lo;
|
||||
size_t startOffset = 0;
|
||||
if (n[0] & 0x80) {
|
||||
if (n.size() == 1 && int8_t(n[0]) >= -3) {
|
||||
return put(uint8_t(int(BinaryTag::SmallInteger_lo) + 16 + int8_t(n[0])));
|
||||
} else {
|
||||
if (n.size() > 0) {
|
||||
if (n[0] & 0x80) {
|
||||
while (true) {
|
||||
if (startOffset == n.size() - 1) break;
|
||||
if (n[startOffset] != 0xff) break;
|
||||
|
@ -105,10 +97,6 @@ namespace Preserves {
|
|||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (n.size() == 1 && n[0] <= 12) {
|
||||
return put(uint8_t(int(BinaryTag::SmallInteger_lo) + n[0]));
|
||||
} else {
|
||||
while (true) {
|
||||
if (startOffset == n.size() - 1) break;
|
||||
|
@ -122,12 +110,8 @@ namespace Preserves {
|
|||
}
|
||||
}
|
||||
size_t count = n.size() - startOffset;
|
||||
if (count > 16) {
|
||||
(*this) << BinaryTag::SignedInteger;
|
||||
varint(count);
|
||||
} else {
|
||||
put(uint8_t(int(BinaryTag::MediumInteger_lo) + count - 1));
|
||||
}
|
||||
(*this) << BinaryTag::SignedInteger;
|
||||
varint(count);
|
||||
return write(&n[startOffset], count);
|
||||
}
|
||||
|
||||
|
@ -175,7 +159,8 @@ namespace Preserves {
|
|||
buf[1] = (n >> 16) & 0xff;
|
||||
buf[2] = (n >> 8) & 0xff;
|
||||
buf[3] = (n) & 0xff;
|
||||
(*this) << BinaryTag::Float;
|
||||
(*this) << BinaryTag::Ieee754;
|
||||
put(uint8_t(sizeof(buf)));
|
||||
return write(buf, sizeof(buf));
|
||||
}
|
||||
|
||||
|
@ -191,12 +176,14 @@ namespace Preserves {
|
|||
buf[5] = (n >> 16) & 0xff;
|
||||
buf[6] = (n >> 8) & 0xff;
|
||||
buf[7] = (n) & 0xff;
|
||||
(*this) << BinaryTag::Double;
|
||||
(*this) << BinaryTag::Ieee754;
|
||||
put(uint8_t(sizeof(buf)));
|
||||
return write(buf, sizeof(buf));
|
||||
}
|
||||
|
||||
BinaryWriter& _put_medium_int(uint64_t u, int shift, int extra) {
|
||||
put(uint8_t(int(BinaryTag::MediumInteger_lo) + (shift >> 3) + extra));
|
||||
(*this) << BinaryTag::SignedInteger;
|
||||
put(uint8_t((shift >> 3) + extra + 1));
|
||||
if (extra) put(0);
|
||||
while (shift >= 0) {
|
||||
put(uint8_t((u >> shift) & 0xff));
|
||||
|
@ -207,30 +194,19 @@ namespace Preserves {
|
|||
|
||||
template <typename T>
|
||||
typename std::enable_if<std::is_integral<T>::value, BinaryWriter&>::type operator<<(T t) {
|
||||
if (std::numeric_limits<T>::is_signed) {
|
||||
if (t == 0) {
|
||||
(*this) << BinaryTag::SignedInteger;
|
||||
put(0);
|
||||
return *this;
|
||||
} else if (std::numeric_limits<T>::is_signed) {
|
||||
auto i = static_cast<int64_t>(t);
|
||||
if (i < 0) {
|
||||
if (i >= -3) {
|
||||
return put(uint8_t(int(BinaryTag::SmallInteger_lo) + 16 + i));
|
||||
} else {
|
||||
uint64_t u;
|
||||
memcpy(&u, &i, sizeof(i));
|
||||
return _put_medium_int(u, _shift_for<0xff, 0x80>(u), 0);
|
||||
}
|
||||
} else {
|
||||
if (i <= 12) {
|
||||
return put(uint8_t(int(BinaryTag::SmallInteger_lo) + i));
|
||||
} else {
|
||||
uint64_t u;
|
||||
memcpy(&u, &i, sizeof(i));
|
||||
return _put_medium_int(u, _shift_for<0x00, 0x00>(u), 0);
|
||||
}
|
||||
}
|
||||
uint64_t u;
|
||||
memcpy(&u, &i, sizeof(i));
|
||||
int shift = i < 0 ? _shift_for<0xff, 0x80>(u) : _shift_for<0x00, 0x00>(u);
|
||||
return _put_medium_int(u, shift, 0);
|
||||
} else {
|
||||
auto u = static_cast<uint64_t>(t);
|
||||
if (u <= 12) {
|
||||
return put(uint8_t(int(BinaryTag::SmallInteger_lo) + u));
|
||||
} else if ((u & 0x8000000000000000) != 0) {
|
||||
if ((u & 0x8000000000000000) != 0) {
|
||||
return _put_medium_int(u, 56, 1);
|
||||
} else {
|
||||
return _put_medium_int(u, _shift_for<0x00, 0x00>(u), 0);
|
||||
|
@ -259,5 +235,10 @@ namespace Preserves {
|
|||
for (auto& i : vs) { (*this) << i.first << i.second; }
|
||||
return (*this) << BinaryTag::End;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
BinaryWriter& annotated(Value<T> const& underlying, std::vector<Value<T>> const& vs) {
|
||||
return (*this) << BinaryTag::Annotation << underlying << iterable(vs) << BinaryTag::End;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -333,8 +333,7 @@ namespace Preserves {
|
|||
}
|
||||
|
||||
BinaryWriter& write(BinaryWriter &w) const override {
|
||||
for (auto& v : anns) { w << BinaryTag::Annotation << v; }
|
||||
return w << underlying;
|
||||
return w.annotated(underlying, anns);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -4,11 +4,12 @@
|
|||
"devDependencies": {
|
||||
"@rollup/plugin-terser": "^0.4",
|
||||
"@types/jest": "^27.0",
|
||||
"@types/node": "^20.8.5",
|
||||
"jest": "^27.4",
|
||||
"lerna": "^4.0",
|
||||
"rollup": "^3.10",
|
||||
"ts-jest": "^27.0",
|
||||
"ts-node-dev": "^1.1",
|
||||
"ts-node-dev": "^2.0.0",
|
||||
"typescript": "^4.9",
|
||||
"typescript-language-server": "^3.0"
|
||||
},
|
||||
|
|
|
@ -72,13 +72,16 @@ export class Annotated<T = GenericEmbedded> implements Preservable<T>, PreserveW
|
|||
}
|
||||
|
||||
__preserve_on__(encoder: Encoder<T>): void {
|
||||
if (encoder.includeAnnotations) {
|
||||
if (encoder.includeAnnotations && this.annotations.length > 0) {
|
||||
encoder.state.emitbyte(Tag.Annotated);
|
||||
encoder.push(this.item);
|
||||
for (const a of this.annotations) {
|
||||
encoder.state.emitbyte(Tag.Annotation);
|
||||
encoder.push(a);
|
||||
}
|
||||
encoder.state.emitbyte(Tag.End);
|
||||
} else {
|
||||
encoder.push(this.item);
|
||||
}
|
||||
encoder.push(this.item);
|
||||
}
|
||||
|
||||
__preserve_text_on__(w: Writer<T>): void {
|
||||
|
|
|
@ -1,14 +1,9 @@
|
|||
export enum Tag {
|
||||
False = 0x80,
|
||||
True,
|
||||
Float,
|
||||
Double,
|
||||
End,
|
||||
Annotation,
|
||||
Embedded,
|
||||
|
||||
SmallInteger_lo = 0x90,
|
||||
MediumInteger_lo = 0xa0,
|
||||
End = 0x84,
|
||||
Embedded = 0x86,
|
||||
Ieee754,
|
||||
|
||||
SignedInteger = 0xb0,
|
||||
String,
|
||||
|
@ -18,4 +13,6 @@ export enum Tag {
|
|||
Sequence,
|
||||
Set,
|
||||
Dictionary,
|
||||
|
||||
Annotated = 0xbf,
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ export interface TypedDecoder<T> {
|
|||
atEnd(): boolean;
|
||||
|
||||
mark(): any;
|
||||
restoreMark(m: any): void;
|
||||
restoreMark(m: any): undefined;
|
||||
|
||||
skip(): void;
|
||||
next(): Value<T>;
|
||||
|
@ -85,8 +85,9 @@ export class DecoderState {
|
|||
return this.index;
|
||||
}
|
||||
|
||||
restoreMark(m: number): void {
|
||||
restoreMark(m: number): undefined {
|
||||
this.index = m;
|
||||
return void 0;
|
||||
}
|
||||
|
||||
shortGuard<R>(body: () => R, short: () => R): R {
|
||||
|
@ -138,28 +139,9 @@ export class DecoderState {
|
|||
return acc;
|
||||
}
|
||||
|
||||
nextSmallOrMediumInteger(tag: number): number | undefined {
|
||||
if (tag >= Tag.SmallInteger_lo && tag <= Tag.SmallInteger_lo + 15) {
|
||||
const v = tag - Tag.SmallInteger_lo;
|
||||
return v > 12 ? v - 16 : v;
|
||||
}
|
||||
if (tag >= Tag.MediumInteger_lo && tag <= Tag.MediumInteger_lo + 15) {
|
||||
const n = tag - Tag.MediumInteger_lo;
|
||||
return this.nextint(n + 1);
|
||||
}
|
||||
return void 0;
|
||||
}
|
||||
|
||||
wrap<T>(v: Value<T>): Value<T> {
|
||||
return this.includeAnnotations ? new Annotated(v) : v;
|
||||
}
|
||||
|
||||
unshiftAnnotation<T>(a: Value<T>, v: Annotated<T>): Annotated<T> {
|
||||
if (this.includeAnnotations) {
|
||||
v.annotations.unshift(a);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
export const neverEmbeddedTypeDecode: EmbeddedTypeDecode<never> = {
|
||||
|
@ -216,15 +198,14 @@ export class Decoder<T = never> implements TypedDecoder<T> {
|
|||
switch (tag) {
|
||||
case Tag.False: return this.state.wrap<T>(false);
|
||||
case Tag.True: return this.state.wrap<T>(true);
|
||||
case Tag.Float: return this.state.wrap<T>(SingleFloat.fromBytes(this.state.nextbytes(4)));
|
||||
case Tag.Double: return this.state.wrap<T>(DoubleFloat.fromBytes(this.state.nextbytes(8)));
|
||||
case Tag.End: throw new DecodeError("Unexpected Compound end marker");
|
||||
case Tag.Annotation: {
|
||||
const a = this.next();
|
||||
const v = this.next() as Annotated<T>;
|
||||
return this.state.unshiftAnnotation(a, v);
|
||||
}
|
||||
case Tag.Embedded: return this.state.wrap<T>(embed(this.embeddedDecode.decode(this.state)));
|
||||
case Tag.Ieee754:
|
||||
switch (this.state.varint()) {
|
||||
case 4: return this.state.wrap<T>(SingleFloat.fromBytes(this.state.nextbytes(4)));
|
||||
case 8: return this.state.wrap<T>(DoubleFloat.fromBytes(this.state.nextbytes(8)));
|
||||
default: throw new DecodeError("Invalid IEEE754 size");
|
||||
}
|
||||
case Tag.SignedInteger: return this.state.wrap<T>(this.state.nextint(this.state.varint()));
|
||||
case Tag.String: return this.state.wrap<T>(Bytes.from(this.state.nextbytes(this.state.varint())).fromUtf8());
|
||||
case Tag.ByteString: return this.state.wrap<T>(Bytes.from(this.state.nextbytes(this.state.varint())));
|
||||
|
@ -237,13 +218,18 @@ export class Decoder<T = never> implements TypedDecoder<T> {
|
|||
case Tag.Sequence: return this.state.wrap<T>(this.nextvalues());
|
||||
case Tag.Set: return this.state.wrap<T>(new Set(this.nextvalues()));
|
||||
case Tag.Dictionary: return this.state.wrap<T>(Decoder.dictionaryFromArray(this.nextvalues()));
|
||||
default: {
|
||||
const v = this.state.nextSmallOrMediumInteger(tag);
|
||||
if (v === void 0) {
|
||||
throw new DecodeError("Unsupported Preserves tag: " + tag);
|
||||
case Tag.Annotated: {
|
||||
const vs = this.nextvalues();
|
||||
if (vs.length < 2) throw new DecodeError("Too few items in annotated value");
|
||||
if (this.state.includeAnnotations) {
|
||||
const a = vs.shift()! as Annotated<T>;
|
||||
a.annotations.push(... vs);
|
||||
return a;
|
||||
} else {
|
||||
return vs[0];
|
||||
}
|
||||
return this.state.wrap<T>(v);
|
||||
}
|
||||
default: throw new DecodeError("Unsupported Preserves tag: " + tag);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -259,8 +245,8 @@ export class Decoder<T = never> implements TypedDecoder<T> {
|
|||
return this.state.mark();
|
||||
}
|
||||
|
||||
restoreMark(m: any): void {
|
||||
this.state.restoreMark(m);
|
||||
restoreMark(m: any): undefined {
|
||||
return this.state.restoreMark(m);
|
||||
}
|
||||
|
||||
skip(): void {
|
||||
|
@ -275,99 +261,109 @@ export class Decoder<T = never> implements TypedDecoder<T> {
|
|||
return body(new Decoder(this.state, embeddedDecode));
|
||||
}
|
||||
|
||||
skipAnnotations(): void {
|
||||
if (!this.state.atEnd() && this.state.packet[this.state.index] === Tag.Annotation) {
|
||||
skipAnnotations<R>(f: (reset: () => undefined) => R): R {
|
||||
const m = this.mark();
|
||||
if (!this.state.atEnd() && this.state.packet[this.state.index] === Tag.Annotated) {
|
||||
this.state.index++;
|
||||
this.skip();
|
||||
const result = f(() => this.restoreMark(m));
|
||||
while (!this.state.peekend()) this.skip();
|
||||
return result;
|
||||
} else {
|
||||
return f(() => this.restoreMark(m));
|
||||
}
|
||||
}
|
||||
|
||||
nextBoolean(): boolean | undefined {
|
||||
this.skipAnnotations();
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.False: return false;
|
||||
case Tag.True: return true;
|
||||
default: return void 0;
|
||||
}
|
||||
return this.skipAnnotations((reset) => {
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.False: return false;
|
||||
case Tag.True: return true;
|
||||
default: return reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
nextFloat(): SingleFloat | undefined {
|
||||
this.skipAnnotations();
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.Float: return SingleFloat.fromBytes(this.state.nextbytes(4));
|
||||
default: return void 0;
|
||||
}
|
||||
return this.skipAnnotations((reset) => {
|
||||
if (this.state.nextbyte() !== Tag.Ieee754) return reset();
|
||||
if (this.state.nextbyte() !== 4) return reset();
|
||||
return SingleFloat.fromBytes(this.state.nextbytes(4));
|
||||
});
|
||||
}
|
||||
|
||||
nextDouble(): DoubleFloat | undefined {
|
||||
this.skipAnnotations();
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.Double: return DoubleFloat.fromBytes(this.state.nextbytes(8));
|
||||
default: return void 0;
|
||||
}
|
||||
return this.skipAnnotations((reset) => {
|
||||
if (this.state.nextbyte() !== Tag.Ieee754) return reset();
|
||||
if (this.state.nextbyte() !== 8) return reset();
|
||||
return DoubleFloat.fromBytes(this.state.nextbytes(8));
|
||||
});
|
||||
}
|
||||
|
||||
nextEmbedded(): Embedded<T> | undefined {
|
||||
this.skipAnnotations();
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.Embedded: return embed(this.embeddedDecode.decode(this.state));
|
||||
default: return void 0;
|
||||
}
|
||||
return this.skipAnnotations((reset) => {
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.Embedded: return embed(this.embeddedDecode.decode(this.state));
|
||||
default: return reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
nextSignedInteger(): number | undefined {
|
||||
this.skipAnnotations();
|
||||
const b = this.state.nextbyte();
|
||||
switch (b) {
|
||||
case Tag.SignedInteger: return this.state.nextint(this.state.varint());
|
||||
default: return this.state.nextSmallOrMediumInteger(b);
|
||||
}
|
||||
return this.skipAnnotations((reset) => {
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.SignedInteger: return this.state.nextint(this.state.varint());
|
||||
default: return reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
nextString(): string | undefined {
|
||||
this.skipAnnotations();
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.String: return Bytes.from(this.state.nextbytes(this.state.varint())).fromUtf8();
|
||||
default: return void 0;
|
||||
}
|
||||
return this.skipAnnotations((reset) => {
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.String: return Bytes.from(this.state.nextbytes(this.state.varint())).fromUtf8();
|
||||
default: return reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
nextByteString(): Bytes | undefined {
|
||||
this.skipAnnotations();
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.ByteString: return Bytes.from(this.state.nextbytes(this.state.varint()));
|
||||
default: return void 0;
|
||||
}
|
||||
return this.skipAnnotations((reset) => {
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.ByteString: return Bytes.from(this.state.nextbytes(this.state.varint()));
|
||||
default: return reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
nextSymbol(): symbol | undefined {
|
||||
this.skipAnnotations();
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.Symbol:
|
||||
return Symbol.for(Bytes.from(this.state.nextbytes(this.state.varint())).fromUtf8());
|
||||
default:
|
||||
return void 0;
|
||||
}
|
||||
return this.skipAnnotations((reset) => {
|
||||
switch (this.state.nextbyte()) {
|
||||
case Tag.Symbol:
|
||||
return Symbol.for(Bytes.from(this.state.nextbytes(this.state.varint())).fromUtf8());
|
||||
default:
|
||||
return reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
openRecord(): boolean {
|
||||
this.skipAnnotations();
|
||||
return (this.state.nextbyte() === Tag.Record) || (this.state.index--, false);
|
||||
return this.skipAnnotations((reset) =>
|
||||
(this.state.nextbyte() === Tag.Record) || (reset(), false));
|
||||
}
|
||||
|
||||
openSequence(): boolean {
|
||||
this.skipAnnotations();
|
||||
return (this.state.nextbyte() === Tag.Sequence) || (this.state.index--, false);
|
||||
return this.skipAnnotations((reset) =>
|
||||
(this.state.nextbyte() === Tag.Sequence) || (reset(), false));
|
||||
}
|
||||
|
||||
openSet(): boolean {
|
||||
this.skipAnnotations();
|
||||
return (this.state.nextbyte() === Tag.Set) || (this.state.index--, false);
|
||||
return this.skipAnnotations((reset) =>
|
||||
(this.state.nextbyte() === Tag.Set) || (reset(), false));
|
||||
}
|
||||
|
||||
openDictionary(): boolean {
|
||||
this.skipAnnotations();
|
||||
return (this.state.nextbyte() === Tag.Dictionary) || (this.state.index--, false);
|
||||
return this.skipAnnotations((reset) =>
|
||||
(this.state.nextbyte() === Tag.Dictionary) || (reset(), false));
|
||||
}
|
||||
|
||||
closeCompound(): boolean {
|
||||
|
|
|
@ -132,15 +132,18 @@ export class EncoderState {
|
|||
|
||||
encodeint(v: number) {
|
||||
// TODO: Bignums :-/
|
||||
const plain_bitcount = Math.floor(Math.log2(v > 0 ? v : -(1 + v))) + 1;
|
||||
this.emitbyte(Tag.SignedInteger);
|
||||
|
||||
if (v === 0) {
|
||||
this.emitbyte(0);
|
||||
return;
|
||||
}
|
||||
|
||||
const plain_bitcount = v === -1 ? 0 : Math.floor(Math.log2(v > 0 ? v : -(1 + v))) + 1;
|
||||
const signed_bitcount = plain_bitcount + 1;
|
||||
const bytecount = (signed_bitcount + 7) >> 3;
|
||||
if (bytecount <= 16) {
|
||||
this.emitbyte(Tag.MediumInteger_lo + bytecount - 1);
|
||||
} else {
|
||||
this.emitbyte(Tag.SignedInteger);
|
||||
this.varint(bytecount);
|
||||
}
|
||||
this.varint(bytecount);
|
||||
|
||||
const enc = (n: number, x: number) => {
|
||||
if (n > 0) {
|
||||
enc(n - 1, Math.floor(x / 256));
|
||||
|
@ -217,11 +220,7 @@ export class Encoder<T = object> {
|
|||
this.state.emitbyte(v ? Tag.True : Tag.False);
|
||||
}
|
||||
else if (typeof v === 'number') {
|
||||
if (v >= -3 && v <= 12) {
|
||||
this.state.emitbyte(Tag.SmallInteger_lo + ((v + 16) & 0xf));
|
||||
} else {
|
||||
this.state.encodeint(v);
|
||||
}
|
||||
this.state.encodeint(v);
|
||||
}
|
||||
else if (typeof v === 'string') {
|
||||
this.state.encodebytes(Tag.String, new Bytes(v)._view);
|
||||
|
|
|
@ -100,7 +100,8 @@ export class SingleFloat extends Float implements Preservable<any>, PreserveWrit
|
|||
}
|
||||
|
||||
__preserve_on__(encoder: Encoder<any>) {
|
||||
encoder.state.emitbyte(Tag.Float);
|
||||
encoder.state.emitbyte(Tag.Ieee754);
|
||||
encoder.state.emitbyte(4);
|
||||
encoder.state.makeroom(4);
|
||||
this.__w(encoder.state.view, encoder.state.index);
|
||||
encoder.state.index += 4;
|
||||
|
@ -143,7 +144,8 @@ export class DoubleFloat extends Float implements Preservable<any>, PreserveWrit
|
|||
}
|
||||
|
||||
__preserve_on__(encoder: Encoder<any>) {
|
||||
encoder.state.emitbyte(Tag.Double);
|
||||
encoder.state.emitbyte(Tag.Ieee754);
|
||||
encoder.state.emitbyte(8);
|
||||
encoder.state.makeroom(8);
|
||||
encoder.state.view.setFloat64(encoder.state.index, this.value, false);
|
||||
encoder.state.index += 8;
|
||||
|
|
|
@ -80,7 +80,7 @@ describe('reusing buffer space', () => {
|
|||
`b5
|
||||
b103616161
|
||||
b7
|
||||
b10161 91
|
||||
b10161 b00101
|
||||
84
|
||||
b1037a7a7a
|
||||
84`.replace(/\s+/g, ''));
|
||||
|
@ -137,7 +137,7 @@ describe('encoding and decoding embeddeds', () => {
|
|||
expect(bs1).is(bs3);
|
||||
});
|
||||
it('should refuse to decode embeddeds when no function has been supplied', () => {
|
||||
expect(() => decode(Bytes.from([Tag.Embedded, Tag.SmallInteger_lo])))
|
||||
expect(() => decode(Bytes.from([Tag.Embedded, Tag.False])))
|
||||
.toThrow("Embeddeds not permitted at this point in Preserves document");
|
||||
});
|
||||
it('should encode properly', () => {
|
||||
|
@ -147,8 +147,8 @@ describe('encoding and decoding embeddeds', () => {
|
|||
const B = embed({b: 2});
|
||||
expect(encode([A, B], { embeddedEncode: pt })).is(
|
||||
Bytes.from([Tag.Sequence,
|
||||
Tag.Embedded, Tag.SmallInteger_lo,
|
||||
Tag.Embedded, Tag.SmallInteger_lo + 1,
|
||||
Tag.Embedded, Tag.SignedInteger, 0,
|
||||
Tag.Embedded, Tag.SignedInteger, 1, 1,
|
||||
Tag.End]));
|
||||
expect(objects).toEqual([A.embeddedValue, B.embeddedValue]);
|
||||
});
|
||||
|
@ -161,8 +161,8 @@ describe('encoding and decoding embeddeds', () => {
|
|||
objects.push(Y.embeddedValue);
|
||||
expect(decode(Bytes.from([
|
||||
Tag.Sequence,
|
||||
Tag.Embedded, Tag.SmallInteger_lo,
|
||||
Tag.Embedded, Tag.SmallInteger_lo + 1,
|
||||
Tag.Embedded, Tag.SignedInteger, 0,
|
||||
Tag.Embedded, Tag.SignedInteger, 1, 1,
|
||||
Tag.End
|
||||
]), { embeddedDecode: pt })).is([X, Y]);
|
||||
});
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -291,6 +291,13 @@
|
|||
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
|
||||
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
|
||||
|
||||
"@cspotcode/source-map-support@^0.8.0":
|
||||
version "0.8.1"
|
||||
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
|
||||
integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
|
||||
dependencies:
|
||||
"@jridgewell/trace-mapping" "0.3.9"
|
||||
|
||||
"@gar/promisify@^1.0.1":
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
|
||||
|
@ -508,6 +515,11 @@
|
|||
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
|
||||
integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
|
||||
|
||||
"@jridgewell/resolve-uri@^3.0.3":
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
|
||||
integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
|
||||
|
||||
"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
|
||||
|
@ -526,6 +538,14 @@
|
|||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
|
||||
integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
|
||||
|
||||
"@jridgewell/trace-mapping@0.3.9":
|
||||
version "0.3.9"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
|
||||
integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
|
||||
dependencies:
|
||||
"@jridgewell/resolve-uri" "^3.0.3"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.10"
|
||||
|
||||
"@jridgewell/trace-mapping@^0.3.9":
|
||||
version "0.3.17"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985"
|
||||
|
@ -1425,6 +1445,26 @@
|
|||
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
|
||||
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
|
||||
|
||||
"@tsconfig/node10@^1.0.7":
|
||||
version "1.0.9"
|
||||
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
|
||||
integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
|
||||
|
||||
"@tsconfig/node12@^1.0.7":
|
||||
version "1.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
|
||||
integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
|
||||
|
||||
"@tsconfig/node14@^1.0.0":
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
|
||||
integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
|
||||
|
||||
"@tsconfig/node16@^1.0.2":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
|
||||
integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
|
||||
|
||||
"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
|
||||
version "7.20.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891"
|
||||
|
@ -1520,6 +1560,13 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f"
|
||||
integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==
|
||||
|
||||
"@types/node@^20.8.5":
|
||||
version "20.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.5.tgz#13352ae1f80032171616910e8aba2e3e52e57d96"
|
||||
integrity sha512-SPlobFgbidfIeOYlzXiEjSYeIJiOCthv+9tSQVpvk4PAdIIc+2SmjNVzWXk9t0Y7dl73Zdf+OgXKHX9XtkqUpw==
|
||||
dependencies:
|
||||
undici-types "~5.25.1"
|
||||
|
||||
"@types/normalize-package-data@^2.4.0":
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
|
||||
|
@ -1593,6 +1640,11 @@ acorn-walk@^7.1.1:
|
|||
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
|
||||
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
|
||||
|
||||
acorn-walk@^8.1.1:
|
||||
version "8.2.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
|
||||
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
|
||||
|
||||
acorn@^7.1.1:
|
||||
version "7.4.1"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
|
||||
|
@ -1603,6 +1655,11 @@ acorn@^8.2.4, acorn@^8.5.0:
|
|||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
|
||||
integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
|
||||
|
||||
acorn@^8.4.1:
|
||||
version "8.10.0"
|
||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
|
||||
integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
|
||||
|
||||
add-stream@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
|
||||
|
@ -5720,7 +5777,7 @@ sort-keys@^4.0.0:
|
|||
dependencies:
|
||||
is-plain-obj "^2.0.0"
|
||||
|
||||
source-map-support@^0.5.12, source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.20:
|
||||
source-map-support@^0.5.12, source-map-support@^0.5.6, source-map-support@~0.5.20:
|
||||
version "0.5.21"
|
||||
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
|
||||
integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
|
||||
|
@ -6150,32 +6207,39 @@ ts-jest@^27.0:
|
|||
semver "7.x"
|
||||
yargs-parser "20.x"
|
||||
|
||||
ts-node-dev@^1.1:
|
||||
version "1.1.8"
|
||||
resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.1.8.tgz#95520d8ab9d45fffa854d6668e2f8f9286241066"
|
||||
integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg==
|
||||
ts-node-dev@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-2.0.0.tgz#bdd53e17ab3b5d822ef519928dc6b4a7e0f13065"
|
||||
integrity sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==
|
||||
dependencies:
|
||||
chokidar "^3.5.1"
|
||||
dynamic-dedupe "^0.3.0"
|
||||
minimist "^1.2.5"
|
||||
minimist "^1.2.6"
|
||||
mkdirp "^1.0.4"
|
||||
resolve "^1.0.0"
|
||||
rimraf "^2.6.1"
|
||||
source-map-support "^0.5.12"
|
||||
tree-kill "^1.2.2"
|
||||
ts-node "^9.0.0"
|
||||
ts-node "^10.4.0"
|
||||
tsconfig "^7.0.0"
|
||||
|
||||
ts-node@^9.0.0:
|
||||
version "9.1.1"
|
||||
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d"
|
||||
integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==
|
||||
ts-node@^10.4.0:
|
||||
version "10.9.1"
|
||||
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b"
|
||||
integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==
|
||||
dependencies:
|
||||
"@cspotcode/source-map-support" "^0.8.0"
|
||||
"@tsconfig/node10" "^1.0.7"
|
||||
"@tsconfig/node12" "^1.0.7"
|
||||
"@tsconfig/node14" "^1.0.0"
|
||||
"@tsconfig/node16" "^1.0.2"
|
||||
acorn "^8.4.1"
|
||||
acorn-walk "^8.1.1"
|
||||
arg "^4.1.0"
|
||||
create-require "^1.1.0"
|
||||
diff "^4.0.1"
|
||||
make-error "^1.1.1"
|
||||
source-map-support "^0.5.17"
|
||||
v8-compile-cache-lib "^3.0.1"
|
||||
yn "3.1.1"
|
||||
|
||||
tsconfig@^7.0.0:
|
||||
|
@ -6298,6 +6362,11 @@ unbox-primitive@^1.0.2:
|
|||
has-symbols "^1.0.3"
|
||||
which-boxed-primitive "^1.0.2"
|
||||
|
||||
undici-types@~5.25.1:
|
||||
version "5.25.3"
|
||||
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3"
|
||||
integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==
|
||||
|
||||
unique-filename@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
|
||||
|
@ -6372,6 +6441,11 @@ uuid@^3.3.2:
|
|||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
|
||||
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
|
||||
|
||||
v8-compile-cache-lib@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
|
||||
integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
|
||||
|
||||
v8-to-istanbul@^8.1.0:
|
||||
version "8.1.1"
|
||||
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed"
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
´³bundle·µ³tcp„´³schema·³version‘³definitions·³TcpLocal´³rec´³lit³ tcp-local„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³ TcpRemote´³rec´³lit³
|
||||
tcp-remote„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³TcpPeerInfo´³rec´³lit³tcp-peer„´³tupleµ´³named³handle´³embedded³any„„´³named³local´³refµ„³TcpLocal„„´³named³remote´³refµ„³ TcpRemote„„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³http„´³schema·³version‘³definitions·³Chunk´³orµµ±string´³atom³String„„µ±bytes´³atom³
|
||||
´³bundle·µ³tcp„´³schema·³version°³definitions·³TcpLocal´³rec´³lit³ tcp-local„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³ TcpRemote´³rec´³lit³
|
||||
tcp-remote„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„„„„³TcpPeerInfo´³rec´³lit³tcp-peer„´³tupleµ´³named³handle´³embedded³any„„´³named³local´³refµ„³TcpLocal„„´³named³remote´³refµ„³ TcpRemote„„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³http„´³schema·³version°³definitions·³Chunk´³orµµ±string´³atom³String„„µ±bytes´³atom³
|
||||
ByteString„„„„³Headers´³dictof´³atom³Symbol„´³atom³String„„³MimeType´³atom³Symbol„³
|
||||
QueryValue´³orµµ±string´³atom³String„„µ±file´³rec´³lit³file„´³tupleµ´³named³filename´³atom³String„„´³named³headers´³refµ„³Headers„„´³named³body´³atom³
|
||||
ByteString„„„„„„„„³HostPattern´³orµµ±host´³atom³String„„µ±any´³lit€„„„„³HttpBinding´³rec´³lit³ http-bind„´³tupleµ´³named³host´³refµ„³HostPattern„„´³named³port´³atom³
SignedInteger„„´³named³method´³refµ„³
MethodPattern„„´³named³path´³refµ„³PathPattern„„´³named³handler´³embedded´³refµ„³HttpRequest„„„„„„³HttpContext´³rec´³lit³request„´³tupleµ´³named³req´³refµ„³HttpRequest„„´³named³res´³embedded´³refµ„³HttpResponse„„„„„„³HttpRequest´³rec´³lit³http-request„´³tupleµ´³named³sequenceNumber´³atom³
SignedInteger„„´³named³host´³atom³String„„´³named³port´³atom³
SignedInteger„„´³named³method´³atom³Symbol„„´³named³path´³seqof´³atom³String„„„´³named³headers´³refµ„³Headers„„´³named³query´³dictof´³atom³Symbol„´³seqof´³refµ„³
|
||||
QueryValue„„„„´³named³body´³refµ„³RequestBody„„„„„³HttpService´³rec´³lit³http-service„´³tupleµ´³named³host´³refµ„³HostPattern„„´³named³port´³atom³
SignedInteger„„´³named³method´³refµ„³
MethodPattern„„´³named³path´³refµ„³PathPattern„„„„„³PathPattern´³seqof´³refµ„³PathPatternElement„„³RequestBody´³orµµ±present´³atom³
|
||||
ByteString„„µ±absent´³lit€„„„„³HttpListener´³rec´³lit³
http-listener„´³tupleµ´³named³port´³atom³
SignedInteger„„„„„³HttpResponse´³orµµ±status´³rec´³lit³status„´³tupleµ´³named³code´³atom³
SignedInteger„„´³named³message´³atom³String„„„„„„µ±header´³rec´³lit³header„´³tupleµ´³named³name´³atom³Symbol„„´³named³value´³atom³String„„„„„„µ±chunk´³rec´³lit³chunk„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„µ±done´³rec´³lit³done„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„„„³
MethodPattern´³orµµ±any´³lit€„„µ±specific´³atom³Symbol„„„„³PathPatternElement´³orµµ±label´³atom³String„„µ±wildcard´³lit³_„„µ±rest´³lit³...„„„„„³embeddedType€„„µ³noise„´³schema·³version‘³definitions·³Packet´³orµµ±complete´³atom³
|
||||
ByteString„„µ±absent´³lit€„„„„³HttpListener´³rec´³lit³
http-listener„´³tupleµ´³named³port´³atom³
SignedInteger„„„„„³HttpResponse´³orµµ±status´³rec´³lit³status„´³tupleµ´³named³code´³atom³
SignedInteger„„´³named³message´³atom³String„„„„„„µ±header´³rec´³lit³header„´³tupleµ´³named³name´³atom³Symbol„„´³named³value´³atom³String„„„„„„µ±chunk´³rec´³lit³chunk„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„µ±done´³rec´³lit³done„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„„„³
MethodPattern´³orµµ±any´³lit€„„µ±specific´³atom³Symbol„„„„³PathPatternElement´³orµµ±label´³atom³String„„µ±wildcard´³lit³_„„µ±rest´³lit³...„„„„„³embeddedType€„„µ³noise„´³schema·³version°³definitions·³Packet´³orµµ±complete´³atom³
|
||||
ByteString„„µ±
|
||||
fragmented´³seqof´³atom³
|
||||
ByteString„„„„„³ NoiseSpec´³andµ´³dict·³key´³named³key´³atom³
|
||||
ByteString„„³service´³named³service´³refµ„³ServiceSelector„„„„´³named³protocol´³refµ„³
NoiseProtocol„„´³named³
preSharedKeys´³refµ„³NoisePreSharedKeys„„„„³
NoiseProtocol´³orµµ±present´³dict·³protocol´³named³protocol´³atom³String„„„„„µ±invalid´³dict·³protocol´³named³protocol³any„„„„µ±absent´³dict·„„„„„³
NoiseStepType´³lit³noise„³SecretKeyField´³orµµ±present´³dict·³ secretKey´³named³ secretKey´³atom³
|
||||
ByteString„„„„„µ±invalid´³dict·³ secretKey´³named³ secretKey³any„„„„µ±absent´³dict·„„„„„³DefaultProtocol´³lit±!Noise_NK_25519_ChaChaPoly_BLAKE2s„³NoiseStepDetail´³refµ„³ServiceSelector„³ServiceSelector³any³NoiseServiceSpec´³andµ´³named³base´³refµ„³ NoiseSpec„„´³named³ secretKey´³refµ„³SecretKeyField„„„„³NoisePreSharedKeys´³orµµ±present´³dict·³
preSharedKeys´³named³
preSharedKeys´³seqof´³atom³
|
||||
ByteString„„„„„„µ±invalid´³dict·³
preSharedKeys´³named³
preSharedKeys³any„„„„µ±absent´³dict·„„„„„³NoisePathStepDetail´³refµ„³ NoiseSpec„³NoiseDescriptionDetail´³refµ„³NoiseServiceSpec„„³embeddedType€„„µ³timer„´³schema·³version‘³definitions·³SetTimer´³rec´³lit³ set-timer„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„´³named³kind´³refµ„³ TimerKind„„„„„³ LaterThan´³rec´³lit³
|
||||
later-than„´³tupleµ´³named³seconds´³atom³Double„„„„„³ TimerKind´³orµµ±relative´³lit³relative„„µ±absolute´³lit³absolute„„µ±clear´³lit³clear„„„„³TimerExpired´³rec´³lit³
timer-expired„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„„„„„³embeddedType€„„µ³trace„´³schema·³version‘³definitions·³Oid³any³Name´³orµµ± anonymous´³rec´³lit³ anonymous„´³tupleµ„„„„µ±named´³rec´³lit³named„´³tupleµ´³named³name³any„„„„„„„³Target´³rec´³lit³entity„´³tupleµ´³named³actor´³refµ„³ActorId„„´³named³facet´³refµ„³FacetId„„´³named³oid´³refµ„³Oid„„„„„³TaskId³any³TurnId³any³ActorId³any³FacetId³any³ TurnCause´³orµµ±turn´³rec´³lit³ caused-by„´³tupleµ´³named³id´³refµ„³TurnId„„„„„„µ±cleanup´³rec´³lit³cleanup„´³tupleµ„„„„µ±linkedTaskRelease´³rec´³lit³linked-task-release„´³tupleµ´³named³id´³refµ„³TaskId„„´³named³reason´³refµ„³LinkedTaskReleaseReason„„„„„„µ±periodicActivation´³rec´³lit³periodic-activation„´³tupleµ´³named³period´³atom³Double„„„„„„µ±delay´³rec´³lit³delay„´³tupleµ´³named³causingTurn´³refµ„³TurnId„„´³named³amount´³atom³Double„„„„„„µ±external´³rec´³lit³external„´³tupleµ´³named³description³any„„„„„„„³ TurnEvent´³orµµ±assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³AssertionDescription„„´³named³handle´³refµ³protocol„³Handle„„„„„„µ±retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ³protocol„³Handle„„„„„„µ±message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³AssertionDescription„„„„„„µ±sync´³rec´³lit³sync„´³tupleµ´³named³peer´³refµ„³Target„„„„„„µ± breakLink´³rec´³lit³
|
||||
ByteString„„„„„„µ±invalid´³dict·³
preSharedKeys´³named³
preSharedKeys³any„„„„µ±absent´³dict·„„„„„³NoisePathStepDetail´³refµ„³ NoiseSpec„³NoiseDescriptionDetail´³refµ„³NoiseServiceSpec„„³embeddedType€„„µ³timer„´³schema·³version°³definitions·³SetTimer´³rec´³lit³ set-timer„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„´³named³kind´³refµ„³ TimerKind„„„„„³ LaterThan´³rec´³lit³
|
||||
later-than„´³tupleµ´³named³seconds´³atom³Double„„„„„³ TimerKind´³orµµ±relative´³lit³relative„„µ±absolute´³lit³absolute„„µ±clear´³lit³clear„„„„³TimerExpired´³rec´³lit³
timer-expired„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„„„„„³embeddedType€„„µ³trace„´³schema·³version°³definitions·³Oid³any³Name´³orµµ± anonymous´³rec´³lit³ anonymous„´³tupleµ„„„„µ±named´³rec´³lit³named„´³tupleµ´³named³name³any„„„„„„„³Target´³rec´³lit³entity„´³tupleµ´³named³actor´³refµ„³ActorId„„´³named³facet´³refµ„³FacetId„„´³named³oid´³refµ„³Oid„„„„„³TaskId³any³TurnId³any³ActorId³any³FacetId³any³ TurnCause´³orµµ±turn´³rec´³lit³ caused-by„´³tupleµ´³named³id´³refµ„³TurnId„„„„„„µ±cleanup´³rec´³lit³cleanup„´³tupleµ„„„„µ±linkedTaskRelease´³rec´³lit³linked-task-release„´³tupleµ´³named³id´³refµ„³TaskId„„´³named³reason´³refµ„³LinkedTaskReleaseReason„„„„„„µ±periodicActivation´³rec´³lit³periodic-activation„´³tupleµ´³named³period´³atom³Double„„„„„„µ±delay´³rec´³lit³delay„´³tupleµ´³named³causingTurn´³refµ„³TurnId„„´³named³amount´³atom³Double„„„„„„µ±external´³rec´³lit³external„´³tupleµ´³named³description³any„„„„„„„³ TurnEvent´³orµµ±assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³AssertionDescription„„´³named³handle´³refµ³protocol„³Handle„„„„„„µ±retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ³protocol„³Handle„„„„„„µ±message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³AssertionDescription„„„„„„µ±sync´³rec´³lit³sync„´³tupleµ´³named³peer´³refµ„³Target„„„„„„µ± breakLink´³rec´³lit³
|
||||
break-link„´³tupleµ´³named³source´³refµ„³ActorId„„´³named³handle´³refµ³protocol„³Handle„„„„„„„„³
|
||||
ExitStatus´³orµµ±ok´³lit³ok„„µ±Error´³refµ³protocol„³Error„„„„³
|
||||
TraceEntry´³rec´³lit³trace„´³tupleµ´³named³ timestamp´³atom³Double„„´³named³actor´³refµ„³ActorId„„´³named³item´³refµ„³ActorActivation„„„„„³ActorActivation´³orµµ±start´³rec´³lit³start„´³tupleµ´³named³ actorName´³refµ„³Name„„„„„„µ±turn´³refµ„³TurnDescription„„µ±stop´³rec´³lit³stop„´³tupleµ´³named³status´³refµ„³
|
||||
ExitStatus„„„„„„„„³FacetStopReason´³orµµ±explicitAction´³lit³explicit-action„„µ±inert´³lit³inert„„µ±parentStopping´³lit³parent-stopping„„µ±
actorStopping´³lit³actor-stopping„„„„³TurnDescription´³rec´³lit³turn„´³tupleµ´³named³id´³refµ„³TurnId„„´³named³cause´³refµ„³ TurnCause„„´³named³actions´³seqof´³refµ„³ActionDescription„„„„„„³ActionDescription´³orµµ±dequeue´³rec´³lit³dequeue„´³tupleµ´³named³event´³refµ„³TargetedTurnEvent„„„„„„µ±enqueue´³rec´³lit³enqueue„´³tupleµ´³named³event´³refµ„³TargetedTurnEvent„„„„„„µ±dequeueInternal´³rec´³lit³dequeue-internal„´³tupleµ´³named³event´³refµ„³TargetedTurnEvent„„„„„„µ±enqueueInternal´³rec´³lit³enqueue-internal„´³tupleµ´³named³event´³refµ„³TargetedTurnEvent„„„„„„µ±spawn´³rec´³lit³spawn„´³tupleµ´³named³link´³atom³Boolean„„´³named³id´³refµ„³ActorId„„„„„„µ±link´³rec´³lit³link„´³tupleµ´³named³parentActor´³refµ„³ActorId„„´³named³
childToParent´³refµ³protocol„³Handle„„´³named³
|
||||
childActor´³refµ„³ActorId„„´³named³
parentToChild´³refµ³protocol„³Handle„„„„„„µ±
|
||||
facetStart´³rec´³lit³facet-start„´³tupleµ´³named³path´³seqof´³refµ„³FacetId„„„„„„„µ± facetStop´³rec´³lit³
|
||||
facet-stop„´³tupleµ´³named³path´³seqof´³refµ„³FacetId„„„´³named³reason´³refµ„³FacetStopReason„„„„„„µ±linkedTaskStart´³rec´³lit³linked-task-start„´³tupleµ´³named³taskName´³refµ„³Name„„´³named³id´³refµ„³TaskId„„„„„„„„³TargetedTurnEvent´³rec´³lit³event„´³tupleµ´³named³target´³refµ„³Target„„´³named³detail´³refµ„³ TurnEvent„„„„„³AssertionDescription´³orµµ±value´³rec´³lit³value„´³tupleµ´³named³value³any„„„„„µ±opaque´³rec´³lit³opaque„´³tupleµ´³named³description³any„„„„„„„³LinkedTaskReleaseReason´³orµµ± cancelled´³lit³ cancelled„„µ±normal´³lit³normal„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³stream„´³schema·³version‘³definitions·³Mode´³orµµ±bytes´³lit³bytes„„µ±lines´³refµ„³LineMode„„µ±packet´³rec´³lit³packet„´³tupleµ´³named³size´³atom³
SignedInteger„„„„„„µ±object´³rec´³lit³object„´³tupleµ´³named³description³any„„„„„„„³Sink´³orµµ±source´³rec´³lit³source„´³tupleµ´³named³
|
||||
facet-stop„´³tupleµ´³named³path´³seqof´³refµ„³FacetId„„„´³named³reason´³refµ„³FacetStopReason„„„„„„µ±linkedTaskStart´³rec´³lit³linked-task-start„´³tupleµ´³named³taskName´³refµ„³Name„„´³named³id´³refµ„³TaskId„„„„„„„„³TargetedTurnEvent´³rec´³lit³event„´³tupleµ´³named³target´³refµ„³Target„„´³named³detail´³refµ„³ TurnEvent„„„„„³AssertionDescription´³orµµ±value´³rec´³lit³value„´³tupleµ´³named³value³any„„„„„µ±opaque´³rec´³lit³opaque„´³tupleµ´³named³description³any„„„„„„„³LinkedTaskReleaseReason´³orµµ± cancelled´³lit³ cancelled„„µ±normal´³lit³normal„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³stream„´³schema·³version°³definitions·³Mode´³orµµ±bytes´³lit³bytes„„µ±lines´³refµ„³LineMode„„µ±packet´³rec´³lit³packet„´³tupleµ´³named³size´³atom³
SignedInteger„„„„„„µ±object´³rec´³lit³object„´³tupleµ´³named³description³any„„„„„„„³Sink´³orµµ±source´³rec´³lit³source„´³tupleµ´³named³
|
||||
controller´³embedded´³refµ„³Source„„„„„„„µ±StreamError´³refµ„³StreamError„„µ±data´³rec´³lit³data„´³tupleµ´³named³payload³any„´³named³mode´³refµ„³Mode„„„„„„µ±eof´³rec´³lit³eof„´³tupleµ„„„„„„³Source´³orµµ±sink´³rec´³lit³sink„´³tupleµ´³named³
|
||||
controller´³embedded´³refµ„³Sink„„„„„„„µ±StreamError´³refµ„³StreamError„„µ±credit´³rec´³lit³credit„´³tupleµ´³named³amount´³refµ„³CreditAmount„„´³named³mode´³refµ„³Mode„„„„„„„„³LineMode´³orµµ±lf´³lit³lf„„µ±crlf´³lit³crlf„„„„³StreamError´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„„„„³CreditAmount´³orµµ±count´³atom³
SignedInteger„„µ± unbounded´³lit³ unbounded„„„„³StreamConnection´³rec´³lit³stream-connection„´³tupleµ´³named³source´³embedded´³refµ„³Source„„„´³named³sink´³embedded´³refµ„³Sink„„„´³named³spec³any„„„„³StreamListenerError´³rec´³lit³stream-listener-error„´³tupleµ´³named³spec³any„´³named³message´³atom³String„„„„„³StreamListenerReady´³rec´³lit³stream-listener-ready„´³tupleµ´³named³spec³any„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³sturdy„´³schema·³version‘³definitions·³Lit´³rec´³lit³lit„´³tupleµ´³named³value³any„„„„³Oid´³atom³
SignedInteger„³Alts´³rec´³lit³or„´³tupleµ´³named³alternatives´³seqof´³refµ„³Rewrite„„„„„„³PAnd´³rec´³lit³and„´³tupleµ´³named³patterns´³seqof´³refµ„³Pattern„„„„„„³PNot´³rec´³lit³not„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³TRef´³rec´³lit³ref„´³tupleµ´³named³binding´³atom³
SignedInteger„„„„„³PAtom´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ±
SignedInteger´³lit³
SignedInteger„„µ±String´³lit³String„„µ±
|
||||
controller´³embedded´³refµ„³Sink„„„„„„„µ±StreamError´³refµ„³StreamError„„µ±credit´³rec´³lit³credit„´³tupleµ´³named³amount´³refµ„³CreditAmount„„´³named³mode´³refµ„³Mode„„„„„„„„³LineMode´³orµµ±lf´³lit³lf„„µ±crlf´³lit³crlf„„„„³StreamError´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„„„„³CreditAmount´³orµµ±count´³atom³
SignedInteger„„µ± unbounded´³lit³ unbounded„„„„³StreamConnection´³rec´³lit³stream-connection„´³tupleµ´³named³source´³embedded´³refµ„³Source„„„´³named³sink´³embedded´³refµ„³Sink„„„´³named³spec³any„„„„³StreamListenerError´³rec´³lit³stream-listener-error„´³tupleµ´³named³spec³any„´³named³message´³atom³String„„„„„³StreamListenerReady´³rec´³lit³stream-listener-ready„´³tupleµ´³named³spec³any„„„„„³embeddedType´³refµ³ EntityRef„³Cap„„„µ³sturdy„´³schema·³version°³definitions·³Lit´³rec´³lit³lit„´³tupleµ´³named³value³any„„„„³Oid´³atom³
SignedInteger„³Alts´³rec´³lit³or„´³tupleµ´³named³alternatives´³seqof´³refµ„³Rewrite„„„„„„³PAnd´³rec´³lit³and„´³tupleµ´³named³patterns´³seqof´³refµ„³Pattern„„„„„„³PNot´³rec´³lit³not„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³TRef´³rec´³lit³ref„´³tupleµ´³named³binding´³atom³
SignedInteger„„„„„³PAtom´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ±
SignedInteger´³lit³
SignedInteger„„µ±String´³lit³String„„µ±
|
||||
ByteString´³lit³
|
||||
ByteString„„µ±Symbol´³lit³Symbol„„„„³PBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³Caveat´³orµµ±Rewrite´³refµ„³Rewrite„„µ±Alts´³refµ„³Alts„„µ±Reject´³refµ„³Reject„„µ±unknown³any„„„³Reject´³rec´³lit³reject„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³Pattern´³orµµ±PDiscard´³refµ„³PDiscard„„µ±PAtom´³refµ„³PAtom„„µ± PEmbedded´³refµ„³ PEmbedded„„µ±PBind´³refµ„³PBind„„µ±PAnd´³refµ„³PAnd„„µ±PNot´³refµ„³PNot„„µ±Lit´³refµ„³Lit„„µ± PCompound´³refµ„³ PCompound„„„„³Rewrite´³rec´³lit³rewrite„´³tupleµ´³named³pattern´³refµ„³Pattern„„´³named³template´³refµ„³Template„„„„„³WireRef´³orµµ±mine´³tupleµ´³lit<EFBFBD>„´³named³oid´³refµ„³Oid„„„„„µ±yours´³tuplePrefixµ´³lit‘„´³named³oid´³refµ„³Oid„„„´³named³attenuation´³seqof´³refµ„³Caveat„„„„„„„³PDiscard´³rec´³lit³_„´³tupleµ„„„³Template´³orµµ±
|
||||
ByteString„„µ±Symbol´³lit³Symbol„„„„³PBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³Caveat´³orµµ±Rewrite´³refµ„³Rewrite„„µ±Alts´³refµ„³Alts„„µ±Reject´³refµ„³Reject„„µ±unknown³any„„„³Reject´³rec´³lit³reject„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³Pattern´³orµµ±PDiscard´³refµ„³PDiscard„„µ±PAtom´³refµ„³PAtom„„µ± PEmbedded´³refµ„³ PEmbedded„„µ±PBind´³refµ„³PBind„„µ±PAnd´³refµ„³PAnd„„µ±PNot´³refµ„³PNot„„µ±Lit´³refµ„³Lit„„µ± PCompound´³refµ„³ PCompound„„„„³Rewrite´³rec´³lit³rewrite„´³tupleµ´³named³pattern´³refµ„³Pattern„„´³named³template´³refµ„³Template„„„„„³WireRef´³orµµ±mine´³tupleµ´³lit° |