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:
Tony Garnock-Jones 2023-10-14 21:29:09 +02:00
parent 6cbfefc76d
commit b7a2acf65b
43 changed files with 1172 additions and 1215 deletions

View File

@ -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:

View File

@ -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) {

View File

@ -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;
}

View File

@ -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;
}
};
}

View File

@ -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);
}
};

View File

@ -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"
},

View File

@ -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 {

View File

@ -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,
}

View File

@ -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 {

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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"

View File

@ -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°„´³named³oid´³refµ„³Oid„„„„„µ±yours´³ tuplePrefixµ´³lit°„´³named³oid´³refµ„³Oid„„„´³named³ attenuation´³seqof´³refµ„³Caveat„„„„„„„³PDiscard´³rec´³lit³_„´³tupleµ„„„³Template´³orµµ±
TAttenuate´³refµ„³
TAttenuate„„µ±TRef´³refµ„³TRef„„µ±Lit´³refµ„³Lit„„µ± TCompound´³refµ„³ TCompound„„„„³ PCompound´³orµµ±rec´³rec´³lit³rec„´³tupleµ´³named³label³any„´³named³fields´³seqof´³refµ„³Pattern„„„„„„„µ±arr´³rec´³lit³arr„´³tupleµ´³named³items´³seqof´³refµ„³Pattern„„„„„„„µ±dict´³rec´³lit³dict„´³tupleµ´³named³entries´³dictof³any´³refµ„³Pattern„„„„„„„„„³ PEmbedded´³lit³Embedded„³ SturdyRef´³rec´³lit³ref„´³tupleµ´³named³
parameters´³refµ„³
@ -32,9 +32,9 @@ ByteString
TAttenuate´³rec´³lit³ attenuate„´³tupleµ´³named³template´³refµ„³Template„„´³named³ attenuation´³seqof´³refµ„³Caveat„„„„„„³ CaveatsField´³orµµ±present´³dict·³caveats´³named³caveats´³seqof´³refµ„³Caveat„„„„„„µ±invalid´³dict·³caveats´³named³caveats³any„„„„µ±absent´³dict·„„„„„³SturdyStepType´³lit³ref„³SturdyStepDetail´³refµ„³
Parameters„³SturdyPathStepDetail´³refµ„³
Parameters„³SturdyDescriptionDetail´³dict·³key´³named³key´³atom³
ByteString„„³oid´³named³oid³any„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³worker„´³schema·³version³ definitions·³Instance´³rec´³lit³Instance„´³tupleµ´³named³name´³atom³String„„´³named³argument³any„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³service„´³schema·³version³ definitions·³State´³orµµ±started´³lit³started„„µ±ready´³lit³ready„„µ±failed´³lit³failed„„µ±complete´³lit³complete„„µ± userDefined³any„„„³
ByteString„„³oid´³named³oid³any„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³worker„´³schema·³version°³ definitions·³Instance´³rec´³lit³Instance„´³tupleµ´³named³name´³atom³String„„´³named³argument³any„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³service„´³schema·³version°³ definitions·³State´³orµµ±started´³lit³started„„µ±ready´³lit³ready„„µ±failed´³lit³failed„„µ±complete´³lit³complete„„µ± userDefined³any„„„³
RunService´³rec´³lit³ run-service„´³tupleµ´³named³ serviceName³any„„„„³ ServiceState´³rec´³lit³ service-state„´³tupleµ´³named³ serviceName³any„´³named³state´³refµ„³State„„„„„³ ServiceObject´³rec´³lit³service-object„´³tupleµ´³named³ serviceName³any„´³named³object³any„„„„³RequireService´³rec´³lit³require-service„´³tupleµ´³named³ serviceName³any„„„„³RestartService´³rec´³lit³restart-service„´³tupleµ´³named³ serviceName³any„„„„³ServiceDependency´³rec´³lit³
depends-on„´³tupleµ´³named³depender³any„´³named³dependee´³refµ„³ ServiceState„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³protocol„´³schema·³version³ definitions·³Oid´³atom³ SignedInteger„³Sync´³rec´³lit³sync„´³tupleµ´³named³peer´³embedded´³lit<69>„„„„„„³Turn´³seqof´³refµ„³ TurnEvent„„³Error´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„´³named³detail³any„„„„³Event´³orµµ±Assert´³refµ„³Assert„„µ±Retract´³refµ„³Retract„„µ±Message´³refµ„³Message„„µ±Sync´³refµ„³Sync„„„„³Assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³ Assertion„„´³named³handle´³refµ„³Handle„„„„„³Handle´³atom³ SignedInteger„³Packet´³orµµ±Turn´³refµ„³Turn„„µ±Error´³refµ„³Error„„µ± Extension´³refµ„³ Extension„„„„³Message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³ Assertion„„„„„³Retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ„³Handle„„„„„³ Assertion³any³ Extension´³rec´³named³label³any„´³named³fields´³seqof³any„„„³ TurnEvent´³tupleµ´³named³oid´³refµ„³Oid„„´³named³event´³refµ„³Event„„„„„³ embeddedType€„„µ³ dataspace„´³schema·³version³ definitions·³Observe´³rec´³lit³Observe„´³tupleµ´³named³pattern´³refµ³dataspacePatterns„³Pattern„„´³named³observer´³embedded³any„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³
gatekeeper„´³schema·³version³ definitions·³Bind´³rec´³lit³bind„´³tupleµ´³named³ description´³refµ„³ Description„„´³named³target´³embedded³any„„´³named³observer´³refµ„³ BindObserver„„„„„³Step´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Bound´³orµµ±bound´³rec´³lit³bound„´³tupleµ´³named³pathStep´³refµ„³PathStep„„„„„„µ±Rejected´³refµ„³Rejected„„„„³Route´³rec´³lit³route„´³ tuplePrefixµ´³named³
transports´³seqof³any„„„´³named³ pathSteps´³seqof´³refµ„³PathStep„„„„„³Resolve´³rec´³lit³resolve„´³tupleµ´³named³step´³refµ„³Step„„´³named³observer´³embedded´³refµ„³Resolved„„„„„„³PathStep´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Rejected´³rec´³lit³rejected„´³tupleµ´³named³detail³any„„„„³Resolved´³orµµ±accepted´³rec´³lit³accepted„´³tupleµ´³named³responderSession´³embedded³any„„„„„„µ±Rejected´³refµ„³Rejected„„„„³ Description´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³ ResolvePath´³rec´³lit³ resolve-path„´³tupleµ´³named³route´³refµ„³Route„„´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„³ BindObserver´³orµµ±present´³embedded´³refµ„³Bound„„„µ±absent´³lit€„„„„³ForceDisconnect´³rec´³lit³force-disconnect„´³tupleµ„„„³ResolvedPathStep´³rec´³lit³ path-step„´³tupleµ´³named³origin´³embedded´³refµ„³Resolve„„„´³named³pathStep´³refµ„³PathStep„„´³named³resolved´³refµ„³Resolved„„„„„³TransportControl´³refµ„³ForceDisconnect„³TransportConnection´³rec´³lit³connect-transport„´³tupleµ´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³transportAddress„´³schema·³version³ definitions·³Tcp´³rec´³lit³tcp„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³Unix´³rec´³lit³unix„´³tupleµ´³named³path´³atom³String„„„„„³Stdio´³rec´³lit³stdio„´³tupleµ„„„³ WebSocket´³rec´³lit³ws„´³tupleµ´³named³url´³atom³String„„„„„„³ embeddedType€„„µ³dataspacePatterns„´³schema·³version³ definitions·³DLit´³rec´³lit³lit„´³tupleµ´³named³value´³refµ„³AnyAtom„„„„„³DBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³AnyAtom´³orµµ±bool´³atom³Boolean„„µ±float´³atom³Float„„µ±double´³atom³Double„„µ±int´³atom³ SignedInteger„„µ±string´³atom³String„„µ±bytes´³atom³
depends-on„´³tupleµ´³named³depender³any„´³named³dependee´³refµ„³ ServiceState„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³protocol„´³schema·³version°³ definitions·³Oid´³atom³ SignedInteger„³Sync´³rec´³lit³sync„´³tupleµ´³named³peer´³embedded´³lit<69>„„„„„„³Turn´³seqof´³refµ„³ TurnEvent„„³Error´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„´³named³detail³any„„„„³Event´³orµµ±Assert´³refµ„³Assert„„µ±Retract´³refµ„³Retract„„µ±Message´³refµ„³Message„„µ±Sync´³refµ„³Sync„„„„³Assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³ Assertion„„´³named³handle´³refµ„³Handle„„„„„³Handle´³atom³ SignedInteger„³Packet´³orµµ±Turn´³refµ„³Turn„„µ±Error´³refµ„³Error„„µ± Extension´³refµ„³ Extension„„„„³Message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³ Assertion„„„„„³Retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ„³Handle„„„„„³ Assertion³any³ Extension´³rec´³named³label³any„´³named³fields´³seqof³any„„„³ TurnEvent´³tupleµ´³named³oid´³refµ„³Oid„„´³named³event´³refµ„³Event„„„„„³ embeddedType€„„µ³ dataspace„´³schema·³version°³ definitions·³Observe´³rec´³lit³Observe„´³tupleµ´³named³pattern´³refµ³dataspacePatterns„³Pattern„„´³named³observer´³embedded³any„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³
gatekeeper„´³schema·³version°³ definitions·³Bind´³rec´³lit³bind„´³tupleµ´³named³ description´³refµ„³ Description„„´³named³target´³embedded³any„„´³named³observer´³refµ„³ BindObserver„„„„„³Step´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Bound´³orµµ±bound´³rec´³lit³bound„´³tupleµ´³named³pathStep´³refµ„³PathStep„„„„„„µ±Rejected´³refµ„³Rejected„„„„³Route´³rec´³lit³route„´³ tuplePrefixµ´³named³
transports´³seqof³any„„„´³named³ pathSteps´³seqof´³refµ„³PathStep„„„„„³Resolve´³rec´³lit³resolve„´³tupleµ´³named³step´³refµ„³Step„„´³named³observer´³embedded´³refµ„³Resolved„„„„„„³PathStep´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Rejected´³rec´³lit³rejected„´³tupleµ´³named³detail³any„„„„³Resolved´³orµµ±accepted´³rec´³lit³accepted„´³tupleµ´³named³responderSession´³embedded³any„„„„„„µ±Rejected´³refµ„³Rejected„„„„³ Description´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³ ResolvePath´³rec´³lit³ resolve-path„´³tupleµ´³named³route´³refµ„³Route„„´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„³ BindObserver´³orµµ±present´³embedded´³refµ„³Bound„„„µ±absent´³lit€„„„„³ForceDisconnect´³rec´³lit³force-disconnect„´³tupleµ„„„³ResolvedPathStep´³rec´³lit³ path-step„´³tupleµ´³named³origin´³embedded´³refµ„³Resolve„„„´³named³pathStep´³refµ„³PathStep„„´³named³resolved´³refµ„³Resolved„„„„„³TransportControl´³refµ„³ForceDisconnect„³TransportConnection´³rec´³lit³connect-transport„´³tupleµ´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³transportAddress„´³schema·³version°³ definitions·³Tcp´³rec´³lit³tcp„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³Unix´³rec´³lit³unix„´³tupleµ´³named³path´³atom³String„„„„„³Stdio´³rec´³lit³stdio„´³tupleµ„„„³ WebSocket´³rec´³lit³ws„´³tupleµ´³named³url´³atom³String„„„„„„³ embeddedType€„„µ³dataspacePatterns„´³schema·³version°³ definitions·³DLit´³rec´³lit³lit„´³tupleµ´³named³value´³refµ„³AnyAtom„„„„„³DBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³AnyAtom´³orµµ±bool´³atom³Boolean„„µ±float´³atom³Float„„µ±double´³atom³Double„„µ±int´³atom³ SignedInteger„„µ±string´³atom³String„„µ±bytes´³atom³
ByteString„„µ±symbol´³atom³Symbol„„µ±embedded´³embedded³any„„„„³Pattern´³orµµ±DDiscard´³refµ„³DDiscard„„µ±DBind´³refµ„³DBind„„µ±DLit´³refµ„³DLit„„µ± DCompound´³refµ„³ DCompound„„„„³DDiscard´³rec´³lit³_„´³tupleµ„„„³ DCompound´³orµµ±rec´³rec´³lit³rec„´³tupleµ´³named³label³any„´³named³fields´³seqof´³refµ„³Pattern„„„„„„„µ±arr´³rec´³lit³arr„´³tupleµ´³named³items´³seqof´³refµ„³Pattern„„„„„„„µ±dict´³rec´³lit³dict„´³tupleµ´³named³entries´³dictof³any´³refµ„³Pattern„„„„„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„„„

View File

@ -45,7 +45,7 @@ class Decoder(BinaryCodec):
until a [ShortPacket][preserves.error.ShortPacket] exception is raised:
```python
>>> d = Decoder(b'\\xa0{\\xb1\\x05hello\\x85\\xb3\\x01x\\xb5\\x84')
>>> d = Decoder(b'\\xb0\\x01{\\xb1\\x05hello\\xbf\\xb5\\x84\\xb3\\x01x\\x84')
>>> d.next()
123
>>> d.next()
@ -63,7 +63,7 @@ class Decoder(BinaryCodec):
`None`, which is not in the domain of Preserves `Value`s:
```python
>>> d = Decoder(b'\\xa0{\\xb1\\x05hello\\x85\\xb3\\x01x\\xb5\\x84')
>>> d = Decoder(b'\\xb0\\x01{\\xb1\\x05hello\\xbf\\xb5\\x84\\xb3\\x01x\\x84')
>>> d.try_next()
123
>>> d.try_next()
@ -79,14 +79,14 @@ class Decoder(BinaryCodec):
over all complete values in an input:
```python
>>> d = Decoder(b'\\xa0{\\xb1\\x05hello\\x85\\xb3\\x01x\\xb5\\x84')
>>> d = Decoder(b'\\xb0\\x01{\\xb1\\x05hello\\xbf\\xb5\\x84\\xb3\\x01x\\x84')
>>> list(d)
[123, 'hello', ()]
```
```python
>>> for v in Decoder(b'\\xa0{\\xb1\\x05hello\\x85\\xb3\\x01x\\xb5\\x84'):
>>> for v in Decoder(b'\\xb0\\x01{\\xb1\\x05hello\\xbf\\xb5\\x84\\xb3\\x01x\\x84'):
... print(repr(v))
123
'hello'
@ -97,7 +97,7 @@ class Decoder(BinaryCodec):
Supply `include_annotations=True` to read annotations alongside the annotated values:
```python
>>> d = Decoder(b'\\xa0{\\xb1\\x05hello\\x85\\xb3\\x01x\\xb5\\x84', include_annotations=True)
>>> d = Decoder(b'\\xb0\\x01{\\xb1\\x05hello\\xbf\\xb5\\x84\\xb3\\x01x\\x84', include_annotations=True)
>>> list(d)
[123, 'hello', @#x ()]
@ -107,7 +107,7 @@ class Decoder(BinaryCodec):
[extend][preserves.binary.Decoder.extend] to add new input as if comes available:
```python
>>> d = Decoder(b'\\xa0{\\xb1\\x05he')
>>> d = Decoder(b'\\xb0\\x01{\\xb1\\x05he')
>>> d.try_next()
123
>>> d.try_next() # returns None because the input is incomplete
@ -181,11 +181,6 @@ class Decoder(BinaryCodec):
def wrap(self, v):
return Annotated(v) if self.include_annotations else v
def unshift_annotation(self, a, v):
if self.include_annotations:
v.annotations.insert(0, a)
return v
def next(self):
"""Reads the next complete `Value` from the internal buffer, raising
[ShortPacket][preserves.error.ShortPacket] if too few bytes are available, or
@ -195,19 +190,16 @@ class Decoder(BinaryCodec):
tag = self.nextbyte()
if tag == 0x80: return self.wrap(False)
if tag == 0x81: return self.wrap(True)
if tag == 0x82: return self.wrap(Float.from_bytes(self.nextbytes(4)))
if tag == 0x83: return self.wrap(struct.unpack('>d', self.nextbytes(8))[0])
if tag == 0x84: raise DecodeError('Unexpected end-of-stream marker')
if tag == 0x85:
a = self.next()
v = self.next()
return self.unshift_annotation(a, v)
if tag == 0x86:
if self.decode_embedded is None:
raise DecodeError('No decode_embedded function supplied')
return self.wrap(Embedded(self.decode_embedded(self.next())))
if tag >= 0x90 and tag <= 0x9f: return self.wrap(tag - (0xa0 if tag > 0x9c else 0x90))
if tag >= 0xa0 and tag <= 0xaf: return self.wrap(self.nextint(tag - 0xa0 + 1))
if tag == 0x87:
count = self.nextbyte()
if count == 4: return self.wrap(Float.from_bytes(self.nextbytes(4)))
if count == 8: return self.wrap(struct.unpack('>d', self.nextbytes(8))[0])
raise DecodeError('Invalid IEEE754 size')
if tag == 0xb0: return self.wrap(self.nextint(self.varint()))
if tag == 0xb1: return self.wrap(self.nextbytes(self.varint()).decode('utf-8'))
if tag == 0xb2: return self.wrap(self.nextbytes(self.varint()))
@ -219,6 +211,12 @@ class Decoder(BinaryCodec):
if tag == 0xb5: return self.wrap(tuple(self.nextvalues()))
if tag == 0xb6: return self.wrap(frozenset(self.nextvalues()))
if tag == 0xb7: return self.wrap(ImmutableDict.from_kvs(self.nextvalues()))
if tag == 0xbf:
vs = self.nextvalues()
if len(vs) < 2: raise DecodeError('Too few items in encoded annotated value')
if self.include_annotations:
vs[0].annotations.extend(vs[1:])
return vs[0]
raise DecodeError('Invalid tag: ' + hex(tag))
def try_next(self):
@ -265,7 +263,7 @@ class Encoder(BinaryCodec):
>>> e.append('hello')
>>> e.append(annotate([], Symbol('x')))
>>> e.contents()
b'\\xa0{\\xb1\\x05hello\\x85\\xb3\\x01x\\xb5\\x84'
b'\\xb0\\x01{\\xb1\\x05hello\\xbf\\xb5\\x84\\xb3\\x01x\\x84'
```
@ -325,13 +323,13 @@ class Encoder(BinaryCodec):
self.varint(v // 128)
def encodeint(self, v):
bitcount = (~v if v < 0 else v).bit_length() + 1
bytecount = (bitcount + 7) // 8
if bytecount <= 16:
self.buffer.append(0xa0 + bytecount - 1)
self.buffer.append(0xb0)
if v == 0:
bytecount = 0
else:
self.buffer.append(0xb0)
self.varint(bytecount)
bitcount = (~v if v < 0 else v).bit_length() + 1
bytecount = (bitcount + 7) // 8
self.varint(bytecount)
def enc(n,x):
if n > 0:
enc(n-1, x >> 8)
@ -339,30 +337,30 @@ class Encoder(BinaryCodec):
enc(bytecount, v)
def encodevalues(self, tag, items):
self.buffer.append(0xb0 + tag)
self.buffer.append(tag)
for i in items: self.append(i)
self.buffer.append(0x84)
def encodebytes(self, tag, bs):
self.buffer.append(0xb0 + tag)
self.buffer.append(tag)
self.varint(len(bs))
self.buffer.extend(bs)
def encodeset(self, v):
if not self._canonicalize:
self.encodevalues(6, v)
self.encodevalues(0xb6, v)
else:
c = Canonicalizer(self._encode_embedded, self.include_annotations)
for i in v: c.entry([i])
c.emit_entries(self, 6)
c.emit_entries(self, 0xb6)
def encodedict(self, v):
if not self._canonicalize:
self.encodevalues(7, list(dict_kvs(v)))
self.encodevalues(0xb7, list(dict_kvs(v)))
else:
c = Canonicalizer(self._encode_embedded, self.include_annotations)
for (kk, vv) in v.items(): c.entry([kk, vv])
c.emit_entries(self, 7)
c.emit_entries(self, 0xb7)
def append(self, v):
"""Extend `self.buffer` with an encoding of `v`."""
@ -374,21 +372,19 @@ class Encoder(BinaryCodec):
elif v is True:
self.buffer.append(0x81)
elif isinstance(v, float):
self.buffer.append(0x83)
self.buffer.append(0x87)
self.buffer.append(8)
self.buffer.extend(struct.pack('>d', v))
elif isinstance(v, numbers.Number):
if v >= -3 and v <= 12:
self.buffer.append(0x90 + (v if v >= 0 else v + 16))
else:
self.encodeint(v)
self.encodeint(v)
elif isinstance(v, bytes):
self.encodebytes(2, v)
self.encodebytes(0xb2, v)
elif isinstance(v, basestring_):
self.encodebytes(1, v.encode('utf-8'))
self.encodebytes(0xb1, v.encode('utf-8'))
elif isinstance(v, list):
self.encodevalues(5, v)
self.encodevalues(0xb5, v)
elif isinstance(v, tuple):
self.encodevalues(5, v)
self.encodevalues(0xb5, v)
elif isinstance(v, set):
self.encodeset(v)
elif isinstance(v, frozenset):
@ -403,7 +399,7 @@ class Encoder(BinaryCodec):
if i is None:
self.cannot_encode(v)
else:
self.encodevalues(5, i)
self.encodevalues(0xb5, i)
def cannot_encode(self, v):
raise TypeError('Cannot preserves-encode: ' + repr(v))
@ -420,7 +416,7 @@ class Canonicalizer:
self.entries.append(entry)
def emit_entries(self, outer_encoder, tag):
outer_encoder.buffer.append(0xb0 + tag)
outer_encoder.buffer.append(tag)
for e in sorted(self.entries): outer_encoder.buffer.extend(e)
outer_encoder.buffer.append(0x84)

View File

@ -1,4 +1,4 @@
´³schema·³version³ definitions·³Axis´³orµµ±values´³rec´³lit³values„´³tupleµ„„„„µ± descendants´³rec´³lit³ descendants„´³tupleµ„„„„µ±at´³rec´³lit³at„´³tupleµ´³named³key³any„„„„„µ±label´³rec´³lit³label„´³tupleµ„„„„µ±keys´³rec´³lit³keys„´³tupleµ„„„„µ±length´³rec´³lit³length„´³tupleµ„„„„µ± annotations´³rec´³lit³ annotations„´³tupleµ„„„„µ±embedded´³rec´³lit³embedded„´³tupleµ„„„„µ±parse´³rec´³lit³parse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„µ±unparse´³rec´³lit³unparse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„„„³Step´³orµµ±Axis´³refµ„³Axis„„µ±Filter´³refµ„³Filter„„µ±Function´³refµ„³Function„„„„³Filter´³orµµ±nop´³rec´³lit³nop„´³tupleµ„„„„µ±compare´³rec´³lit³compare„´³tupleµ´³named³op´³refµ„³
´³schema·³version°³ definitions·³Axis´³orµµ±values´³rec´³lit³values„´³tupleµ„„„„µ± descendants´³rec´³lit³ descendants„´³tupleµ„„„„µ±at´³rec´³lit³at„´³tupleµ´³named³key³any„„„„„µ±label´³rec´³lit³label„´³tupleµ„„„„µ±keys´³rec´³lit³keys„´³tupleµ„„„„µ±length´³rec´³lit³length„´³tupleµ„„„„µ± annotations´³rec´³lit³ annotations„´³tupleµ„„„„µ±embedded´³rec´³lit³embedded„´³tupleµ„„„„µ±parse´³rec´³lit³parse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„µ±unparse´³rec´³lit³unparse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„„„³Step´³orµµ±Axis´³refµ„³Axis„„µ±Filter´³refµ„³Filter„„µ±Function´³refµ„³Function„„„„³Filter´³orµµ±nop´³rec´³lit³nop„´³tupleµ„„„„µ±compare´³rec´³lit³compare„´³tupleµ´³named³op´³refµ„³
Comparison„„´³named³literal³any„„„„„µ±regex´³rec´³lit³regex„´³tupleµ´³named³regex´³atom³String„„„„„„µ±test´³rec´³lit³test„´³tupleµ´³named³pred´³refµ„³ Predicate„„„„„„µ±real´³rec´³lit³real„´³tupleµ„„„„µ±int´³rec´³lit³int„´³tupleµ„„„„µ±kind´³rec´³lit³kind„´³tupleµ´³named³kind´³refµ„³ ValueKind„„„„„„„„³Function´³rec´³lit³count„´³tupleµ´³named³selector´³refµ„³Selector„„„„„³Selector´³seqof´³refµ„³Step„„³ Predicate´³orµµ±Selector´³refµ„³Selector„„µ±not´³rec´³lit³not„´³tupleµ´³named³pred´³refµ„³ Predicate„„„„„„µ±or´³rec´³lit³or„´³tupleµ´³named³preds´³seqof´³refµ„³ Predicate„„„„„„„µ±and´³rec´³lit³and„´³tupleµ´³named³preds´³seqof´³refµ„³ Predicate„„„„„„„„„³ ValueKind´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ± SignedInteger´³lit³ SignedInteger„„µ±String´³lit³String„„µ±
ByteString´³lit³
ByteString„„µ±Symbol´³lit³Symbol„„µ±Record´³lit³Record„„µ±Sequence´³lit³Sequence„„µ±Set´³lit³Set„„µ±

View File

@ -94,14 +94,14 @@ Evaluating the expression against `testdata` yields the following:
... print(stringify(result))
<Test #[tLMHY2FwdHVyZbSzB2Rpc2NhcmSEhA==] <capture <discard>>>
<Test #[tLMHb2JzZXJ2ZbSzBXNwZWFrtLMHZGlzY2FyZIS0swdjYXB0dXJltLMHZGlzY2FyZISEhIQ=] <observe <speak <discard> <capture <discard>>>>>
<Test #[tLWzBnRpdGxlZLMGcGVyc29ukrMFdGhpbmeRhKBlsQlCbGFja3dlbGy0swRkYXRloQcdkpOEsQJEcoQ=] <[titled person 2 thing 1] 101 "Blackwell" <date 1821 2 3> "Dr">>
<Test #[tLWzBnRpdGxlZLMGcGVyc29usAECswV0aGluZ7ABAYSwAWWxCUJsYWNrd2VsbLSzBGRhdGWwAgcdsAECsAEDhLECRHKE] <[titled person 2 thing 1] 101 "Blackwell" <date 1821 2 3> "Dr">>
<Test #[tLMHZGlzY2FyZIQ=] <discard>>
<Test #[tJe1hIQ=] <7 []>>
<Test #[tLABB7WEhA==] <7 []>>
<Test #[tLMHZGlzY2FyZLMIc3VycHJpc2WE] <discard surprise>>
<Test #[tLEHYVN0cmluZ5OUhA==] <"aString" 3 4>>
<Test #[tLSzB2Rpc2NhcmSEk5SE] <<discard> 3 4>>
<Test #[hbMCYXK0swFShbMCYWazAWaE] @ar <R @af f>>
<Test #[tIWzAmFyswFShbMCYWazAWaE] <@ar R @af f>>
<Test #[tLEHYVN0cmluZ7ABA7ABBIQ=] <"aString" 3 4>>
<Test #[tLSzB2Rpc2NhcmSEsAEDsAEEhA==] <<discard> 3 4>>
<Test #[v7SzAVK/swFmswJhZoSEswJhcoQ=] @ar <R @af f>>
<Test #[tL+zAVKzAmFyhL+zAWazAmFmhIQ=] <@ar R @af f>>
```

View File

@ -1,6 +1,6 @@
´³schema·³version³ definitions·³Ref´³rec´³lit³ref„´³tupleµ´³named³module´³refµ„³
´³schema·³version°³ definitions·³Ref´³rec´³lit³ref„´³tupleµ´³named³module´³refµ„³
ModulePath„„´³named³name´³atom³Symbol„„„„„³Bundle´³rec´³lit³bundle„´³tupleµ´³named³modules´³refµ„³Modules„„„„„³Schema´³rec´³lit³schema„´³tupleµ´³dict·³version´³named³version´³refµ„³Version„„³ definitions´³named³ definitions´³refµ„³ Definitions„„³ embeddedType´³named³ embeddedType´³refµ„³EmbeddedTypeName„„„„„„„³Binding´³rec´³lit³named„´³tupleµ´³named³name´³atom³Symbol„„´³named³pattern´³refµ„³ SimplePattern„„„„„³Modules´³dictof´³refµ„³
ModulePath„´³refµ„³Schema„„³Pattern´³orµµ± SimplePattern´³refµ„³ SimplePattern„„µ±CompoundPattern´³refµ„³CompoundPattern„„„„³Version´³lit„³AtomKind´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ± SignedInteger´³lit³ SignedInteger„„µ±String´³lit³String„„µ±
ModulePath„´³refµ„³Schema„„³Pattern´³orµµ± SimplePattern´³refµ„³ SimplePattern„„µ±CompoundPattern´³refµ„³CompoundPattern„„„„³Version´³lit°„³AtomKind´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ± SignedInteger´³lit³ SignedInteger„„µ±String´³lit³String„„µ±
ByteString´³lit³
ByteString„„µ±Symbol´³lit³Symbol„„„„³
Definition´³orµµ±or´³rec´³lit³or„´³tupleµ´³ tuplePrefixµ´³named³pattern0´³refµ„³NamedAlternative„„´³named³pattern1´³refµ„³NamedAlternative„„„´³named³patternN´³seqof´³refµ„³NamedAlternative„„„„„„„„µ±and´³rec´³lit³and„´³tupleµ´³ tuplePrefixµ´³named³pattern0´³refµ„³ NamedPattern„„´³named³pattern1´³refµ„³ NamedPattern„„„´³named³patternN´³seqof´³refµ„³ NamedPattern„„„„„„„„µ±Pattern´³refµ„³Pattern„„„„³

View File

@ -57,9 +57,9 @@ class Float(object):
>>> preserves.parse('3.45')
3.45
>>> preserves.encode(Float(3.45))
b'\\x82@\\\\\\xcc\\xcd'
b'\\x87\\x04@\\\\\\xcc\\xcd'
>>> preserves.encode(3.45)
b'\\x83@\\x0b\\x99\\x99\\x99\\x99\\x99\\x9a'
b'\\x87\\x08@\\x0b\\x99\\x99\\x99\\x99\\x99\\x9a'
```
@ -123,7 +123,8 @@ class Float(object):
return struct.pack('>f', self.value)
def __preserve_write_binary__(self, encoder):
encoder.buffer.append(0x82)
encoder.buffer.append(0x87)
encoder.buffer.append(4)
encoder.buffer.extend(self.to_bytes())
def __preserve_write_text__(self, formatter):
@ -577,11 +578,14 @@ class Annotated(object):
self.item = item
def __preserve_write_binary__(self, encoder):
if encoder.include_annotations:
if encoder.include_annotations and self.annotations:
encoder.buffer.append(0xbf)
encoder.append(self.item)
for a in self.annotations:
encoder.buffer.append(0x85)
encoder.append(a)
encoder.append(self.item)
encoder.buffer.append(0x84)
else:
encoder.append(self.item)
def __preserve_write_text__(self, formatter):
if formatter.include_annotations:

View File

@ -43,16 +43,17 @@
"13/14 and 16/17, depending on how they wish to treat end-of-stream conditions."
]>
<TestCases {
annotation1: <Test #x"85B10361626399" @"abc" 9>
annotation2: <Test #x"85B10361626385B103646566B5B58485B10178B58484" @"abc" @"def" [[] @"x" []]>
annotation3: <Test #x"858591928585939495" @@1 2 @@3 4 5>
annotation4: <NondeterministicTest #x"B7 85 B302616b B30161 85 B3026176 91 85 B302626b B30162 85 B3026276 92 84"
annotation1: <Test #x"BFB00109B10361626384" @"abc" 9>
annotation2: <Test #x"BF B5 B584 BF B584 B10178 84 84 B103616263 B103646566 84" @"abc" @"def" [[] @"x" []]>
annotation3: <Test #x"BF B00105 BF B00102 B00101 84 BF B00104 B00103 84 84" @@1 2 @@3 4 5>
annotation4: <NondeterministicTest
#x"B7 BF B30161 B302616b 84 BF B00101 B3026176 84 BF B30162 B302626b 84 BF B00102 B3026276 84 84"
{@ak a: @av 1 @bk b: @bv 2}>
annotation5: <Test #x"85B3026172B4B3015285B3026166B3016684" @ar <R @af f>>
annotation6: <Test #x"B485B3026172B3015285B3026166B3016684" <@ar R @af f>>
annotation5: <Test #x"BF B4 B30152 BF B30166 B3026166 84 84 B3026172 84" @ar <R @af f>>
annotation6: <Test #x"B4 BF B30152 B3026172 84 BF B30166 B3026166 84 84" <@ar R @af f>>
annotation7:
;Stop reading symbols at @ -- this test has three separate annotations
<Test #x"85B3016185B3016285B30163B584" @a@b@c[]>
<Test #x"BF B584 B30161 B30162 B30163 84" @a@b@c[]>
bytes2: <Test #x"B20568656c6c6f" #"hello">
bytes2a: <Test @"Internal whitespace is allowed, including commas!" #x"B2, 05, 68, 65, 6c, 6c, 6f" #"hello">
bytes3: <Test #x"B203414243" #"ABC">
@ -68,108 +69,108 @@
bytes13: <Test #x"B2 11 61 62 63 6c 34 f0 5c 2f 22 08 0c 0a 0d 09 78 79 7a" #"abc\x6c\x34\xf0\\/\"\b\f\n\r\txyz">
dict0: <Test #x"B784" {}>
dict1: <NondeterministicTest #x"b7 b10162 81 b30161 91 b591929384 b20163 b7 b30a66697273742d6e616d65 b109456c697a6162657468 84 b7 b3077375726e616d65 b109426c61636b77656c6c 84 84" { a: 1 "b": #t [1 2 3]: #"c" { first-name: "Elizabeth" }: { surname: "Blackwell" } }>
dict1: <NondeterministicTest #x"b7 b10162 81 b30161 b00101 b5b00101b00102b0010384 b20163 b7 b30a66697273742d6e616d65 b109456c697a6162657468 84 b7 b3077375726e616d65 b109426c61636b77656c6c 84 84" { a: 1 "b": #t [1 2 3]: #"c" { first-name: "Elizabeth" }: { surname: "Blackwell" } }>
dict2: @"Missing close brace" <ParseShort "{ a: b, c: d ">
dict2a: @"Missing close brace" <ParseShort "{">
dict3: @"Duplicate key" <ParseError "{ a: 1, a: 2 }">
dict4: @"Unexpected close brace" <ParseError "}">
dict5: @"Missing value" <DecodeError #x"b7 91 92 93 84">
double0: <Test #x"830000000000000000" 0.0>
double+0: <Test #x"830000000000000000" +0.0>
double-0: <Test #x"838000000000000000" -0.0>
double1: <Test #x"833ff0000000000000" 1.0>
double2: <Test #x"83fe3cb7b759bf0426" -1.202e300>
double3: <Test #x"83123456789abcdef0" #xd"12 34 56 78 9a bc de f0">
dict5: @"Missing value" <DecodeError #x"b7 b00101 b00102 b00103 84">
double0: <Test #x"87080000000000000000" 0.0>
double+0: <Test #x"87080000000000000000" +0.0>
double-0: <Test #x"87088000000000000000" -0.0>
double1: <Test #x"87083ff0000000000000" 1.0>
double2: <Test #x"8708fe3cb7b759bf0426" -1.202e300>
double3: <Test #x"8708123456789abcdef0" #xd"12 34 56 78 9a bc de f0">
double4: @"Fewer than 16 digits" <ParseError "#xd\"12345678\"">
double5: @"More than 16 digits" <ParseError "#xd\"123456789abcdef012\"">
double6: @"Invalid chars" <ParseError "#xd\"12zz56789abcdef0\"">
double7: @"Positive infinity" <Test #x"837ff0000000000000" #xd"7ff0000000000000">
double8: @"Negative infinity" <Test #x"83fff0000000000000" #xd"fff0000000000000">
double9: @"-qNaN" <Test #x"83fff0000000000001" #xd"fff0000000000001">
double10: @"-qNaN" <Test #x"83fff0000000000111" #xd"fff0000000000111">
double11: @"+qNaN" <Test #x"837ff0000000000001" #xd"7ff0000000000001">
double12: @"+qNaN" <Test #x"837ff0000000000111" #xd"7ff0000000000111">
double7: @"Positive infinity" <Test #x"87087ff0000000000000" #xd"7ff0000000000000">
double8: @"Negative infinity" <Test #x"8708fff0000000000000" #xd"fff0000000000000">
double9: @"-qNaN" <Test #x"8708fff0000000000001" #xd"fff0000000000001">
double10: @"-qNaN" <Test #x"8708fff0000000000111" #xd"fff0000000000111">
double11: @"+qNaN" <Test #x"87087ff0000000000001" #xd"7ff0000000000001">
double12: @"+qNaN" <Test #x"87087ff0000000000111" #xd"7ff0000000000111">
double13: @"Bad spacing" <ParseError "#xd\"12345 6789abcdef0\"">
double14: @"-sNaN" <Test #x"83fff8000000000001" #xd"fff8000000000001">
double15: @"-sNaN" <Test #x"83fff8000000000111" #xd"fff8000000000111">
double16: @"+sNaN" <Test #x"837ff8000000000001" #xd"7ff8000000000001">
double17: @"+sNaN" <Test #x"837ff8000000000111" #xd"7ff8000000000111">
float0: <Test #x"8200000000" 0.0f>
float+0: <Test #x"8200000000" +0.0f>
float-0: <Test #x"8280000000" -0.0f>
float1: <Test #x"823f800000" 1.0f>
float2: <Test #x"8212345678" #xf"12 34 56 78">
double14: @"-sNaN" <Test #x"8708fff8000000000001" #xd"fff8000000000001">
double15: @"-sNaN" <Test #x"8708fff8000000000111" #xd"fff8000000000111">
double16: @"+sNaN" <Test #x"87087ff8000000000001" #xd"7ff8000000000001">
double17: @"+sNaN" <Test #x"87087ff8000000000111" #xd"7ff8000000000111">
float0: <Test #x"870400000000" 0.0f>
float+0: <Test #x"870400000000" +0.0f>
float-0: <Test #x"870480000000" -0.0f>
float1: <Test #x"87043f800000" 1.0f>
float2: <Test #x"870412345678" #xf"12 34 56 78">
float3: @"Fewer than 8 digits" <ParseError "#xf\"123456\"">
float4: @"More than 8 digits" <ParseError "#xf\"123456789a\"">
float5: @"Invalid chars" <ParseError "#xf\"12zz5678\"">
float6: @"Positive infinity" <Test #x"827f800000" #xf"7f800000">
float7: @"Negative infinity" <Test #x"82ff800000" #xf"ff800000">
float8: @"+sNaN" <Test #x"827f800001" #xf"7f800001">
float9: @"+sNaN" <Test #x"827f800111" #xf"7f800111">
float10: @"-sNaN" <Test #x"82ff800001" #xf"ff800001">
float11: @"-sNaN" <Test #x"82ff800111" #xf"ff800111">
float6: @"Positive infinity" <Test #x"87047f800000" #xf"7f800000">
float7: @"Negative infinity" <Test #x"8704ff800000" #xf"ff800000">
float8: @"+sNaN" <Test #x"87047f800001" #xf"7f800001">
float9: @"+sNaN" <Test #x"87047f800111" #xf"7f800111">
float10: @"-sNaN" <Test #x"8704ff800001" #xf"ff800001">
float11: @"-sNaN" <Test #x"8704ff800111" #xf"ff800111">
float12: @"Bad spacing" <ParseError "#xf\"12345 678\"">
float13: @"+qNaN" <Test #x"827fc00001" #xf"7fc00001">
float14: @"+qNaN" <Test #x"827fc00111" #xf"7fc00111">
float15: @"-qNaN" <Test #x"82ffc00001" #xf"ffc00001">
float16: @"-qNaN" <Test #x"82ffc00111" #xf"ffc00111">
int-257: <Test #x"a1feff" -257>
int-256: <Test #x"a1ff00" -256>
int-255: <Test #x"a1ff01" -255>
int-254: <Test #x"a1ff02" -254>
int-129: <Test #x"a1ff7f" -129>
int-128: <Test #x"a080" -128>
int-127: <Test #x"a081" -127>
int-4: <Test #x"a0fc" -4>
int-3: <Test #x"9d" -3>
int-2: <Test #x"9e" -2>
int-1: <Test #x"9f" -1>
int0: <Test #x"90" 0>
int+0: <Test #x"90" +0>
int-0: <Test #x"90" -0>
int1: <Test #x"91" 1>
int12: <Test #x"9c" 12>
int13: <Test #x"a00d" 13>
int127: <Test #x"a07f" 127>
int+127: <Test #x"a07f" +127>
int128: <Test #x"a10080" 128>
int255: <Test #x"a100ff" 255>
int256: <Test #x"a10100" 256>
int32767: <Test #x"a17fff" 32767>
int32768: <Test #x"a2008000" 32768>
int65535: <Test #x"a200ffff" 65535>
int65536: <Test #x"a2010000" 65536>
int131072: <Test #x"a2020000" 131072>
int2500000000: <Test #x"a4009502f900" 2500000000>
float13: @"+qNaN" <Test #x"87047fc00001" #xf"7fc00001">
float14: @"+qNaN" <Test #x"87047fc00111" #xf"7fc00111">
float15: @"-qNaN" <Test #x"8704ffc00001" #xf"ffc00001">
float16: @"-qNaN" <Test #x"8704ffc00111" #xf"ffc00111">
int-257: <Test #x"b002feff" -257>
int-256: <Test #x"b002ff00" -256>
int-255: <Test #x"b002ff01" -255>
int-254: <Test #x"b002ff02" -254>
int-129: <Test #x"b002ff7f" -129>
int-128: <Test #x"b00180" -128>
int-127: <Test #x"b00181" -127>
int-4: <Test #x"b001fc" -4>
int-3: <Test #x"b001fd" -3>
int-2: <Test #x"b001fe" -2>
int-1: <Test #x"b001ff" -1>
int0: <Test #x"b000" 0>
int+0: <Test #x"b000" +0>
int-0: <Test #x"b000" -0>
int1: <Test #x"b00101" 1>
int12: <Test #x"b0010c" 12>
int13: <Test #x"b0010d" 13>
int127: <Test #x"b0017f" 127>
int+127: <Test #x"b0017f" +127>
int128: <Test #x"b0020080" 128>
int255: <Test #x"b00200ff" 255>
int256: <Test #x"b0020100" 256>
int32767: <Test #x"b0027fff" 32767>
int32768: <Test #x"b003008000" 32768>
int65535: <Test #x"b00300ffff" 65535>
int65536: <Test #x"b003010000" 65536>
int131072: <Test #x"b003020000" 131072>
int2500000000: <Test #x"b005009502f900" 2500000000>
int87112285931760246646623899502532662132736: <Test #x"b012010000000000000000000000000000000000" 87112285931760246646623899502532662132736>
list0: <Test #x"b584" []>
list4: <Test #x"b59192939484" [1 2 3 4]>
list4a: <Test #x"b59192939484" [1, 2, 3, 4]>
list5: <Test #x"b59e9f909184" [-2 -1 0 1]>
list4: <Test #x"b5b00101b00102b00103b0010484" [1 2 3 4]>
list4a: <Test #x"b5b00101b00102b00103b0010484" [1, 2, 3, 4]>
list5: <Test #x"b5b001feb001ffb000b0010184" [-2 -1 0 1]>
list6: <Test #x"b5 b10568656c6c6f b3057468657265 b205776f726c64 b584 b684 81 80 84" ["hello" there #"world" [] #{} #t #f]>
list7: <Test #x"b5 b303616263 b3032e2e2e b303646566 84" [abc ... def]>
list8: @"Missing close bracket" <ParseShort "[">
list9: @"Unexpected close bracket" <ParseError "]">
list10: @"Missing end byte" <DecodeShort #x"b58080">
list11: <Test #x"b59184" [01]>
list12: <Test #x"b59c84" [12]>
list11: <Test #x"b5b0010184" [01]>
list12: <Test #x"b5b0010c84" [12]>
noinput0: @"No input at all" <DecodeEOF #x"">
embed0: <Test #x"8690" #!0>
embed1: <Test #x"868690" #!#!0>
embed2: <Test #x"b5869086b10568656c6c6f84" [#!0 #!"hello"]>
embed0: <Test #x"86b000" #!0>
embed1: <Test #x"8686b000" #!#!0>
embed2: <Test #x"b586b00086b10568656c6c6f84" [#!0 #!"hello"]>
record1: <Test #x"b4 b30763617074757265 b4 b30764697363617264 84 84" <capture <discard>>>
record2: <Test #x"b4 b3076f627365727665 b4 b305737065616b b4 b30764697363617264 84 b4 b30763617074757265 b4 b30764697363617264 84 84 84 84" <observe <speak <discard>, <capture <discard>>>>>
record3: <Test #x"b4 b5 b3067469746c6564 b306706572736f6e 92 b3057468696e67 91 84 a065 b109426c61636b77656c6c b4 b30464617465 a1071d 92 93 84 b1024472 84" <[titled person 2 thing 1] 101 "Blackwell" <date 1821 2 3> "Dr">>
record3: <Test #x"b4 b5 b3067469746c6564 b306706572736f6e b00102 b3057468696e67 b00101 84 b00165 b109426c61636b77656c6c b4 b30464617465 b002071d b00102 b00103 84 b1024472 84" <[titled person 2 thing 1] 101 "Blackwell" <date 1821 2 3> "Dr">>
record4: <Test #x"b4 b30764697363617264 84" <discard>>
record5: <Test #x"b497b58484" <7[]>>
record5: <Test #x"b4b00107b58484" <7[]>>
record6: <Test #x"b4b30764697363617264b308737572707269736584" <discard surprise>>
record7: <Test #x"b4b10761537472696e67939484" <"aString" 3 4>>
record8: <Test #x"b4b4b3076469736361726484939484" <<discard> 3 4>>
record7: <Test #x"b4b10761537472696e67b00103b0010484" <"aString" 3 4>>
record8: <Test #x"b4b4b3076469736361726484b00103b0010484" <<discard> 3 4>>
record9: @"Missing record label" <ParseError "<>">
record10: @"Missing close-angle-bracket" <ParseShort "<">
record11: @"Unexpected close-angle-bracket" <ParseError ">">
set0: <Test #x"b684" #{}>
set1: <NondeterministicTest #x"b691929384" #{1 2 3}>
set1: <NondeterministicTest #x"b6b00101b00102b0010384" #{1 2 3}>
set2: @"Missing close brace" <ParseShort "#{ 1 2 3 ">
set2a: @"Missing close brace" <ParseShort "#{">
set3: @"Duplicate value" <ParseError "#{a a}">
@ -277,17 +278,17 @@
B7
B1 03 494473
B5
A0 74
A1 03 AF
A1 00 EA
A2 00 97 89
B0 01 74
B0 02 03 AF
B0 02 00 EA
B0 03 00 97 89
84
B1 05 5469746c65
B1 14 566965772066726f6d203135746820466c6f6f72
B1 05 5769647468
A1 03 20
B0 02 03 20
B1 06 486569676874
A1 02 58
B0 02 02 58
B1 08 416e696d61746564
B3 05 66616c7365
B1 09 5468756d626e61696c
@ -295,9 +296,9 @@
B1 03 55726c
B1 26 687474703a2f2f7777772e6578616d706c652e636f6d2f696d6167652f343831393839393433
B1 05 5769647468
A0 64
B0 01 64
B1 06 486569676874
A0 7D
B0 01 7D
84
84
84"
@ -324,8 +325,8 @@
b1 05 5374617465 b1 02 4341
b1 07 41646472657373 b1 00
b1 07 436f756e747279 b1 02 5553
b1 08 4c61746974756465 83 4042e226809d4952
b1 09 4c6f6e676974756465 83 c05e99566cf41f21
b1 08 4c61746974756465 8708 4042e226809d4952
b1 09 4c6f6e676974756465 8708 c05e99566cf41f21
b1 09 707265636973696f6e b1 03 7a6970
84
b7
@ -334,8 +335,8 @@
b1 05 5374617465 b1 02 4341
b1 07 41646472657373 b1 00
b1 07 436f756e747279 b1 02 5553
b1 08 4c61746974756465 83 4042af9d66adb403
b1 09 4c6f6e676974756465 83 c05e81aa4fca42af
b1 08 4c61746974756465 8708 4042af9d66adb403
b1 09 4c6f6e676974756465 8708 c05e81aa4fca42af
b1 09 707265636973696f6e b1 03 7a6970
84
84"

View File

@ -79,12 +79,12 @@ class BinaryCodecTests(PreservesTestCase):
self.assertPreservesEqual(_varint(1000000000), _buf(128, 148, 235, 220, 3))
def test_simple_seq(self):
self._roundtrip([1,2,3,4], _buf(0xb5, 0x91, 0x92, 0x93, 0x94, 0x84), back=(1,2,3,4))
self._roundtrip([1,2,3,4], _buf(0xb5, 0xb0, 0x01, 0x01, 0xb0, 0x01, 0x02, 0xb0, 0x01, 0x03, 0xb0, 0x01, 0x04, 0x84), back=(1,2,3,4))
self._roundtrip(iter([1,2,3,4]),
_buf(0xb5, 0x91, 0x92, 0x93, 0x94, 0x84),
_buf(0xb5, 0xb0, 0x01, 0x01, 0xb0, 0x01, 0x02, 0xb0, 0x01, 0x03, 0xb0, 0x01, 0x04, 0x84),
back=(1,2,3,4),
nondeterministic=True)
self._roundtrip((-2,-1,0,1), _buf(0xb5, 0x9E, 0x9F, 0x90, 0x91, 0x84))
self._roundtrip((-2,-1,0,1), _buf(0xb5, 0xb0, 0x01, 0xFE, 0xb0, 0x01, 0xFF, 0xb0, 0x00, 0xb0, 0x01, 0x01, 0x84))
def test_str(self):
self._roundtrip(u'hello', _buf(0xb1, 0x05, 'hello'))
@ -102,35 +102,35 @@ class BinaryCodecTests(PreservesTestCase):
0x84))
def test_signedinteger(self):
self._roundtrip(-257, _buf(0xa1, 0xFE, 0xFF))
self._roundtrip(-256, _buf(0xa1, 0xFF, 0x00))
self._roundtrip(-255, _buf(0xa1, 0xFF, 0x01))
self._roundtrip(-254, _buf(0xa1, 0xFF, 0x02))
self._roundtrip(-129, _buf(0xa1, 0xFF, 0x7F))
self._roundtrip(-128, _buf(0xa0, 0x80))
self._roundtrip(-127, _buf(0xa0, 0x81))
self._roundtrip(-4, _buf(0xa0, 0xFC))
self._roundtrip(-3, _buf(0x9D))
self._roundtrip(-2, _buf(0x9E))
self._roundtrip(-1, _buf(0x9F))
self._roundtrip(0, _buf(0x90))
self._roundtrip(1, _buf(0x91))
self._roundtrip(12, _buf(0x9C))
self._roundtrip(13, _buf(0xa0, 0x0D))
self._roundtrip(127, _buf(0xa0, 0x7F))
self._roundtrip(128, _buf(0xa1, 0x00, 0x80))
self._roundtrip(255, _buf(0xa1, 0x00, 0xFF))
self._roundtrip(256, _buf(0xa1, 0x01, 0x00))
self._roundtrip(32767, _buf(0xa1, 0x7F, 0xFF))
self._roundtrip(32768, _buf(0xa2, 0x00, 0x80, 0x00))
self._roundtrip(65535, _buf(0xa2, 0x00, 0xFF, 0xFF))
self._roundtrip(65536, _buf(0xa2, 0x01, 0x00, 0x00))
self._roundtrip(131072, _buf(0xa2, 0x02, 0x00, 0x00))
self._roundtrip(-257, _buf(0xb0, 0x02, 0xFE, 0xFF))
self._roundtrip(-256, _buf(0xb0, 0x02, 0xFF, 0x00))
self._roundtrip(-255, _buf(0xb0, 0x02, 0xFF, 0x01))
self._roundtrip(-254, _buf(0xb0, 0x02, 0xFF, 0x02))
self._roundtrip(-129, _buf(0xb0, 0x02, 0xFF, 0x7F))
self._roundtrip(-128, _buf(0xb0, 0x01, 0x80))
self._roundtrip(-127, _buf(0xb0, 0x01, 0x81))
self._roundtrip(-4, _buf(0xb0, 0x01, 0xFC))
self._roundtrip(-3, _buf(0xb0, 0x01, 0xFD))
self._roundtrip(-2, _buf(0xb0, 0x01, 0xFE))
self._roundtrip(-1, _buf(0xb0, 0x01, 0xFF))
self._roundtrip(0, _buf(0xb0, 0x00))
self._roundtrip(1, _buf(0xb0, 0x01, 0x01))
self._roundtrip(12, _buf(0xb0, 0x01, 0x0C))
self._roundtrip(13, _buf(0xb0, 0x01, 0x0D))
self._roundtrip(127, _buf(0xb0, 0x01, 0x7F))
self._roundtrip(128, _buf(0xb0, 0x02, 0x00, 0x80))
self._roundtrip(255, _buf(0xb0, 0x02, 0x00, 0xFF))
self._roundtrip(256, _buf(0xb0, 0x02, 0x01, 0x00))
self._roundtrip(32767, _buf(0xb0, 0x02, 0x7F, 0xFF))
self._roundtrip(32768, _buf(0xb0, 0x03, 0x00, 0x80, 0x00))
self._roundtrip(65535, _buf(0xb0, 0x03, 0x00, 0xFF, 0xFF))
self._roundtrip(65536, _buf(0xb0, 0x03, 0x01, 0x00, 0x00))
self._roundtrip(131072, _buf(0xb0, 0x03, 0x02, 0x00, 0x00))
def test_floats(self):
self._roundtrip(Float(1.0), _buf(0x82, 0x3f, 0x80, 0, 0))
self._roundtrip(1.0, _buf(0x83, 0x3f, 0xf0, 0, 0, 0, 0, 0, 0))
self._roundtrip(-1.202e300, _buf(0x83, 0xfe, 0x3c, 0xb7, 0xb7, 0x59, 0xbf, 0x04, 0x26))
self._roundtrip(Float(1.0), _buf(0x87, 0x04, 0x3f, 0x80, 0, 0))
self._roundtrip(1.0, _buf(0x87, 0x08, 0x3f, 0xf0, 0, 0, 0, 0, 0, 0))
self._roundtrip(-1.202e300, _buf(0x87, 0x08, 0xfe, 0x3c, 0xb7, 0xb7, 0x59, 0xbf, 0x04, 0x26))
def test_dict(self):
self._roundtrip({ Symbol(u'a'): 1,
@ -139,9 +139,9 @@ class BinaryCodecTests(PreservesTestCase):
ImmutableDict({ Symbol(u'first-name'): u'Elizabeth', }):
{ Symbol(u'surname'): u'Blackwell' } },
_buf(0xB7,
0xb3, 0x01, "a", 0x91,
0xb3, 0x01, "a", 0xb0, 0x01, 0x01,
0xb1, 0x01, "b", 0x81,
0xb5, 0x91, 0x92, 0x93, 0x84, 0xb2, 0x01, "c",
0xb5, 0xb0, 0x01, 0x01, 0xb0, 0x01, 0x02, 0xb0, 0x01, 0x03, 0x84, 0xb2, 0x01, "c",
0xB7, 0xb3, 0x0A, "first-name", 0xb1, 0x09, "Elizabeth", 0x84,
0xB7, 0xb3, 0x07, "surname", 0xb1, 0x09, "Blackwell", 0x84,
0x84),
@ -149,7 +149,7 @@ class BinaryCodecTests(PreservesTestCase):
def test_iterator_stream(self):
d = {u'a': 1, u'b': 2, u'c': 3}
r = r'b5(b5b1016.9.84){3}84'
r = r'b5(b5b1016.b0010.84){3}84'
if hasattr(d, 'iteritems'):
# python 2
bs = _e(d.iteritems())
@ -187,13 +187,13 @@ class BinaryCodecTests(PreservesTestCase):
objects.append(p)
return len(objects) - 1
self.assertPreservesEqual(encode([Embedded(object()), Embedded(object())], encode_embedded = enc),
b'\xb5\x86\x90\x86\x91\x84')
b'\xb5\x86\xb0\x00\x86\xb0\x01\x01\x84')
def test_decode_embedded(self):
objects = [123, 234]
def dec(v):
return objects[v]
self.assertPreservesEqual(decode(b'\xb5\x86\x90\x86\x91\x84', decode_embedded = dec),
self.assertPreservesEqual(decode(b'\xb5\x86\xb0\x00\x86\xb0\x01\x01\x84', decode_embedded = dec),
(Embedded(123), Embedded(234)))
def load_binary_samples():

View File

@ -23,17 +23,11 @@
(match (next-byte)
[#x80 #f]
[#x81 #t]
[#x82 (bytes->float (next-bytes 4))]
[#x83 (bytes->double (next-bytes 8))]
[#x84 '#:end]
[#x85 (let ((a (next)))
(match (next)
[(annotated as i) (annotated (cons a as) i)]
[i (annotated (list a) i)]))]
[#x86 (embedded (next))]
[(? (between #x90 #x9C) v) (- v #x90)]
[(? (between #x9D #x9F) v) (- v #xA0)]
[(? (between #xA0 #xAF) v) (next-integer (- v #xA0 -1))]
[#x87 (match (next-byte)
[4 (bytes->float (next-bytes 4))]
[8 (bytes->double (next-bytes 8))])]
[#xB0 (next-integer (next-varint))]
[#xB1 (bytes->string/utf-8 (next-bytes (next-varint)))]
[#xB2 (next-bytes (next-varint))]
@ -41,7 +35,8 @@
[#xB4 (apply (lambda (label . fields) (record label fields)) (next-items))]
[#xB5 (next-items)]
[#xB6 (list->set (next-items))]
[#xB7 (apply hash (next-items))]))
[#xB7 (apply hash (next-items))]
[#xBF (apply (lambda (underlying . anns) (annotated anns underlying)) (next-items))]))
(define (next-items) (match (next) ['#:end '()] [v (cons v (next-items))]))
@ -56,14 +51,13 @@
(define (next-varint) (eof-guard (read-varint in-port)))
(define (next-integer n)
(define acc0 (next-byte))
(define acc (if (< acc0 128) acc0 (- acc0 256)))
(for/fold [(acc acc)] [(n (in-range (- n 1)))] (+ (* acc 256) (next-byte))))
(cond [(zero? n) 0]
[else (define acc0 (next-byte))
(define acc (if (< acc0 128) acc0 (- acc0 256)))
(for/fold [(acc acc)] [(n (in-range (- n 1)))] (+ (* acc 256) (next-byte)))]))
(next)))
(define ((between lo hi) v) (<= lo v hi))
(define (read-varint in-port)
(let/ec return
(let loop ()
@ -80,26 +74,19 @@
(match v
[#f (write-byte #x80 out-port)]
[#t (write-byte #x81 out-port)]
[(float _) (write-byte #x82 out-port) (output-bytes (float->bytes v))]
[(? flonum?) (write-byte #x83 out-port) (output-bytes (double->bytes v))]
[(annotated as v)
(for [(a (in-list as))] (write-byte #x85 out-port) (output a))
(output v)]
[(float _) (write-byte #x87 out-port) (write-byte 4 out-port) (output-bytes (float->bytes v))]
[(? flonum?) (write-byte #x87 out-port) (write-byte 8 out-port) (output-bytes (double->bytes v))]
[(embedded v) (write-byte #x86 out-port) (output v)]
[(? integer?)
(cond [(<= -3 v -1) (write-byte (+ v #xA0) out-port)]
[(<= 0 v 12) (write-byte (+ v #x90) out-port)]
[else (define raw-bit-count (+ (integer-length v) 1)) ;; at least one sign bit
(define byte-count (quotient (+ raw-bit-count 7) 8))
(if (<= byte-count 16)
(write-byte (+ byte-count #xA0 -1) out-port)
(begin (write-byte #xB0 out-port)
(write-varint byte-count out-port)))
(for [(shift (in-range (* byte-count 8) 0 -8))]
(write-byte (bitwise-bit-field v (- shift 8) shift) out-port))])]
(write-byte #xB0 out-port)
(define byte-count (cond [(zero? v) 0]
[else (define raw-bit-count (+ (integer-length v) 1))
(quotient (+ raw-bit-count 7) 8)]))
(write-varint byte-count out-port)
(for [(shift (in-range (* byte-count 8) 0 -8))]
(write-byte (bitwise-bit-field v (- shift 8) shift) out-port))]
[(? string?) (count-bytes 1 (string->bytes/utf-8 v))]
[(? bytes?) (count-bytes 2 v)]
@ -109,6 +96,7 @@
[(? list?) (with-seq 5 (for-each output v))]
[(? set?) (with-seq 6 (output-set v))]
[(? hash?) (with-seq 7 (output-hash v))]
[(annotated as v) (with-seq 15 (output v) (for-each output as))]
[_ (error 'write-preserve/binary "Invalid value: ~v" v)]))

View File

@ -34,8 +34,6 @@
[(? eof-object?) (on-short)]
[v v]))))
(define ((between lo hi) v) (<= lo v hi))
(define (read-preserve/binary [in-port (current-input-port)]
#:read-syntax? [read-syntax? #f]
#:decode-embedded [decode-embedded0 #f]
@ -71,17 +69,12 @@
(match lead-byte
[#x80 #f]
[#x81 #t]
[#x82 (bytes->float (next-bytes 4))]
[#x83 (bytes->double (next-bytes 8))]
[#x84 '#:end]
[#x85 (let ((a (next)))
(if read-annotations?
(annotate (next) a)
(next)))]
[#x86 (embedded (decode-embedded (next)))]
[(? (between #x90 #x9C) v) (- v #x90)]
[(? (between #x9D #x9F) v) (- v #xA0)]
[(? (between #xA0 #xAF) v) (next-integer (- v #xA0 -1))]
[#x87 (match (next-varint)
[4 (bytes->float (next-bytes 4))]
[8 (bytes->double (next-bytes 8))]
[n (return (on-fail "Invalid Preserves IEEE754 size: ~v" n))])]
[#xB0 (next-integer (next-varint))]
[#xB1 (bytes->string/utf-8 (next-bytes (next-varint)))]
[#xB2 (next-bytes (next-varint))]
@ -90,6 +83,7 @@
[#xB5 (next-items)]
[#xB6 (list->set (next-items))]
[#xB7 (build-dictionary (next-items))]
[#xBF (apply annotate (next-items))]
[_ (return (on-fail "Invalid Preserves binary tag: ~v" lead-byte))]))
(define (eof-guard v)

View File

@ -43,16 +43,17 @@
"13/14 and 16/17, depending on how they wish to treat end-of-stream conditions."
]>
<TestCases {
annotation1: <Test #x"85B10361626399" @"abc" 9>
annotation2: <Test #x"85B10361626385B103646566B5B58485B10178B58484" @"abc" @"def" [[] @"x" []]>
annotation3: <Test #x"858591928585939495" @@1 2 @@3 4 5>
annotation4: <NondeterministicTest #x"B7 85 B302616b B30161 85 B3026176 91 85 B302626b B30162 85 B3026276 92 84"
annotation1: <Test #x"BFB00109B10361626384" @"abc" 9>
annotation2: <Test #x"BF B5 B584 BF B584 B10178 84 84 B103616263 B103646566 84" @"abc" @"def" [[] @"x" []]>
annotation3: <Test #x"BF B00105 BF B00102 B00101 84 BF B00104 B00103 84 84" @@1 2 @@3 4 5>
annotation4: <NondeterministicTest
#x"B7 BF B30161 B302616b 84 BF B00101 B3026176 84 BF B30162 B302626b 84 BF B00102 B3026276 84 84"
{@ak a: @av 1 @bk b: @bv 2}>
annotation5: <Test #x"85B3026172B4B3015285B3026166B3016684" @ar <R @af f>>
annotation6: <Test #x"B485B3026172B3015285B3026166B3016684" <@ar R @af f>>
annotation5: <Test #x"BF B4 B30152 BF B30166 B3026166 84 84 B3026172 84" @ar <R @af f>>
annotation6: <Test #x"B4 BF B30152 B3026172 84 BF B30166 B3026166 84 84" <@ar R @af f>>
annotation7:
;Stop reading symbols at @ -- this test has three separate annotations
<Test #x"85B3016185B3016285B30163B584" @a@b@c[]>
<Test #x"BF B584 B30161 B30162 B30163 84" @a@b@c[]>
bytes2: <Test #x"B20568656c6c6f" #"hello">
bytes2a: <Test @"Internal whitespace is allowed, including commas!" #x"B2, 05, 68, 65, 6c, 6c, 6f" #"hello">
bytes3: <Test #x"B203414243" #"ABC">
@ -68,108 +69,108 @@
bytes13: <Test #x"B2 11 61 62 63 6c 34 f0 5c 2f 22 08 0c 0a 0d 09 78 79 7a" #"abc\x6c\x34\xf0\\/\"\b\f\n\r\txyz">
dict0: <Test #x"B784" {}>
dict1: <NondeterministicTest #x"b7 b10162 81 b30161 91 b591929384 b20163 b7 b30a66697273742d6e616d65 b109456c697a6162657468 84 b7 b3077375726e616d65 b109426c61636b77656c6c 84 84" { a: 1 "b": #t [1 2 3]: #"c" { first-name: "Elizabeth" }: { surname: "Blackwell" } }>
dict1: <NondeterministicTest #x"b7 b10162 81 b30161 b00101 b5b00101b00102b0010384 b20163 b7 b30a66697273742d6e616d65 b109456c697a6162657468 84 b7 b3077375726e616d65 b109426c61636b77656c6c 84 84" { a: 1 "b": #t [1 2 3]: #"c" { first-name: "Elizabeth" }: { surname: "Blackwell" } }>
dict2: @"Missing close brace" <ParseShort "{ a: b, c: d ">
dict2a: @"Missing close brace" <ParseShort "{">
dict3: @"Duplicate key" <ParseError "{ a: 1, a: 2 }">
dict4: @"Unexpected close brace" <ParseError "}">
dict5: @"Missing value" <DecodeError #x"b7 91 92 93 84">
double0: <Test #x"830000000000000000" 0.0>
double+0: <Test #x"830000000000000000" +0.0>
double-0: <Test #x"838000000000000000" -0.0>
double1: <Test #x"833ff0000000000000" 1.0>
double2: <Test #x"83fe3cb7b759bf0426" -1.202e300>
double3: <Test #x"83123456789abcdef0" #xd"12 34 56 78 9a bc de f0">
dict5: @"Missing value" <DecodeError #x"b7 b00101 b00102 b00103 84">
double0: <Test #x"87080000000000000000" 0.0>
double+0: <Test #x"87080000000000000000" +0.0>
double-0: <Test #x"87088000000000000000" -0.0>
double1: <Test #x"87083ff0000000000000" 1.0>
double2: <Test #x"8708fe3cb7b759bf0426" -1.202e300>
double3: <Test #x"8708123456789abcdef0" #xd"12 34 56 78 9a bc de f0">
double4: @"Fewer than 16 digits" <ParseError "#xd\"12345678\"">
double5: @"More than 16 digits" <ParseError "#xd\"123456789abcdef012\"">
double6: @"Invalid chars" <ParseError "#xd\"12zz56789abcdef0\"">
double7: @"Positive infinity" <Test #x"837ff0000000000000" #xd"7ff0000000000000">
double8: @"Negative infinity" <Test #x"83fff0000000000000" #xd"fff0000000000000">
double9: @"-qNaN" <Test #x"83fff0000000000001" #xd"fff0000000000001">
double10: @"-qNaN" <Test #x"83fff0000000000111" #xd"fff0000000000111">
double11: @"+qNaN" <Test #x"837ff0000000000001" #xd"7ff0000000000001">
double12: @"+qNaN" <Test #x"837ff0000000000111" #xd"7ff0000000000111">
double7: @"Positive infinity" <Test #x"87087ff0000000000000" #xd"7ff0000000000000">
double8: @"Negative infinity" <Test #x"8708fff0000000000000" #xd"fff0000000000000">
double9: @"-qNaN" <Test #x"8708fff0000000000001" #xd"fff0000000000001">
double10: @"-qNaN" <Test #x"8708fff0000000000111" #xd"fff0000000000111">
double11: @"+qNaN" <Test #x"87087ff0000000000001" #xd"7ff0000000000001">
double12: @"+qNaN" <Test #x"87087ff0000000000111" #xd"7ff0000000000111">
double13: @"Bad spacing" <ParseError "#xd\"12345 6789abcdef0\"">
double14: @"-sNaN" <Test #x"83fff8000000000001" #xd"fff8000000000001">
double15: @"-sNaN" <Test #x"83fff8000000000111" #xd"fff8000000000111">
double16: @"+sNaN" <Test #x"837ff8000000000001" #xd"7ff8000000000001">
double17: @"+sNaN" <Test #x"837ff8000000000111" #xd"7ff8000000000111">
float0: <Test #x"8200000000" 0.0f>
float+0: <Test #x"8200000000" +0.0f>
float-0: <Test #x"8280000000" -0.0f>
float1: <Test #x"823f800000" 1.0f>
float2: <Test #x"8212345678" #xf"12 34 56 78">
double14: @"-sNaN" <Test #x"8708fff8000000000001" #xd"fff8000000000001">
double15: @"-sNaN" <Test #x"8708fff8000000000111" #xd"fff8000000000111">
double16: @"+sNaN" <Test #x"87087ff8000000000001" #xd"7ff8000000000001">
double17: @"+sNaN" <Test #x"87087ff8000000000111" #xd"7ff8000000000111">
float0: <Test #x"870400000000" 0.0f>
float+0: <Test #x"870400000000" +0.0f>
float-0: <Test #x"870480000000" -0.0f>
float1: <Test #x"87043f800000" 1.0f>
float2: <Test #x"870412345678" #xf"12 34 56 78">
float3: @"Fewer than 8 digits" <ParseError "#xf\"123456\"">
float4: @"More than 8 digits" <ParseError "#xf\"123456789a\"">
float5: @"Invalid chars" <ParseError "#xf\"12zz5678\"">
float6: @"Positive infinity" <Test #x"827f800000" #xf"7f800000">
float7: @"Negative infinity" <Test #x"82ff800000" #xf"ff800000">
float8: @"+sNaN" <Test #x"827f800001" #xf"7f800001">
float9: @"+sNaN" <Test #x"827f800111" #xf"7f800111">
float10: @"-sNaN" <Test #x"82ff800001" #xf"ff800001">
float11: @"-sNaN" <Test #x"82ff800111" #xf"ff800111">
float6: @"Positive infinity" <Test #x"87047f800000" #xf"7f800000">
float7: @"Negative infinity" <Test #x"8704ff800000" #xf"ff800000">
float8: @"+sNaN" <Test #x"87047f800001" #xf"7f800001">
float9: @"+sNaN" <Test #x"87047f800111" #xf"7f800111">
float10: @"-sNaN" <Test #x"8704ff800001" #xf"ff800001">
float11: @"-sNaN" <Test #x"8704ff800111" #xf"ff800111">
float12: @"Bad spacing" <ParseError "#xf\"12345 678\"">
float13: @"+qNaN" <Test #x"827fc00001" #xf"7fc00001">
float14: @"+qNaN" <Test #x"827fc00111" #xf"7fc00111">
float15: @"-qNaN" <Test #x"82ffc00001" #xf"ffc00001">
float16: @"-qNaN" <Test #x"82ffc00111" #xf"ffc00111">
int-257: <Test #x"a1feff" -257>
int-256: <Test #x"a1ff00" -256>
int-255: <Test #x"a1ff01" -255>
int-254: <Test #x"a1ff02" -254>
int-129: <Test #x"a1ff7f" -129>
int-128: <Test #x"a080" -128>
int-127: <Test #x"a081" -127>
int-4: <Test #x"a0fc" -4>
int-3: <Test #x"9d" -3>
int-2: <Test #x"9e" -2>
int-1: <Test #x"9f" -1>
int0: <Test #x"90" 0>
int+0: <Test #x"90" +0>
int-0: <Test #x"90" -0>
int1: <Test #x"91" 1>
int12: <Test #x"9c" 12>
int13: <Test #x"a00d" 13>
int127: <Test #x"a07f" 127>
int+127: <Test #x"a07f" +127>
int128: <Test #x"a10080" 128>
int255: <Test #x"a100ff" 255>
int256: <Test #x"a10100" 256>
int32767: <Test #x"a17fff" 32767>
int32768: <Test #x"a2008000" 32768>
int65535: <Test #x"a200ffff" 65535>
int65536: <Test #x"a2010000" 65536>
int131072: <Test #x"a2020000" 131072>
int2500000000: <Test #x"a4009502f900" 2500000000>
float13: @"+qNaN" <Test #x"87047fc00001" #xf"7fc00001">
float14: @"+qNaN" <Test #x"87047fc00111" #xf"7fc00111">
float15: @"-qNaN" <Test #x"8704ffc00001" #xf"ffc00001">
float16: @"-qNaN" <Test #x"8704ffc00111" #xf"ffc00111">
int-257: <Test #x"b002feff" -257>
int-256: <Test #x"b002ff00" -256>
int-255: <Test #x"b002ff01" -255>
int-254: <Test #x"b002ff02" -254>
int-129: <Test #x"b002ff7f" -129>
int-128: <Test #x"b00180" -128>
int-127: <Test #x"b00181" -127>
int-4: <Test #x"b001fc" -4>
int-3: <Test #x"b001fd" -3>
int-2: <Test #x"b001fe" -2>
int-1: <Test #x"b001ff" -1>
int0: <Test #x"b000" 0>
int+0: <Test #x"b000" +0>
int-0: <Test #x"b000" -0>
int1: <Test #x"b00101" 1>
int12: <Test #x"b0010c" 12>
int13: <Test #x"b0010d" 13>
int127: <Test #x"b0017f" 127>
int+127: <Test #x"b0017f" +127>
int128: <Test #x"b0020080" 128>
int255: <Test #x"b00200ff" 255>
int256: <Test #x"b0020100" 256>
int32767: <Test #x"b0027fff" 32767>
int32768: <Test #x"b003008000" 32768>
int65535: <Test #x"b00300ffff" 65535>
int65536: <Test #x"b003010000" 65536>
int131072: <Test #x"b003020000" 131072>
int2500000000: <Test #x"b005009502f900" 2500000000>
int87112285931760246646623899502532662132736: <Test #x"b012010000000000000000000000000000000000" 87112285931760246646623899502532662132736>
list0: <Test #x"b584" []>
list4: <Test #x"b59192939484" [1 2 3 4]>
list4a: <Test #x"b59192939484" [1, 2, 3, 4]>
list5: <Test #x"b59e9f909184" [-2 -1 0 1]>
list4: <Test #x"b5b00101b00102b00103b0010484" [1 2 3 4]>
list4a: <Test #x"b5b00101b00102b00103b0010484" [1, 2, 3, 4]>
list5: <Test #x"b5b001feb001ffb000b0010184" [-2 -1 0 1]>
list6: <Test #x"b5 b10568656c6c6f b3057468657265 b205776f726c64 b584 b684 81 80 84" ["hello" there #"world" [] #{} #t #f]>
list7: <Test #x"b5 b303616263 b3032e2e2e b303646566 84" [abc ... def]>
list8: @"Missing close bracket" <ParseShort "[">
list9: @"Unexpected close bracket" <ParseError "]">
list10: @"Missing end byte" <DecodeShort #x"b58080">
list11: <Test #x"b59184" [01]>
list12: <Test #x"b59c84" [12]>
list11: <Test #x"b5b0010184" [01]>
list12: <Test #x"b5b0010c84" [12]>
noinput0: @"No input at all" <DecodeEOF #x"">
embed0: <Test #x"8690" #!0>
embed1: <Test #x"868690" #!#!0>
embed2: <Test #x"b5869086b10568656c6c6f84" [#!0 #!"hello"]>
embed0: <Test #x"86b000" #!0>
embed1: <Test #x"8686b000" #!#!0>
embed2: <Test #x"b586b00086b10568656c6c6f84" [#!0 #!"hello"]>
record1: <Test #x"b4 b30763617074757265 b4 b30764697363617264 84 84" <capture <discard>>>
record2: <Test #x"b4 b3076f627365727665 b4 b305737065616b b4 b30764697363617264 84 b4 b30763617074757265 b4 b30764697363617264 84 84 84 84" <observe <speak <discard>, <capture <discard>>>>>
record3: <Test #x"b4 b5 b3067469746c6564 b306706572736f6e 92 b3057468696e67 91 84 a065 b109426c61636b77656c6c b4 b30464617465 a1071d 92 93 84 b1024472 84" <[titled person 2 thing 1] 101 "Blackwell" <date 1821 2 3> "Dr">>
record3: <Test #x"b4 b5 b3067469746c6564 b306706572736f6e b00102 b3057468696e67 b00101 84 b00165 b109426c61636b77656c6c b4 b30464617465 b002071d b00102 b00103 84 b1024472 84" <[titled person 2 thing 1] 101 "Blackwell" <date 1821 2 3> "Dr">>
record4: <Test #x"b4 b30764697363617264 84" <discard>>
record5: <Test #x"b497b58484" <7[]>>
record5: <Test #x"b4b00107b58484" <7[]>>
record6: <Test #x"b4b30764697363617264b308737572707269736584" <discard surprise>>
record7: <Test #x"b4b10761537472696e67939484" <"aString" 3 4>>
record8: <Test #x"b4b4b3076469736361726484939484" <<discard> 3 4>>
record7: <Test #x"b4b10761537472696e67b00103b0010484" <"aString" 3 4>>
record8: <Test #x"b4b4b3076469736361726484b00103b0010484" <<discard> 3 4>>
record9: @"Missing record label" <ParseError "<>">
record10: @"Missing close-angle-bracket" <ParseShort "<">
record11: @"Unexpected close-angle-bracket" <ParseError ">">
set0: <Test #x"b684" #{}>
set1: <NondeterministicTest #x"b691929384" #{1 2 3}>
set1: <NondeterministicTest #x"b6b00101b00102b0010384" #{1 2 3}>
set2: @"Missing close brace" <ParseShort "#{ 1 2 3 ">
set2a: @"Missing close brace" <ParseShort "#{">
set3: @"Duplicate value" <ParseError "#{a a}">
@ -277,17 +278,17 @@
B7
B1 03 494473
B5
A0 74
A1 03 AF
A1 00 EA
A2 00 97 89
B0 01 74
B0 02 03 AF
B0 02 00 EA
B0 03 00 97 89
84
B1 05 5469746c65
B1 14 566965772066726f6d203135746820466c6f6f72
B1 05 5769647468
A1 03 20
B0 02 03 20
B1 06 486569676874
A1 02 58
B0 02 02 58
B1 08 416e696d61746564
B3 05 66616c7365
B1 09 5468756d626e61696c
@ -295,9 +296,9 @@
B1 03 55726c
B1 26 687474703a2f2f7777772e6578616d706c652e636f6d2f696d6167652f343831393839393433
B1 05 5769647468
A0 64
B0 01 64
B1 06 486569676874
A0 7D
B0 01 7D
84
84
84"
@ -324,8 +325,8 @@
b1 05 5374617465 b1 02 4341
b1 07 41646472657373 b1 00
b1 07 436f756e747279 b1 02 5553
b1 08 4c61746974756465 83 4042e226809d4952
b1 09 4c6f6e676974756465 83 c05e99566cf41f21
b1 08 4c61746974756465 8708 4042e226809d4952
b1 09 4c6f6e676974756465 8708 c05e99566cf41f21
b1 09 707265636973696f6e b1 03 7a6970
84
b7
@ -334,8 +335,8 @@
b1 05 5374617465 b1 02 4341
b1 07 41646472657373 b1 00
b1 07 436f756e747279 b1 02 5553
b1 08 4c61746974756465 83 4042af9d66adb403
b1 09 4c6f6e676974756465 83 c05e81aa4fca42af
b1 08 4c61746974756465 8708 4042af9d66adb403
b1 09 4c6f6e676974756465 8708 c05e81aa4fca42af
b1 09 707265636973696f6e b1 03 7a6970
84
84"

View File

@ -88,30 +88,22 @@
[#t (output-byte #x81)]
[(float _)
(output-byte #x82)
(output-byte #x87)
(output-byte 4)
(output-bytes (float->bytes v))]
[(? flonum?)
(output-byte #x83)
(output-byte #x87)
(output-byte 8)
(output-bytes (double->bytes v))]
[(annotated as _ v)
(when write-annotations?
(for [(a (in-list as))]
(output-byte #x85)
(output a)))
(output v)]
[(? integer?)
(cond [(<= -3 v -1) (output-byte (+ v #xA0))]
[(<= 0 v 12) (output-byte (+ v #x90))]
[else (define raw-bit-count (+ (integer-length v) 1)) ;; at least one sign bit
(define byte-count (quotient (+ raw-bit-count 7) 8))
(if (<= byte-count 16)
(output-byte (+ byte-count #xA0 -1))
(begin (output-byte #xB0)
(output-varint byte-count)))
(for [(shift (in-range (* byte-count 8) 0 -8))]
(output-byte (bitwise-bit-field v (- shift 8) shift)))])]
(output-byte #xB0)
(define byte-count (cond [(zero? v) 0]
[else (define raw-bit-count (+ (integer-length v) 1))
(quotient (+ raw-bit-count 7) 8)]))
(output-varint byte-count)
(for [(shift (in-range (* byte-count 8) 0 -8))]
(output-byte (bitwise-bit-field v (- shift 8) shift)))]
[(? string?) (count-bytes 1 (string->bytes/utf-8 v))]
[(? bytes?) (count-bytes 2 v)]
@ -122,6 +114,11 @@
[(? set?) (with-seq 6 (output-set v))]
[(? dict?) (with-seq 7 (output-dict v))]
[(annotated as _ v)
(if (and write-annotations? (pair? as))
(with-seq 15 (output v) (output-all as))
(output v))]
[(embedded value)
(output-byte #x86)
(output (encode-embedded value))]

View File

@ -1,4 +1,4 @@
´³schema·³version³ definitions·³Axis´³orµµ±values´³rec´³lit³values„´³tupleµ„„„„µ± descendants´³rec´³lit³ descendants„´³tupleµ„„„„µ±at´³rec´³lit³at„´³tupleµ´³named³key³any„„„„„µ±label´³rec´³lit³label„´³tupleµ„„„„µ±keys´³rec´³lit³keys„´³tupleµ„„„„µ±length´³rec´³lit³length„´³tupleµ„„„„µ± annotations´³rec´³lit³ annotations„´³tupleµ„„„„µ±embedded´³rec´³lit³embedded„´³tupleµ„„„„µ±parse´³rec´³lit³parse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„µ±unparse´³rec´³lit³unparse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„„„³Step´³orµµ±Axis´³refµ„³Axis„„µ±Filter´³refµ„³Filter„„µ±Function´³refµ„³Function„„„„³Filter´³orµµ±nop´³rec´³lit³nop„´³tupleµ„„„„µ±compare´³rec´³lit³compare„´³tupleµ´³named³op´³refµ„³
´³schema·³version°³ definitions·³Axis´³orµµ±values´³rec´³lit³values„´³tupleµ„„„„µ± descendants´³rec´³lit³ descendants„´³tupleµ„„„„µ±at´³rec´³lit³at„´³tupleµ´³named³key³any„„„„„µ±label´³rec´³lit³label„´³tupleµ„„„„µ±keys´³rec´³lit³keys„´³tupleµ„„„„µ±length´³rec´³lit³length„´³tupleµ„„„„µ± annotations´³rec´³lit³ annotations„´³tupleµ„„„„µ±embedded´³rec´³lit³embedded„´³tupleµ„„„„µ±parse´³rec´³lit³parse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„µ±unparse´³rec´³lit³unparse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„„„³Step´³orµµ±Axis´³refµ„³Axis„„µ±Filter´³refµ„³Filter„„µ±Function´³refµ„³Function„„„„³Filter´³orµµ±nop´³rec´³lit³nop„´³tupleµ„„„„µ±compare´³rec´³lit³compare„´³tupleµ´³named³op´³refµ„³
Comparison„„´³named³literal³any„„„„„µ±regex´³rec´³lit³regex„´³tupleµ´³named³regex´³atom³String„„„„„„µ±test´³rec´³lit³test„´³tupleµ´³named³pred´³refµ„³ Predicate„„„„„„µ±real´³rec´³lit³real„´³tupleµ„„„„µ±int´³rec´³lit³int„´³tupleµ„„„„µ±kind´³rec´³lit³kind„´³tupleµ´³named³kind´³refµ„³ ValueKind„„„„„„„„³Function´³rec´³lit³count„´³tupleµ´³named³selector´³refµ„³Selector„„„„„³Selector´³seqof´³refµ„³Step„„³ Predicate´³orµµ±Selector´³refµ„³Selector„„µ±not´³rec´³lit³not„´³tupleµ´³named³pred´³refµ„³ Predicate„„„„„„µ±or´³rec´³lit³or„´³tupleµ´³named³preds´³seqof´³refµ„³ Predicate„„„„„„„µ±and´³rec´³lit³and„´³tupleµ´³named³preds´³seqof´³refµ„³ Predicate„„„„„„„„„³ ValueKind´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ± SignedInteger´³lit³ SignedInteger„„µ±String´³lit³String„„µ±
ByteString´³lit³
ByteString„„µ±Symbol´³lit³Symbol„„µ±Record´³lit³Record„„µ±Sequence´³lit³Sequence„„µ±Set´³lit³Set„„µ±

View File

@ -6,8 +6,6 @@ pub struct Type {
#[derive(Clone, Debug)]
pub enum Item {
Annotation,
AnnotatedValue,
DictionaryKey,
DictionaryValue,
RecordField,

View File

@ -5,13 +5,9 @@ use std::io;
pub enum Tag {
False,
True,
Float,
Double,
End,
Annotation,
Embedded,
SmallInteger(i8),
MediumInteger(u8),
Ieee754,
SignedInteger,
String,
ByteString,
@ -20,6 +16,7 @@ pub enum Tag {
Sequence,
Set,
Dictionary,
Annotated,
}
#[derive(Debug, PartialEq, Eq)]
@ -46,14 +43,9 @@ impl TryFrom<u8> for Tag {
match v {
0x80 => Ok(Self::False),
0x81 => Ok(Self::True),
0x82 => Ok(Self::Float),
0x83 => Ok(Self::Double),
0x84 => Ok(Self::End),
0x85 => Ok(Self::Annotation),
0x86 => Ok(Self::Embedded),
0x90..=0x9c => Ok(Self::SmallInteger((v - 0x90) as i8)),
0x9d..=0x9f => Ok(Self::SmallInteger((v - 0x90) as i8 - 16)),
0xa0..=0xaf => Ok(Self::MediumInteger(v - 0xa0 + 1)),
0x87 => Ok(Self::Ieee754),
0xb0 => Ok(Self::SignedInteger),
0xb1 => Ok(Self::String),
0xb2 => Ok(Self::ByteString),
@ -62,6 +54,7 @@ impl TryFrom<u8> for Tag {
0xb5 => Ok(Self::Sequence),
0xb6 => Ok(Self::Set),
0xb7 => Ok(Self::Dictionary),
0xbf => Ok(Self::Annotated),
_ => Err(InvalidTag(v)),
}
}
@ -72,19 +65,9 @@ impl From<Tag> for u8 {
match v {
Tag::False => 0x80,
Tag::True => 0x81,
Tag::Float => 0x82,
Tag::Double => 0x83,
Tag::End => 0x84,
Tag::Annotation => 0x85,
Tag::Embedded => 0x86,
Tag::SmallInteger(v) => {
if v < 0 {
(v + 16) as u8 + 0x90
} else {
v as u8 + 0x90
}
}
Tag::MediumInteger(count) => count - 1 + 0xa0,
Tag::Ieee754 => 0x87,
Tag::SignedInteger => 0xb0,
Tag::String => 0xb1,
Tag::ByteString => 0xb2,
@ -93,6 +76,7 @@ impl From<Tag> for u8 {
Tag::Sequence => 0xb5,
Tag::Set => 0xb6,
Tag::Dictionary => 0xb7,
Tag::Annotated => 0xbf,
}
}
}

View File

@ -115,37 +115,56 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
}
#[inline(always)]
fn peek_next_nonannotation_tag(&mut self) -> ReaderResult<Tag> {
loop {
match Tag::try_from(self.peek()?)? {
Tag::Annotation => {
self.skip()?;
self.skip_value()?;
fn try_next_nonannotation<T, F>(&mut self, f: F) -> ReaderResult<T>
where
F: FnOnce(&mut Self, Tag) -> ReaderResult<T>,
{
let m = self.source.mark()?;
match Tag::try_from(self.peek()?)? {
Tag::Annotated => {
self.skip()?;
match f(self, Tag::try_from(self.peek()?)?) {
Ok(v) => {
self.skip_annotations()?;
Ok(v)
}
Err(e) => {
self.source.restore(&m)?;
Err(e)
}
}
}
other => match f(self, other) {
Ok(v) => Ok(v),
Err(e) => {
self.source.restore(&m)?;
Err(e)
}
other => return Ok(other),
}
}
}
fn next_atomic(&mut self, expected_tag: Tag, k: ExpectedKind) -> ReaderResult<Cow<'de, [u8]>> {
let actual_tag = self.peek_next_nonannotation_tag()?;
if actual_tag == expected_tag {
self.skip()?;
let count = self.varint()?;
Ok(self.readbytes(count)?)
} else {
Err(self.expected(k))
}
self.try_next_nonannotation(|_, actual_tag| {
if actual_tag == expected_tag {
self.skip()?;
let count = self.varint()?;
Ok(self.readbytes(count)?)
} else {
Err(self.expected(k))
}
})
}
fn next_compound(&mut self, expected_tag: Tag, k: ExpectedKind) -> ReaderResult<()> {
let actual_tag = self.peek_next_nonannotation_tag()?;
if actual_tag == expected_tag {
self.skip()?;
Ok(())
} else {
Err(self.expected(k))
}
self.try_next_nonannotation(|_, actual_tag| {
if actual_tag == expected_tag {
self.skip()?;
Ok(())
} else {
Err(self.expected(k))
}
})
}
#[inline(always)]
@ -203,31 +222,18 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
where
F: FnOnce(u128) -> Option<T>,
{
let tag = self.peek_next_nonannotation_tag()?;
match tag {
Tag::SmallInteger(v) => {
self.skip()?;
if v < 0 {
Err(out_of_range(v))
} else {
f(v as u128).ok_or_else(|| out_of_range(v))
self.try_next_nonannotation(|_, tag| {
match tag {
Tag::SignedInteger => {
self.skip()?;
let count = self.varint()?;
let n = &self.read_signed_integer(count)?;
let i = n.try_into().map_err(|_| out_of_range(n))?;
f(i).ok_or_else(|| out_of_range(i))
}
_ => Err(self.expected(ExpectedKind::SignedInteger)),
}
Tag::MediumInteger(count) => {
self.skip()?;
let n = &self.read_signed_integer(count.into())?;
let i = n.try_into().map_err(|_| out_of_range(n))?;
f(i).ok_or_else(|| out_of_range(i))
}
Tag::SignedInteger => {
self.skip()?;
let count = self.varint()?;
let n = &self.read_signed_integer(count)?;
let i = n.try_into().map_err(|_| out_of_range(n))?;
f(i).ok_or_else(|| out_of_range(i))
}
_ => Err(self.expected(ExpectedKind::SignedInteger)),
}
})
}
#[inline(always)]
@ -235,43 +241,23 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
where
F: FnOnce(i128) -> Option<T>,
{
let tag = self.peek_next_nonannotation_tag()?;
match tag {
Tag::SmallInteger(v) => {
self.skip()?;
f(v.into()).ok_or_else(|| out_of_range(v))
self.try_next_nonannotation(|_, tag| {
match tag {
Tag::SignedInteger => {
self.skip()?;
let count = self.varint()?;
let n = &self.read_signed_integer(count)?;
let i = n.try_into().map_err(|_| out_of_range(n))?;
f(i).ok_or_else(|| out_of_range(i))
}
_ => Err(self.expected(ExpectedKind::SignedInteger)),
}
Tag::MediumInteger(count) => {
self.skip()?;
let n = &self.read_signed_integer(count.into())?;
let i = n.try_into().map_err(|_| out_of_range(n))?;
f(i).ok_or_else(|| out_of_range(i))
}
Tag::SignedInteger => {
self.skip()?;
let count = self.varint()?;
let n = &self.read_signed_integer(count)?;
let i = n.try_into().map_err(|_| out_of_range(n))?;
f(i).ok_or_else(|| out_of_range(i))
}
_ => Err(self.expected(ExpectedKind::SignedInteger)),
}
}
fn gather_annotations(&mut self) -> io::Result<Vec<N>> {
let mut annotations = vec![self.demand_next(true)?];
while Tag::try_from(self.peek()?)? == Tag::Annotation {
self.skip()?;
annotations.push(self.demand_next(true)?);
}
Ok(annotations)
})
}
fn skip_annotations(&mut self) -> io::Result<()> {
self.skip_value()?;
while Tag::try_from(self.peek()?)? == Tag::Annotation {
self.skip()?;
self.skip_value()?;
while !self.peekend()? {
self.skip_value()?
}
Ok(())
}
@ -296,39 +282,22 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
Ok(Some(match Tag::try_from(self.read()?)? {
Tag::False => N::new(false),
Tag::True => N::new(true),
Tag::Float => {
let mut bs = [0; 4];
self.readbytes_into(&mut bs)?;
Value::from(f32::from_bits(u32::from_be_bytes(bs))).wrap()
}
Tag::Double => {
let mut bs = [0; 8];
self.readbytes_into(&mut bs)?;
Value::from(f64::from_bits(u64::from_be_bytes(bs))).wrap()
}
Tag::Annotation => {
if read_annotations {
let mut annotations = self.gather_annotations()?;
let (existing_annotations, v) = self.demand_next(read_annotations)?.pieces();
annotations.extend_from_slice(existing_annotations.slice());
N::wrap(Annotations::new(Some(annotations)), v)
} else {
self.skip_annotations()?;
self.demand_next(read_annotations)?
}
}
Tag::Embedded => Value::Embedded(
self.decode_embedded
.decode_embedded(self.source, read_annotations)?,
)
.wrap(),
Tag::SmallInteger(v) => {
// TODO: prebuild these in value.rs
Value::from(v).wrap()
}
Tag::MediumInteger(count) => {
let n = self.read_signed_integer(count.into())?;
Value::SignedInteger(n).wrap()
).wrap(),
Tag::Ieee754 => match self.varint()? {
4 => {
let mut bs = [0; 4];
self.readbytes_into(&mut bs)?;
Value::from(f32::from_bits(u32::from_be_bytes(bs))).wrap()
}
8 => {
let mut bs = [0; 8];
self.readbytes_into(&mut bs)?;
Value::from(f64::from_bits(u64::from_be_bytes(bs))).wrap()
}
_ => return Err(io_syntax_error("Invalid IEEE754 size")),
}
Tag::SignedInteger => {
let count = self.varint()?;
@ -383,6 +352,28 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
}
Value::Dictionary(d).wrap()
}
Tag::Annotated => {
match self.next_upto_end(read_annotations)? {
None => return Err(io_syntax_error("Missing underlying annotated value")),
Some(underlying) => {
if read_annotations {
let mut annotations = Vec::new();
while let Some(v) = self.next_upto_end(read_annotations)? {
annotations.push(v);
}
if annotations.is_empty() {
return Err(io_syntax_error("Too few annotations in annotated value"));
}
let (existing_annotations, v) = underlying.pieces();
annotations.extend_from_slice(existing_annotations.slice());
N::wrap(Annotations::new(Some(annotations)), v)
} else {
self.skip_annotations()?;
underlying
}
}
}
}
tag @ Tag::End => {
return Err(io_syntax_error(&format!("Invalid tag: {:?}", tag)));
}
@ -399,17 +390,19 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
#[inline(always)]
fn open_sequence_or_set(&mut self) -> ReaderResult<B::Item> {
match self.peek_next_nonannotation_tag()? {
Tag::Sequence => {
self.skip()?;
Ok(B::Item::SequenceValue)
self.try_next_nonannotation(|_, tag| {
match tag {
Tag::Sequence => {
self.skip()?;
Ok(B::Item::SequenceValue)
}
Tag::Set => {
self.skip()?;
Ok(B::Item::SetValue)
}
_ => Err(self.expected(ExpectedKind::SequenceOrSet)),
}
Tag::Set => {
self.skip()?;
Ok(B::Item::SetValue)
}
_ => Err(self.expected(ExpectedKind::SequenceOrSet)),
}
})
}
#[inline(always)]
@ -427,6 +420,14 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
self.next_compound(Tag::Dictionary, ExpectedKind::Dictionary)
}
#[inline(always)]
fn open_annotations(&mut self, annotations: Option<&mut Vec<N>>) -> ReaderResult<()> {
}
#[inline(always)]
fn close_annotations(&mut self, annotations: Option<&mut Vec<N>>) -> ReaderResult<()> {
}
#[inline(always)]
fn boundary(&mut self, _b: &B::Type) -> ReaderResult<()> {
Ok(())
@ -460,101 +461,76 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
}
fn next_token(&mut self, read_embedded_annotations: bool) -> io::Result<Token<N>> {
loop {
return Ok(match Tag::try_from(self.peek()?)? {
Tag::Embedded => {
self.skip()?;
Token::Embedded(
self.decode_embedded
.decode_embedded(self.source, read_embedded_annotations)?,
)
}
Tag::False
Ok(match Tag::try_from(self.peek()?)? {
Tag::Embedded => {
self.skip()?;
Token::Embedded(
self.decode_embedded
.decode_embedded(self.source, read_embedded_annotations)?,
)
}
Tag::False
| Tag::True
| Tag::Float
| Tag::Double
| Tag::SmallInteger(_)
| Tag::MediumInteger(_)
| Tag::Ieee754
| Tag::SignedInteger
| Tag::String
| Tag::ByteString
| Tag::Symbol => Token::Atom(self.demand_next(false)?),
Tag::Record => {
self.skip()?;
Token::Compound(CompoundClass::Record)
}
Tag::Sequence => {
self.skip()?;
Token::Compound(CompoundClass::Sequence)
}
Tag::Set => {
self.skip()?;
Token::Compound(CompoundClass::Set)
}
Tag::Dictionary => {
self.skip()?;
Token::Compound(CompoundClass::Dictionary)
}
Tag::End => {
self.skip()?;
Token::End
}
Tag::Annotation => {
self.skip()?;
self.skip_annotations()?;
continue;
}
});
}
}
fn next_annotations_and_token(&mut self) -> io::Result<(Vec<N>, Token<N>)> {
match Tag::try_from(self.peek()?)? {
Tag::Annotation => {
Tag::Record => {
self.skip()?;
let annotations = self.gather_annotations()?;
Ok((annotations, self.next_token(true)?))
Token::Compound(CompoundClass::Record)
}
_ => Ok((Vec::new(), self.next_token(true)?)),
}
Tag::Sequence => {
self.skip()?;
Token::Compound(CompoundClass::Sequence)
}
Tag::Set => {
self.skip()?;
Token::Compound(CompoundClass::Set)
}
Tag::Dictionary => {
self.skip()?;
Token::Compound(CompoundClass::Dictionary)
}
Tag::End => {
self.skip()?;
Token::End
}
Tag::Annotated => Token::AnnotationStart,
})
}
#[inline(always)]
fn next_boolean(&mut self) -> ReaderResult<bool> {
match self.peek_next_nonannotation_tag()? {
Tag::False => {
self.skip()?;
Ok(false)
self.try_next_nonannotation(|_, tag| {
match tag {
Tag::False => {
self.skip()?;
Ok(false)
}
Tag::True => {
self.skip()?;
Ok(true)
}
_ => Err(self.expected(ExpectedKind::Boolean)),
}
Tag::True => {
self.skip()?;
Ok(true)
}
_ => Err(self.expected(ExpectedKind::Boolean)),
}
})
}
fn next_signedinteger(&mut self) -> ReaderResult<SignedInteger> {
let tag = self.peek_next_nonannotation_tag()?;
match tag {
Tag::SmallInteger(v) => {
self.skip()?;
Ok(SignedInteger::from(v as i32))
self.try_next_nonannotation(|_, tag| {
match tag {
Tag::SignedInteger => {
self.skip()?;
let count = self.varint()?;
Ok(self.read_signed_integer(count)?)
}
_ => Err(self.expected(ExpectedKind::SignedInteger)),
}
Tag::MediumInteger(count) => {
self.skip()?;
Ok(self.read_signed_integer(count.into())?)
}
Tag::SignedInteger => {
self.skip()?;
let count = self.varint()?;
Ok(self.read_signed_integer(count)?)
}
_ => Err(self.expected(ExpectedKind::SignedInteger)),
}
})
}
fn next_i8(&mut self) -> ReaderResult<i8> {
@ -590,39 +566,50 @@ impl<'de, 'src, N: NestedValue, Dec: DomainDecode<N::Embedded>, S: BinarySource<
}
fn next_f32(&mut self) -> ReaderResult<f32> {
match self.peek_next_nonannotation_tag()? {
Tag::Float => {
self.skip()?;
let mut bs = [0; 4];
self.readbytes_into(&mut bs)?;
Ok(f32::from_bits(u32::from_be_bytes(bs)))
self.try_next_nonannotation(|_, tag| {
if tag == Tag::Ieee754 {
match self.varint()? {
4 => {
let mut bs = [0; 4];
self.readbytes_into(&mut bs)?;
Ok(f32::from_bits(u32::from_be_bytes(bs)))
}
8 => {
self.skip()?;
let mut bs = [0; 8];
self.readbytes_into(&mut bs)?;
Ok(f64::from_bits(u64::from_be_bytes(bs)) as f32)
}
_ => Err(io_syntax_error("Invalid IEEE754 size"))?,
}
} else {
Err(self.expected(ExpectedKind::Float))
}
Tag::Double => {
self.skip()?;
let mut bs = [0; 8];
self.readbytes_into(&mut bs)?;
Ok(f64::from_bits(u64::from_be_bytes(bs)) as f32)
}
_ => Err(self.expected(ExpectedKind::Float)),
}
})
}
fn next_f64(&mut self) -> ReaderResult<f64> {
match self.peek_next_nonannotation_tag()? {
Tag::Float => {
self.skip()?;
let mut bs = [0; 4];
self.readbytes_into(&mut bs)?;
Ok(f32::from_bits(u32::from_be_bytes(bs)) as f64)
self.try_next_nonannotation(|_, tag| {
if tag == Tag::Ieee754 {
match self.varint()? {
4 => {
self.skip()?;
let mut bs = [0; 4];
self.readbytes_into(&mut bs)?;
Ok(f32::from_bits(u32::from_be_bytes(bs)) as f64)
}
8 => {
self.skip()?;
let mut bs = [0; 8];
self.readbytes_into(&mut bs)?;
Ok(f64::from_bits(u64::from_be_bytes(bs)))
}
_ => Err(io_syntax_error("Invalid IEEE754 size"))?,
}
} else {
Err(self.expected(ExpectedKind::Double))
}
Tag::Double => {
self.skip()?;
let mut bs = [0; 8];
self.readbytes_into(&mut bs)?;
Ok(f64::from_bits(u64::from_be_bytes(bs)))
}
_ => Err(self.expected(ExpectedKind::Double)),
}
})
}
fn next_str(&mut self) -> ReaderResult<Cow<'de, str>> {

View File

@ -49,13 +49,8 @@ impl<W: io::Write> PackedWriter<W> {
}
#[inline(always)]
pub fn write_medium_integer(&mut self, bs: &[u8]) -> io::Result<()> {
let count: u8 = bs.len().try_into().unwrap();
if !(1..=16).contains(&count) {
panic!("Invalid medium_integer count: {}", count)
}
self.write_byte(Tag::MediumInteger(count).into())?;
self.w().write_all(bs)
pub fn write_integer(&mut self, bs: &[u8]) -> io::Result<()> {
self.write_atom(Tag::SignedInteger, bs)
}
#[inline(always)]
@ -151,9 +146,6 @@ impl WriteWriter for BinaryOrderWriter {
impl<W: io::Write> CompoundWriter for PackedWriter<W> {
#[inline(always)]
fn boundary(&mut self, b: &B::Type) -> io::Result<()> {
if let Some(B::Item::Annotation) = b.opening {
self.write_tag(Tag::Annotation)?;
}
Ok(())
}
}
@ -310,22 +302,21 @@ impl<W: io::Write> Writer for PackedWriter<W> {
#[inline(always)]
fn write_f32(&mut self, v: f32) -> io::Result<()> {
self.write_tag(Tag::Float)?;
self.write_tag(Tag::Ieee754)?;
self.write_byte(4)?;
self.write_raw_bytes(&u32::to_be_bytes(f32::to_bits(v)))
}
#[inline(always)]
fn write_f64(&mut self, v: f64) -> io::Result<()> {
self.write_tag(Tag::Double)?;
self.write_tag(Tag::Ieee754)?;
self.write_byte(8)?;
self.write_raw_bytes(&u64::to_be_bytes(f64::to_bits(v)))
}
#[inline(always)]
fn write_i8(&mut self, v: i8) -> io::Result<()> {
if v >= -3 && v <= 12 {
return self.write_tag(Tag::SmallInteger(v));
}
self.write_medium_integer(&[v as u8])
self.write_integer(&[v as u8])
}
#[inline(always)]
@ -333,7 +324,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
if let Ok(w) = v.try_into() {
return self.write_i8(w);
}
self.write_medium_integer(&[0, v])
self.write_integer(&[0, v])
}
#[inline(always)]
@ -341,7 +332,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
if let Ok(w) = v.try_into() {
return self.write_i8(w);
}
self.write_medium_integer(&[(v >> 8) as u8, (v & 255) as u8])
self.write_integer(&[(v >> 8) as u8, (v & 255) as u8])
}
#[inline(always)]
@ -349,7 +340,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
if let Ok(w) = v.try_into() {
return self.write_i16(w);
}
self.write_medium_integer(&[0, (v >> 8) as u8, (v & 255) as u8])
self.write_integer(&[0, (v >> 8) as u8, (v & 255) as u8])
}
#[inline(always)]
@ -358,9 +349,9 @@ impl<W: io::Write> Writer for PackedWriter<W> {
return self.write_i16(w);
}
if fits_in_bytes!(v, 3) {
return self.write_medium_integer(&[(v >> 16) as u8, (v >> 8) as u8, (v & 255) as u8]);
return self.write_integer(&[(v >> 16) as u8, (v >> 8) as u8, (v & 255) as u8]);
}
self.write_medium_integer(&[
self.write_integer(&[
(v >> 24) as u8,
(v >> 16) as u8,
(v >> 8) as u8,
@ -373,7 +364,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
if let Ok(w) = v.try_into() {
return self.write_i32(w);
}
self.write_medium_integer(&[
self.write_integer(&[
0,
(v >> 24) as u8,
(v >> 16) as u8,
@ -388,7 +379,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
return self.write_i32(w);
}
if fits_in_bytes!(v, 5) {
return self.write_medium_integer(&[
return self.write_integer(&[
(v >> 32) as u8,
(v >> 24) as u8,
(v >> 16) as u8,
@ -397,7 +388,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
]);
}
if fits_in_bytes!(v, 6) {
return self.write_medium_integer(&[
return self.write_integer(&[
(v >> 40) as u8,
(v >> 32) as u8,
(v >> 24) as u8,
@ -407,7 +398,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
]);
}
if fits_in_bytes!(v, 7) {
return self.write_medium_integer(&[
return self.write_integer(&[
(v >> 48) as u8,
(v >> 40) as u8,
(v >> 32) as u8,
@ -417,7 +408,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
(v & 255) as u8,
]);
}
self.write_medium_integer(&[
self.write_integer(&[
(v >> 56) as u8,
(v >> 48) as u8,
(v >> 40) as u8,
@ -434,7 +425,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
if let Ok(w) = v.try_into() {
return self.write_i64(w);
}
self.write_medium_integer(&[
self.write_integer(&[
0,
(v >> 56) as u8,
(v >> 48) as u8,
@ -454,27 +445,27 @@ impl<W: io::Write> Writer for PackedWriter<W> {
}
let bs: [u8; 16] = v.to_be_bytes();
if fits_in_bytes!(v, 9) {
return self.write_medium_integer(&bs[7..]);
return self.write_integer(&bs[7..]);
}
if fits_in_bytes!(v, 10) {
return self.write_medium_integer(&bs[6..]);
return self.write_integer(&bs[6..]);
}
if fits_in_bytes!(v, 11) {
return self.write_medium_integer(&bs[5..]);
return self.write_integer(&bs[5..]);
}
if fits_in_bytes!(v, 12) {
return self.write_medium_integer(&bs[4..]);
return self.write_integer(&bs[4..]);
}
if fits_in_bytes!(v, 13) {
return self.write_medium_integer(&bs[3..]);
return self.write_integer(&bs[3..]);
}
if fits_in_bytes!(v, 14) {
return self.write_medium_integer(&bs[2..]);
return self.write_integer(&bs[2..]);
}
if fits_in_bytes!(v, 15) {
return self.write_medium_integer(&bs[1..]);
return self.write_integer(&bs[1..]);
}
self.write_medium_integer(&bs)
self.write_integer(&bs)
}
#[inline(always)]
@ -495,7 +486,7 @@ impl<W: io::Write> Writer for PackedWriter<W> {
Some(n) => self.write_i8(n),
None => match v.to_i128() {
Some(n) => self.write_i128(n),
None => self.write_atom(Tag::SignedInteger, &v.to_signed_bytes_be()),
None => self.write_integer(&v.to_signed_bytes_be()),
},
}
}

View File

@ -40,12 +40,14 @@ pub trait Reader<'de, N: NestedValue> {
fn open_embedded(&mut self) -> ReaderResult<()>;
fn close_embedded(&mut self) -> ReaderResult<()>;
fn open_annotations(&mut self, annotations: Option<&mut Vec<N>>) -> ReaderResult<()>;
fn close_annotations(&mut self, annotations: Option<&mut Vec<N>>) -> ReaderResult<()>;
type Mark;
fn mark(&mut self) -> io::Result<Self::Mark>;
fn restore(&mut self, mark: &Self::Mark) -> io::Result<()>;
fn next_token(&mut self, read_embedded_annotations: bool) -> io::Result<Token<N>>;
fn next_annotations_and_token(&mut self) -> io::Result<(Vec<N>, Token<N>)>;
//---------------------------------------------------------------------------
@ -248,10 +250,6 @@ impl<'r, 'de, N: NestedValue, R: Reader<'de, N>> Reader<'de, N> for &'r mut R {
fn next_token(&mut self, read_embedded_annotations: bool) -> io::Result<Token<N>> {
(*self).next_token(read_embedded_annotations)
}
fn next_annotations_and_token(&mut self) -> io::Result<(Vec<N>, Token<N>)> {
(*self).next_annotations_and_token()
}
}
pub trait BinarySource<'de>: Sized {

View File

@ -1,4 +1,4 @@
´³schema·³version³ definitions·³Axis´³orµµ±values´³rec´³lit³values„´³tupleµ„„„„µ± descendants´³rec´³lit³ descendants„´³tupleµ„„„„µ±at´³rec´³lit³at„´³tupleµ´³named³key³any„„„„„µ±label´³rec´³lit³label„´³tupleµ„„„„µ±keys´³rec´³lit³keys„´³tupleµ„„„„µ±length´³rec´³lit³length„´³tupleµ„„„„µ± annotations´³rec´³lit³ annotations„´³tupleµ„„„„µ±embedded´³rec´³lit³embedded„´³tupleµ„„„„µ±parse´³rec´³lit³parse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„µ±unparse´³rec´³lit³unparse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„„„³Step´³orµµ±Axis´³refµ„³Axis„„µ±Filter´³refµ„³Filter„„µ±Function´³refµ„³Function„„„„³Filter´³orµµ±nop´³rec´³lit³nop„´³tupleµ„„„„µ±compare´³rec´³lit³compare„´³tupleµ´³named³op´³refµ„³
´³schema·³version°³ definitions·³Axis´³orµµ±values´³rec´³lit³values„´³tupleµ„„„„µ± descendants´³rec´³lit³ descendants„´³tupleµ„„„„µ±at´³rec´³lit³at„´³tupleµ´³named³key³any„„„„„µ±label´³rec´³lit³label„´³tupleµ„„„„µ±keys´³rec´³lit³keys„´³tupleµ„„„„µ±length´³rec´³lit³length„´³tupleµ„„„„µ± annotations´³rec´³lit³ annotations„´³tupleµ„„„„µ±embedded´³rec´³lit³embedded„´³tupleµ„„„„µ±parse´³rec´³lit³parse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„µ±unparse´³rec´³lit³unparse„´³tupleµ´³named³module´³seqof´³atom³Symbol„„„´³named³name´³atom³Symbol„„„„„„„„³Step´³orµµ±Axis´³refµ„³Axis„„µ±Filter´³refµ„³Filter„„µ±Function´³refµ„³Function„„„„³Filter´³orµµ±nop´³rec´³lit³nop„´³tupleµ„„„„µ±compare´³rec´³lit³compare„´³tupleµ´³named³op´³refµ„³
Comparison„„´³named³literal³any„„„„„µ±regex´³rec´³lit³regex„´³tupleµ´³named³regex´³atom³String„„„„„„µ±test´³rec´³lit³test„´³tupleµ´³named³pred´³refµ„³ Predicate„„„„„„µ±real´³rec´³lit³real„´³tupleµ„„„„µ±int´³rec´³lit³int„´³tupleµ„„„„µ±kind´³rec´³lit³kind„´³tupleµ´³named³kind´³refµ„³ ValueKind„„„„„„„„³Function´³rec´³lit³count„´³tupleµ´³named³selector´³refµ„³Selector„„„„„³Selector´³seqof´³refµ„³Step„„³ Predicate´³orµµ±Selector´³refµ„³Selector„„µ±not´³rec´³lit³not„´³tupleµ´³named³pred´³refµ„³ Predicate„„„„„„µ±or´³rec´³lit³or„´³tupleµ´³named³preds´³seqof´³refµ„³ Predicate„„„„„„„µ±and´³rec´³lit³and„´³tupleµ´³named³preds´³seqof´³refµ„³ Predicate„„„„„„„„„³ ValueKind´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ± SignedInteger´³lit³ SignedInteger„„µ±String´³lit³String„„µ±
ByteString´³lit³
ByteString„„µ±Symbol´³lit³Symbol„„µ±Record´³lit³Record„„µ±Sequence´³lit³Sequence„„µ±Set´³lit³Set„„µ±

View File

@ -756,7 +756,7 @@ suitable for placing into an <a class="autorefs autorefs-internal" href="../valu
</table>
<p>Normal usage is to supply a buffer, and keep calling <a class="autorefs autorefs-internal" href="#preserves.binary.Decoder.next">next</a>
until a <a class="autorefs autorefs-internal" href="../error/#preserves.error.ShortPacket">ShortPacket</a> exception is raised:</p>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xa0</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\x85\xb3\x01</span><span class="s1">x</span><span class="se">\xb5\x84</span><span class="s1">&#39;</span><span class="p">)</span>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xb0\x01</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\xbf\xb5\x84\xb3\x01</span><span class="s1">x</span><span class="se">\x84</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">d</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
<span class="mi">123</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">d</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
@ -770,7 +770,7 @@ until a <a class="autorefs autorefs-internal" href="../error/#preserves.error.Sh
</code></pre></div>
<p>Alternatively, keep calling <a class="autorefs autorefs-internal" href="#preserves.binary.Decoder.try_next">try_next</a> until it yields
<code>None</code>, which is not in the domain of Preserves <code>Value</code>s:</p>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xa0</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\x85\xb3\x01</span><span class="s1">x</span><span class="se">\xb5\x84</span><span class="s1">&#39;</span><span class="p">)</span>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xb0\x01</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\xbf\xb5\x84\xb3\x01</span><span class="s1">x</span><span class="se">\x84</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">d</span><span class="o">.</span><span class="n">try_next</span><span class="p">()</span>
<span class="mi">123</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">d</span><span class="o">.</span><span class="n">try_next</span><span class="p">()</span>
@ -782,24 +782,24 @@ until a <a class="autorefs autorefs-internal" href="../error/#preserves.error.Sh
<p>For convenience, <a class="autorefs autorefs-internal" href="#preserves.binary.Decoder">Decoder</a> implements the iterator interface,
backing it with <a class="autorefs autorefs-internal" href="#preserves.binary.Decoder.try_next">try_next</a>, so you can simply iterate
over all complete values in an input:</p>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xa0</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\x85\xb3\x01</span><span class="s1">x</span><span class="se">\xb5\x84</span><span class="s1">&#39;</span><span class="p">)</span>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xb0\x01</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\xbf\xb5\x84\xb3\x01</span><span class="s1">x</span><span class="se">\x84</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="nb">list</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
<span class="p">[</span><span class="mi">123</span><span class="p">,</span> <span class="s1">&#39;hello&#39;</span><span class="p">,</span> <span class="p">()]</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xa0</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\x85\xb3\x01</span><span class="s1">x</span><span class="se">\xb5\x84</span><span class="s1">&#39;</span><span class="p">):</span>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xb0\x01</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\xbf\xb5\x84\xb3\x01</span><span class="s1">x</span><span class="se">\x84</span><span class="s1">&#39;</span><span class="p">):</span>
<span class="o">...</span> <span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">v</span><span class="p">))</span>
<span class="mi">123</span>
<span class="s1">&#39;hello&#39;</span>
<span class="p">()</span>
</code></pre></div>
<p>Supply <code>include_annotations=True</code> to read annotations alongside the annotated values:</p>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xa0</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\x85\xb3\x01</span><span class="s1">x</span><span class="se">\xb5\x84</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">include_annotations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xb0\x01</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\xbf\xb5\x84\xb3\x01</span><span class="s1">x</span><span class="se">\x84</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">include_annotations</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="nb">list</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
<span class="p">[</span><span class="mi">123</span><span class="p">,</span> <span class="s1">&#39;hello&#39;</span><span class="p">,</span> <span class="o">@</span><span class="c1">#x ()]</span>
</code></pre></div>
<p>If you are incrementally reading from, say, a socket, you can use
<a class="autorefs autorefs-internal" href="#preserves.binary.Decoder.extend">extend</a> to add new input as if comes available:</p>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xa0</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">he&#39;</span><span class="p">)</span>
<div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">d</span> <span class="o">=</span> <span class="n">Decoder</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xb0\x01</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">he&#39;</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">d</span><span class="o">.</span><span class="n">try_next</span><span class="p">()</span>
<span class="mi">123</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">d</span><span class="o">.</span><span class="n">try_next</span><span class="p">()</span> <span class="c1"># returns None because the input is incomplete</span>
@ -915,7 +915,12 @@ bytes from the front of <code>self.packet</code> and resetting <code>self.index<
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">189</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">184</span>
<span class="normal">185</span>
<span class="normal">186</span>
<span class="normal">187</span>
<span class="normal">188</span>
<span class="normal">189</span>
<span class="normal">190</span>
<span class="normal">191</span>
<span class="normal">192</span>
@ -946,9 +951,7 @@ bytes from the front of <code>self.packet</code> and resetting <code>self.index<
<span class="normal">217</span>
<span class="normal">218</span>
<span class="normal">219</span>
<span class="normal">220</span>
<span class="normal">221</span>
<span class="normal">222</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="normal">220</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Reads the next complete `Value` from the internal buffer, raising</span>
<span class="sd"> [ShortPacket][preserves.error.ShortPacket] if too few bytes are available, or</span>
<span class="sd"> [DecodeError][preserves.error.DecodeError] if the input is invalid somehow.</span>
@ -957,19 +960,16 @@ bytes from the front of <code>self.packet</code> and resetting <code>self.index<
<span class="n">tag</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nextbyte</span><span class="p">()</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0x80</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0x81</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0x82</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">Float</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextbytes</span><span class="p">(</span><span class="mi">4</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0x83</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;d&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nextbytes</span><span class="p">(</span><span class="mi">8</span><span class="p">))[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0x84</span><span class="p">:</span> <span class="k">raise</span> <span class="n">DecodeError</span><span class="p">(</span><span class="s1">&#39;Unexpected end-of-stream marker&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0x85</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
<span class="n">v</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">unshift_annotation</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0x86</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">decode_embedded</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">DecodeError</span><span class="p">(</span><span class="s1">&#39;No decode_embedded function supplied&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">Embedded</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">decode_embedded</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="p">())))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">&gt;=</span> <span class="mh">0x90</span> <span class="ow">and</span> <span class="n">tag</span> <span class="o">&lt;=</span> <span class="mh">0x9f</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">tag</span> <span class="o">-</span> <span class="p">(</span><span class="mh">0xa0</span> <span class="k">if</span> <span class="n">tag</span> <span class="o">&gt;</span> <span class="mh">0x9c</span> <span class="k">else</span> <span class="mh">0x90</span><span class="p">))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">&gt;=</span> <span class="mh">0xa0</span> <span class="ow">and</span> <span class="n">tag</span> <span class="o">&lt;=</span> <span class="mh">0xaf</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextint</span><span class="p">(</span><span class="n">tag</span> <span class="o">-</span> <span class="mh">0xa0</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0x87</span><span class="p">:</span>
<span class="n">count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nextbyte</span><span class="p">()</span>
<span class="k">if</span> <span class="n">count</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">Float</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextbytes</span><span class="p">(</span><span class="mi">4</span><span class="p">)))</span>
<span class="k">if</span> <span class="n">count</span> <span class="o">==</span> <span class="mi">8</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;d&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nextbytes</span><span class="p">(</span><span class="mi">8</span><span class="p">))[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">raise</span> <span class="n">DecodeError</span><span class="p">(</span><span class="s1">&#39;Invalid IEEE754 size&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0xb0</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">varint</span><span class="p">()))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0xb1</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextbytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">varint</span><span class="p">())</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0xb2</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextbytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">varint</span><span class="p">()))</span>
@ -981,6 +981,12 @@ bytes from the front of <code>self.packet</code> and resetting <code>self.index<
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0xb5</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextvalues</span><span class="p">()))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0xb6</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextvalues</span><span class="p">()))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0xb7</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">ImmutableDict</span><span class="o">.</span><span class="n">from_kvs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nextvalues</span><span class="p">()))</span>
<span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="mh">0xbf</span><span class="p">:</span>
<span class="n">vs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nextvalues</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">vs</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="k">raise</span> <span class="n">DecodeError</span><span class="p">(</span><span class="s1">&#39;Too few items in encoded annotated value&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">include_annotations</span><span class="p">:</span>
<span class="n">vs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">annotations</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">vs</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
<span class="k">return</span> <span class="n">vs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">raise</span> <span class="n">DecodeError</span><span class="p">(</span><span class="s1">&#39;Invalid tag: &#39;</span> <span class="o">+</span> <span class="nb">hex</span><span class="p">(</span><span class="n">tag</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
</details>
@ -1005,15 +1011,15 @@ bytes from the front of <code>self.packet</code> and resetting <code>self.index<
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">224</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">222</span>
<span class="normal">223</span>
<span class="normal">224</span>
<span class="normal">225</span>
<span class="normal">226</span>
<span class="normal">227</span>
<span class="normal">228</span>
<span class="normal">229</span>
<span class="normal">230</span>
<span class="normal">231</span>
<span class="normal">232</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">try_next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="normal">230</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">try_next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Like [next][preserves.binary.Decoder.next], but returns `None` instead of raising</span>
<span class="sd"> [ShortPacket][preserves.error.ShortPacket].&quot;&quot;&quot;</span>
<span class="n">start</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span>
@ -1057,7 +1063,7 @@ bytes from the front of <code>self.packet</code> and resetting <code>self.index<
<span class="o">&gt;&gt;&gt;</span> <span class="n">e</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;hello&#39;</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">e</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">annotate</span><span class="p">([],</span> <span class="n">Symbol</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">)))</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">e</span><span class="o">.</span><span class="n">contents</span><span class="p">()</span>
<span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xa0</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\x85\xb3\x01</span><span class="s1">x</span><span class="se">\xb5\x84</span><span class="s1">&#39;</span>
<span class="sa">b</span><span class="s1">&#39;</span><span class="se">\xb0\x01</span><span class="s1">{</span><span class="se">\xb1\x05</span><span class="s1">hello</span><span class="se">\xbf\xb5\x84\xb3\x01</span><span class="s1">x</span><span class="se">\x84</span><span class="s1">&#39;</span>
</code></pre></div>
<p><strong>Parameters:</strong></p>
@ -1134,7 +1140,9 @@ annotations</a>. If explicitly <code>True</code> or
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">294</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">292</span>
<span class="normal">293</span>
<span class="normal">294</span>
<span class="normal">295</span>
<span class="normal">296</span>
<span class="normal">297</span>
@ -1143,9 +1151,7 @@ annotations</a>. If explicitly <code>True</code> or
<span class="normal">300</span>
<span class="normal">301</span>
<span class="normal">302</span>
<span class="normal">303</span>
<span class="normal">304</span>
<span class="normal">305</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="normal">303</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">encode_embedded</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">,</span>
<span class="n">canonicalize</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">include_annotations</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
@ -1188,7 +1194,9 @@ annotations</a>. If explicitly <code>True</code> or
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">367</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">365</span>
<span class="normal">366</span>
<span class="normal">367</span>
<span class="normal">368</span>
<span class="normal">369</span>
<span class="normal">370</span>
@ -1223,11 +1231,7 @@ annotations</a>. If explicitly <code>True</code> or
<span class="normal">399</span>
<span class="normal">400</span>
<span class="normal">401</span>
<span class="normal">402</span>
<span class="normal">403</span>
<span class="normal">404</span>
<span class="normal">405</span>
<span class="normal">406</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="normal">402</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Extend `self.buffer` with an encoding of `v`.&quot;&quot;&quot;</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">preserve</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s1">&#39;__preserve_write_binary__&#39;</span><span class="p">):</span>
@ -1237,21 +1241,19 @@ annotations</a>. If explicitly <code>True</code> or
<span class="k">elif</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buffer</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mh">0x81</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buffer</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mh">0x83</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buffer</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mh">0x87</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buffer</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buffer</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&gt;d&#39;</span><span class="p">,</span> <span class="n">v</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">numbers</span><span class="o">.</span><span class="n">Number</span><span class="p">):</span>
<span class="k">if</span> <span class="n">v</span> <span class="o">&gt;=</span> <span class="o">-</span><span class="mi">3</span> <span class="ow">and</span> <span class="n">v</span> <span class="o">&lt;=</span> <span class="mi">12</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buffer</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mh">0x90</span> <span class="o">+</span> <span class="p">(</span><span class="n">v</span> <span class="k">if</span> <span class="n">v</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">v</span> <span class="o">+</span> <span class="mi">16</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodeint</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodeint</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodebytes</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodebytes</span><span class="p">(</span><span class="mh">0xb2</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">basestring_</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodebytes</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">v</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodebytes</span><span class="p">(</span><span class="mh">0xb1</span><span class="p">,</span> <span class="n">v</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodevalues</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodevalues</span><span class="p">(</span><span class="mh">0xb5</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodevalues</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodevalues</span><span class="p">(</span><span class="mh">0xb5</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">set</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodeset</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">frozenset</span><span class="p">):</span>
@ -1266,7 +1268,7 @@ annotations</a>. If explicitly <code>True</code> or
<span class="k">if</span> <span class="n">i</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cannot_encode</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodevalues</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encodevalues</span><span class="p">(</span><span class="mh">0xb5</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
</details>
</div>
@ -1289,9 +1291,9 @@ annotations</a>. If explicitly <code>True</code> or
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">316</span>
<span class="normal">317</span>
<span class="normal">318</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">contents</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">314</span>
<span class="normal">315</span>
<span class="normal">316</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">contents</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns a `bytes` constructed from the contents of `self.buffer`.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">bytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">buffer</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
@ -1316,9 +1318,9 @@ annotations</a>. If explicitly <code>True</code> or
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">307</span>
<span class="normal">308</span>
<span class="normal">309</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">305</span>
<span class="normal">306</span>
<span class="normal">307</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Clears `self.buffer` to a fresh empty `bytearray`.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buffer</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">()</span>
</code></pre></div></td></tr></table></div>
@ -1353,12 +1355,12 @@ annotations</a>. If explicitly <code>True</code> or
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">434</span>
<span class="normal">435</span>
<span class="normal">436</span>
<span class="normal">437</span>
<span class="normal">438</span>
<span class="normal">439</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">canonicalize</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">430</span>
<span class="normal">431</span>
<span class="normal">432</span>
<span class="normal">433</span>
<span class="normal">434</span>
<span class="normal">435</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">canonicalize</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;As [encode][preserves.binary.encode], but sets `canonicalize=True` in the</span>
<span class="sd"> [Encoder][preserves.binary.Encoder] constructor.</span>
@ -1412,16 +1414,16 @@ annotations</a>. If explicitly <code>True</code> or
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">243</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">241</span>
<span class="normal">242</span>
<span class="normal">243</span>
<span class="normal">244</span>
<span class="normal">245</span>
<span class="normal">246</span>
<span class="normal">247</span>
<span class="normal">248</span>
<span class="normal">249</span>
<span class="normal">250</span>
<span class="normal">251</span>
<span class="normal">252</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="n">bs</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="normal">250</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">decode</span><span class="p">(</span><span class="n">bs</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Yields the first complete encoded value from `bs`, passing `kwargs` through to the</span>
<span class="sd"> [Decoder][preserves.binary.Decoder] constructor. Raises exceptions as per</span>
<span class="sd"> [next][preserves.binary.Decoder.next].</span>
@ -1454,10 +1456,10 @@ annotations</a>. If explicitly <code>True</code> or
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">254</span>
<span class="normal">255</span>
<span class="normal">256</span>
<span class="normal">257</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">decode_with_annotations</span><span class="p">(</span><span class="n">bs</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">252</span>
<span class="normal">253</span>
<span class="normal">254</span>
<span class="normal">255</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">decode_with_annotations</span><span class="p">(</span><span class="n">bs</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Like [decode][preserves.binary.decode], but supplying `include_annotations=True` to the</span>
<span class="sd"> [Decoder][preserves.binary.Decoder] constructor.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">Decoder</span><span class="p">(</span><span class="n">packet</span><span class="o">=</span><span class="n">bs</span><span class="p">,</span> <span class="n">include_annotations</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
@ -1484,12 +1486,12 @@ underlying <a class="autorefs autorefs-internal" href="#preserves.binary.Encoder
<details class="quote">
<summary>Source code in <code>preserves/binary.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">427</span>
<span class="normal">428</span>
<span class="normal">429</span>
<span class="normal">430</span>
<span class="normal">431</span>
<span class="normal">432</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">encode</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">423</span>
<span class="normal">424</span>
<span class="normal">425</span>
<span class="normal">426</span>
<span class="normal">427</span>
<span class="normal">428</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">encode</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Encode a single `Value` `v` to a byte string. Any supplied `kwargs` are passed on to the</span>
<span class="sd"> underlying [Encoder][preserves.binary.Encoder] constructor.&quot;&quot;&quot;</span>
<span class="n">e</span> <span class="o">=</span> <span class="n">Encoder</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>

View File

@ -536,7 +536,7 @@ for their Preserves counterparts. Wrapper objects for <a class="autorefs autoref
<small>
Last update:
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">March 16, 2023</span>
<span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">March 17, 2023</span>
<br>
Created:

View File

@ -725,14 +725,14 @@ annotations (for documentation and other purposes).</p>
<span class="o">...</span> <span class="nb">print</span><span class="p">(</span><span class="n">stringify</span><span class="p">(</span><span class="n">result</span><span class="p">))</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLMHY2FwdHVyZbSzB2Rpc2NhcmSEhA==] &lt;capture &lt;discard&gt;&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLMHb2JzZXJ2ZbSzBXNwZWFrtLMHZGlzY2FyZIS0swdjYXB0dXJltLMHZGlzY2FyZISEhIQ=] &lt;observe &lt;speak &lt;discard&gt; &lt;capture &lt;discard&gt;&gt;&gt;&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLWzBnRpdGxlZLMGcGVyc29ukrMFdGhpbmeRhKBlsQlCbGFja3dlbGy0swRkYXRloQcdkpOEsQJEcoQ=] &lt;[titled person 2 thing 1] 101 &quot;Blackwell&quot; &lt;date 1821 2 3&gt; &quot;Dr&quot;&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLWzBnRpdGxlZLMGcGVyc29usAECswV0aGluZ7ABAYSwAWWxCUJsYWNrd2VsbLSzBGRhdGWwAgcdsAECsAEDhLECRHKE] &lt;[titled person 2 thing 1] 101 &quot;Blackwell&quot; &lt;date 1821 2 3&gt; &quot;Dr&quot;&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLMHZGlzY2FyZIQ=] &lt;discard&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tJe1hIQ=] &lt;7 []&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLABB7WEhA==] &lt;7 []&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLMHZGlzY2FyZLMIc3VycHJpc2WE] &lt;discard surprise&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLEHYVN0cmluZ5OUhA==] &lt;&quot;aString&quot; 3 4&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLSzB2Rpc2NhcmSEk5SE] &lt;&lt;discard&gt; 3 4&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[hbMCYXK0swFShbMCYWazAWaE] @ar &lt;R @af f&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tIWzAmFyswFShbMCYWazAWaE] &lt;@ar R @af f&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLEHYVN0cmluZ7ABA7ABBIQ=] &lt;&quot;aString&quot; 3 4&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tLSzB2Rpc2NhcmSEsAEDsAEEhA==] &lt;&lt;discard&gt; 3 4&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[v7SzAVK/swFmswJhZoSEswJhcoQ=] @ar &lt;R @af f&gt;&gt;</span>
<span class="o">&lt;</span><span class="n">Test</span> <span class="c1">#[tL+zAVKzAmFyhL+zAWazAmFmhIQ=] &lt;@ar R @af f&gt;&gt;</span>
</code></pre></div>

File diff suppressed because one or more lines are too long

View File

@ -2,57 +2,57 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://preserves.dev/python/latest/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/api/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/binary/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/compare/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/error/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/fold/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/merge/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/path/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/schema/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/text/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>https://preserves.dev/python/latest/values/</loc>
<lastmod>2023-03-17</lastmod>
<lastmod>2023-10-13</lastmod>
<changefreq>daily</changefreq>
</url>
</urlset>

View File

@ -904,9 +904,9 @@ about annotations</a>.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">575</span>
<span class="normal">576</span>
<span class="normal">577</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">576</span>
<span class="normal">577</span>
<span class="normal">578</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">annotations</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">item</span> <span class="o">=</span> <span class="n">item</span>
</code></pre></div></td></tr></table></div>
@ -940,9 +940,9 @@ about annotations</a>.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">598</span>
<span class="normal">599</span>
<span class="normal">600</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">peel</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">602</span>
<span class="normal">603</span>
<span class="normal">604</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">peel</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Calls [strip_annotations][preserves.values.strip_annotations] on `self` with `depth=1`.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">strip_annotations</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
@ -967,9 +967,9 @@ about annotations</a>.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">594</span>
<span class="normal">595</span>
<span class="normal">596</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">strip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">depth</span><span class="o">=</span><span class="n">inf</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">598</span>
<span class="normal">599</span>
<span class="normal">600</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">strip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">depth</span><span class="o">=</span><span class="n">inf</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Calls [strip_annotations][preserves.values.strip_annotations] on `self` and `depth`.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">strip_annotations</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">depth</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
@ -1040,8 +1040,8 @@ Preserves <code>Value</code>, could be <code>None</code>, could be anything!</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">720</span>
<span class="normal">721</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">embeddedValue</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">724</span>
<span class="normal">725</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">embeddedValue</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">embeddedValue</span> <span class="o">=</span> <span class="n">embeddedValue</span>
</code></pre></div></td></tr></table></div>
</details>
@ -1096,9 +1096,9 @@ single-precision floating point support.)</p>
<span class="o">&gt;&gt;&gt;</span> <span class="n">preserves</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="s1">&#39;3.45&#39;</span><span class="p">)</span>
<span class="mf">3.45</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">preserves</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">Float</span><span class="p">(</span><span class="mf">3.45</span><span class="p">))</span>
<span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x82</span><span class="s1">@</span><span class="se">\\\xcc\xcd</span><span class="s1">&#39;</span>
<span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x87\x04</span><span class="s1">@</span><span class="se">\\\xcc\xcd</span><span class="s1">&#39;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">preserves</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="mf">3.45</span><span class="p">)</span>
<span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x83</span><span class="s1">@</span><span class="se">\x0b\x99\x99\x99\x99\x99\x9a</span><span class="s1">&#39;</span>
<span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x87\x08</span><span class="s1">@</span><span class="se">\x0b\x99\x99\x99\x99\x99\x9a</span><span class="s1">&#39;</span>
</code></pre></div>
<p><strong>Attributes:</strong></p>
@ -1178,8 +1178,7 @@ equivalent.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">135</span>
<span class="normal">136</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">136</span>
<span class="normal">137</span>
<span class="normal">138</span>
<span class="normal">139</span>
@ -1211,7 +1210,8 @@ equivalent.</p>
<span class="normal">165</span>
<span class="normal">166</span>
<span class="normal">167</span>
<span class="normal">168</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
<span class="normal">168</span>
<span class="normal">169</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">bs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Converts a 4-byte-long byte string to a 32-bit single-precision floating point value</span>
<span class="sd"> wrapped in a [Float][preserves.values.Float] instance. Takes care to preserve the</span>
@ -1397,10 +1397,10 @@ other dictionaries.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">461</span>
<span class="normal">462</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">462</span>
<span class="normal">463</span>
<span class="normal">464</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="normal">464</span>
<span class="normal">465</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;__hash&#39;</span><span class="p">):</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;Immutable&#39;</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ImmutableDict</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__hash</span> <span class="o">=</span> <span class="kc">None</span>
@ -1449,8 +1449,7 @@ key-value pairs.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">482</span>
<span class="normal">483</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">483</span>
<span class="normal">484</span>
<span class="normal">485</span>
<span class="normal">486</span>
@ -1481,7 +1480,8 @@ key-value pairs.</p>
<span class="normal">511</span>
<span class="normal">512</span>
<span class="normal">513</span>
<span class="normal">514</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
<span class="normal">514</span>
<span class="normal">515</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">from_kvs</span><span class="p">(</span><span class="n">kvs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Constructs an [ImmutableDict][preserves.values.ImmutableDict] from a sequence of</span>
<span class="sd"> alternating keys and values; compare to the</span>
@ -1622,10 +1622,10 @@ key-value pairs.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">273</span>
<span class="normal">274</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">274</span>
<span class="normal">275</span>
<span class="normal">276</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">fields</span><span class="p">):</span>
<span class="normal">276</span>
<span class="normal">277</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">fields</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">key</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fields</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">fields</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__hash</span> <span class="o">=</span> <span class="kc">None</span>
@ -1739,8 +1739,7 @@ argument.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">321</span>
<span class="normal">322</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">322</span>
<span class="normal">323</span>
<span class="normal">324</span>
<span class="normal">325</span>
@ -1818,7 +1817,8 @@ argument.</p>
<span class="normal">397</span>
<span class="normal">398</span>
<span class="normal">399</span>
<span class="normal">400</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
<span class="normal">400</span>
<span class="normal">401</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">makeBasicConstructor</span><span class="p">(</span><span class="n">label</span><span class="p">,</span> <span class="n">fieldNames</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Constructs and returns a &quot;constructor&quot; for `Record`s having a certain `label` and</span>
<span class="sd"> number of fields.</span>
@ -1928,15 +1928,15 @@ argument.</p>
</details>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">311</span>
<span class="normal">312</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">312</span>
<span class="normal">313</span>
<span class="normal">314</span>
<span class="normal">315</span>
<span class="normal">316</span>
<span class="normal">317</span>
<span class="normal">318</span>
<span class="normal">319</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
<span class="normal">319</span>
<span class="normal">320</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">makeConstructor</span><span class="p">(</span><span class="n">labelSymbolText</span><span class="p">,</span> <span class="n">fieldNames</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Equivalent to `Record.makeBasicConstructor(Symbol(labelSymbolText), fieldNames)`.</span>
@ -2010,9 +2010,9 @@ count).</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">416</span>
<span class="normal">417</span>
<span class="normal">418</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">arity</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">417</span>
<span class="normal">418</span>
<span class="normal">419</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">arity</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">key</span>
<span class="bp">self</span><span class="o">.</span><span class="n">arity</span> <span class="o">=</span> <span class="n">arity</span>
</code></pre></div></td></tr></table></div>
@ -2093,8 +2093,8 @@ in, the existing Symbol's <code>name</code> is used as the <code>name</code> for
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">202</span>
<span class="normal">203</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">203</span>
<span class="normal">204</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">name</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">Symbol</span><span class="p">)</span> <span class="k">else</span> <span class="n">name</span>
</code></pre></div></td></tr></table></div>
</details>
@ -2143,11 +2143,7 @@ wrapped, and appends each of the <code>anns</code> to the <a class="autorefs aut
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">664</span>
<span class="normal">665</span>
<span class="normal">666</span>
<span class="normal">667</span>
<span class="normal">668</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">668</span>
<span class="normal">669</span>
<span class="normal">670</span>
<span class="normal">671</span>
@ -2160,7 +2156,11 @@ wrapped, and appends each of the <code>anns</code> to the <a class="autorefs aut
<span class="normal">678</span>
<span class="normal">679</span>
<span class="normal">680</span>
<span class="normal">681</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">annotate</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">*</span><span class="n">anns</span><span class="p">):</span>
<span class="normal">681</span>
<span class="normal">682</span>
<span class="normal">683</span>
<span class="normal">684</span>
<span class="normal">685</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">annotate</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">*</span><span class="n">anns</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Wraps `v` in an [Annotated][preserves.values.Annotated] object, if it isn&#39;t already</span>
<span class="sd"> wrapped, and appends each of the `anns` to the [Annotated][preserves.values.Annotated]&#39;s</span>
<span class="sd"> `annotations` sequence. NOTE: Does not recursively ensure that any parts of the argument</span>
@ -2246,8 +2246,7 @@ sense the inverse of <a class="autorefs autorefs-internal" href="#preserves.valu
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">516</span>
<span class="normal">517</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">517</span>
<span class="normal">518</span>
<span class="normal">519</span>
<span class="normal">520</span>
@ -2258,7 +2257,8 @@ sense the inverse of <a class="autorefs autorefs-internal" href="#preserves.valu
<span class="normal">525</span>
<span class="normal">526</span>
<span class="normal">527</span>
<span class="normal">528</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">dict_kvs</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
<span class="normal">528</span>
<span class="normal">529</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">dict_kvs</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Generator function yielding a sequence of alternating keys and values from `d`. In some</span>
<span class="sd"> sense the inverse of [ImmutableDict.from_kvs][preserves.values.ImmutableDict.from_kvs].</span>
@ -2293,9 +2293,9 @@ sense the inverse of <a class="autorefs autorefs-internal" href="#preserves.valu
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">614</span>
<span class="normal">615</span>
<span class="normal">616</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">is_annotated</span><span class="p">(</span><span class="n">v</span><span class="p">):</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">618</span>
<span class="normal">619</span>
<span class="normal">620</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">is_annotated</span><span class="p">(</span><span class="n">v</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;`True` iff `v` is an instance of [Annotated][preserves.values.Annotated].&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">Annotated</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
@ -2387,11 +2387,7 @@ into the structure of <code>v.item</code>.</p>
<details class="quote">
<summary>Source code in <code>preserves/values.py</code></summary>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">618</span>
<span class="normal">619</span>
<span class="normal">620</span>
<span class="normal">621</span>
<span class="normal">622</span>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">622</span>
<span class="normal">623</span>
<span class="normal">624</span>
<span class="normal">625</span>
@ -2431,7 +2427,11 @@ into the structure of <code>v.item</code>.</p>
<span class="normal">659</span>
<span class="normal">660</span>
<span class="normal">661</span>
<span class="normal">662</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">strip_annotations</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">depth</span><span class="o">=</span><span class="n">inf</span><span class="p">):</span>
<span class="normal">662</span>
<span class="normal">663</span>
<span class="normal">664</span>
<span class="normal">665</span>
<span class="normal">666</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">strip_annotations</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">depth</span><span class="o">=</span><span class="n">inf</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Exposes `depth` layers of raw structure of</span>
<span class="sd"> potentially-[Annotated][preserves.values.Annotated] `Value`s. If `depth==0` or `v` is not</span>
<span class="sd"> [Annotated][preserves.values.Annotated], just returns `v`. Otherwise, descends recursively</span>

View File

@ -1,6 +1,6 @@
´³schema·³version³ definitions·³Ref´³rec´³lit³ref„´³tupleµ´³named³module´³refµ„³
´³schema·³version°³ definitions·³Ref´³rec´³lit³ref„´³tupleµ´³named³module´³refµ„³
ModulePath„„´³named³name´³atom³Symbol„„„„„³Bundle´³rec´³lit³bundle„´³tupleµ´³named³modules´³refµ„³Modules„„„„„³Schema´³rec´³lit³schema„´³tupleµ´³dict·³version´³named³version´³refµ„³Version„„³ definitions´³named³ definitions´³refµ„³ Definitions„„³ embeddedType´³named³ embeddedType´³refµ„³EmbeddedTypeName„„„„„„„³Binding´³rec´³lit³named„´³tupleµ´³named³name´³atom³Symbol„„´³named³pattern´³refµ„³ SimplePattern„„„„„³Modules´³dictof´³refµ„³
ModulePath„´³refµ„³Schema„„³Pattern´³orµµ± SimplePattern´³refµ„³ SimplePattern„„µ±CompoundPattern´³refµ„³CompoundPattern„„„„³Version´³lit„³AtomKind´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ± SignedInteger´³lit³ SignedInteger„„µ±String´³lit³String„„µ±
ModulePath„´³refµ„³Schema„„³Pattern´³orµµ± SimplePattern´³refµ„³ SimplePattern„„µ±CompoundPattern´³refµ„³CompoundPattern„„„„³Version´³lit°„³AtomKind´³orµµ±Boolean´³lit³Boolean„„µ±Float´³lit³Float„„µ±Double´³lit³Double„„µ± SignedInteger´³lit³ SignedInteger„„µ±String´³lit³String„„µ±
ByteString´³lit³
ByteString„„µ±Symbol´³lit³Symbol„„„„³
Definition´³orµµ±or´³rec´³lit³or„´³tupleµ´³ tuplePrefixµ´³named³pattern0´³refµ„³NamedAlternative„„´³named³pattern1´³refµ„³NamedAlternative„„„´³named³patternN´³seqof´³refµ„³NamedAlternative„„„„„„„„µ±and´³rec´³lit³and„´³tupleµ´³ tuplePrefixµ´³named³pattern0´³refµ„³ NamedPattern„„´³named³pattern1´³refµ„³ NamedPattern„„„´³named³patternN´³seqof´³refµ„³ NamedPattern„„„„„„„„µ±Pattern´³refµ„³Pattern„„„„³

Binary file not shown.

View File

@ -43,16 +43,17 @@
"13/14 and 16/17, depending on how they wish to treat end-of-stream conditions."
]>
<TestCases {
annotation1: <Test #x"85B10361626399" @"abc" 9>
annotation2: <Test #x"85B10361626385B103646566B5B58485B10178B58484" @"abc" @"def" [[] @"x" []]>
annotation3: <Test #x"858591928585939495" @@1 2 @@3 4 5>
annotation4: <NondeterministicTest #x"B7 85 B302616b B30161 85 B3026176 91 85 B302626b B30162 85 B3026276 92 84"
annotation1: <Test #x"BFB00109B10361626384" @"abc" 9>
annotation2: <Test #x"BF B5 B584 BF B584 B10178 84 84 B103616263 B103646566 84" @"abc" @"def" [[] @"x" []]>
annotation3: <Test #x"BF B00105 BF B00102 B00101 84 BF B00104 B00103 84 84" @@1 2 @@3 4 5>
annotation4: <NondeterministicTest
#x"B7 BF B30161 B302616b 84 BF B00101 B3026176 84 BF B30162 B302626b 84 BF B00102 B3026276 84 84"
{@ak a: @av 1 @bk b: @bv 2}>
annotation5: <Test #x"85B3026172B4B3015285B3026166B3016684" @ar <R @af f>>
annotation6: <Test #x"B485B3026172B3015285B3026166B3016684" <@ar R @af f>>
annotation5: <Test #x"BF B4 B30152 BF B30166 B3026166 84 84 B3026172 84" @ar <R @af f>>
annotation6: <Test #x"B4 BF B30152 B3026172 84 BF B30166 B3026166 84 84" <@ar R @af f>>
annotation7:
;Stop reading symbols at @ -- this test has three separate annotations
<Test #x"85B3016185B3016285B30163B584" @a@b@c[]>
<Test #x"BF B584 B30161 B30162 B30163 84" @a@b@c[]>
bytes2: <Test #x"B20568656c6c6f" #"hello">
bytes2a: <Test @"Internal whitespace is allowed, including commas!" #x"B2, 05, 68, 65, 6c, 6c, 6f" #"hello">
bytes3: <Test #x"B203414243" #"ABC">
@ -68,108 +69,108 @@
bytes13: <Test #x"B2 11 61 62 63 6c 34 f0 5c 2f 22 08 0c 0a 0d 09 78 79 7a" #"abc\x6c\x34\xf0\\/\"\b\f\n\r\txyz">
dict0: <Test #x"B784" {}>
dict1: <NondeterministicTest #x"b7 b10162 81 b30161 91 b591929384 b20163 b7 b30a66697273742d6e616d65 b109456c697a6162657468 84 b7 b3077375726e616d65 b109426c61636b77656c6c 84 84" { a: 1 "b": #t [1 2 3]: #"c" { first-name: "Elizabeth" }: { surname: "Blackwell" } }>
dict1: <NondeterministicTest #x"b7 b10162 81 b30161 b00101 b5b00101b00102b0010384 b20163 b7 b30a66697273742d6e616d65 b109456c697a6162657468 84 b7 b3077375726e616d65 b109426c61636b77656c6c 84 84" { a: 1 "b": #t [1 2 3]: #"c" { first-name: "Elizabeth" }: { surname: "Blackwell" } }>
dict2: @"Missing close brace" <ParseShort "{ a: b, c: d ">
dict2a: @"Missing close brace" <ParseShort "{">
dict3: @"Duplicate key" <ParseError "{ a: 1, a: 2 }">
dict4: @"Unexpected close brace" <ParseError "}">
dict5: @"Missing value" <DecodeError #x"b7 91 92 93 84">
double0: <Test #x"830000000000000000" 0.0>
double+0: <Test #x"830000000000000000" +0.0>
double-0: <Test #x"838000000000000000" -0.0>
double1: <Test #x"833ff0000000000000" 1.0>
double2: <Test #x"83fe3cb7b759bf0426" -1.202e300>
double3: <Test #x"83123456789abcdef0" #xd"12 34 56 78 9a bc de f0">
dict5: @"Missing value" <DecodeError #x"b7 b00101 b00102 b00103 84">
double0: <Test #x"87080000000000000000" 0.0>
double+0: <Test #x"87080000000000000000" +0.0>
double-0: <Test #x"87088000000000000000" -0.0>
double1: <Test #x"87083ff0000000000000" 1.0>
double2: <Test #x"8708fe3cb7b759bf0426" -1.202e300>
double3: <Test #x"8708123456789abcdef0" #xd"12 34 56 78 9a bc de f0">
double4: @"Fewer than 16 digits" <ParseError "#xd\"12345678\"">
double5: @"More than 16 digits" <ParseError "#xd\"123456789abcdef012\"">
double6: @"Invalid chars" <ParseError "#xd\"12zz56789abcdef0\"">
double7: @"Positive infinity" <Test #x"837ff0000000000000" #xd"7ff0000000000000">
double8: @"Negative infinity" <Test #x"83fff0000000000000" #xd"fff0000000000000">
double9: @"-qNaN" <Test #x"83fff0000000000001" #xd"fff0000000000001">
double10: @"-qNaN" <Test #x"83fff0000000000111" #xd"fff0000000000111">
double11: @"+qNaN" <Test #x"837ff0000000000001" #xd"7ff0000000000001">
double12: @"+qNaN" <Test #x"837ff0000000000111" #xd"7ff0000000000111">
double7: @"Positive infinity" <Test #x"87087ff0000000000000" #xd"7ff0000000000000">
double8: @"Negative infinity" <Test #x"8708fff0000000000000" #xd"fff0000000000000">
double9: @"-qNaN" <Test #x"8708fff0000000000001" #xd"fff0000000000001">
double10: @"-qNaN" <Test #x"8708fff0000000000111" #xd"fff0000000000111">
double11: @"+qNaN" <Test #x"87087ff0000000000001" #xd"7ff0000000000001">
double12: @"+qNaN" <Test #x"87087ff0000000000111" #xd"7ff0000000000111">
double13: @"Bad spacing" <ParseError "#xd\"12345 6789abcdef0\"">
double14: @"-sNaN" <Test #x"83fff8000000000001" #xd"fff8000000000001">
double15: @"-sNaN" <Test #x"83fff8000000000111" #xd"fff8000000000111">
double16: @"+sNaN" <Test #x"837ff8000000000001" #xd"7ff8000000000001">
double17: @"+sNaN" <Test #x"837ff8000000000111" #xd"7ff8000000000111">
float0: <Test #x"8200000000" 0.0f>
float+0: <Test #x"8200000000" +0.0f>
float-0: <Test #x"8280000000" -0.0f>
float1: <Test #x"823f800000" 1.0f>
float2: <Test #x"8212345678" #xf"12 34 56 78">
double14: @"-sNaN" <Test #x"8708fff8000000000001" #xd"fff8000000000001">
double15: @"-sNaN" <Test #x"8708fff8000000000111" #xd"fff8000000000111">
double16: @"+sNaN" <Test #x"87087ff8000000000001" #xd"7ff8000000000001">
double17: @"+sNaN" <Test #x"87087ff8000000000111" #xd"7ff8000000000111">
float0: <Test #x"870400000000" 0.0f>
float+0: <Test #x"870400000000" +0.0f>
float-0: <Test #x"870480000000" -0.0f>
float1: <Test #x"87043f800000" 1.0f>
float2: <Test #x"870412345678" #xf"12 34 56 78">
float3: @"Fewer than 8 digits" <ParseError "#xf\"123456\"">
float4: @"More than 8 digits" <ParseError "#xf\"123456789a\"">
float5: @"Invalid chars" <ParseError "#xf\"12zz5678\"">
float6: @"Positive infinity" <Test #x"827f800000" #xf"7f800000">
float7: @"Negative infinity" <Test #x"82ff800000" #xf"ff800000">
float8: @"+sNaN" <Test #x"827f800001" #xf"7f800001">
float9: @"+sNaN" <Test #x"827f800111" #xf"7f800111">
float10: @"-sNaN" <Test #x"82ff800001" #xf"ff800001">
float11: @"-sNaN" <Test #x"82ff800111" #xf"ff800111">
float6: @"Positive infinity" <Test #x"87047f800000" #xf"7f800000">
float7: @"Negative infinity" <Test #x"8704ff800000" #xf"ff800000">
float8: @"+sNaN" <Test #x"87047f800001" #xf"7f800001">
float9: @"+sNaN" <Test #x"87047f800111" #xf"7f800111">
float10: @"-sNaN" <Test #x"8704ff800001" #xf"ff800001">
float11: @"-sNaN" <Test #x"8704ff800111" #xf"ff800111">
float12: @"Bad spacing" <ParseError "#xf\"12345 678\"">
float13: @"+qNaN" <Test #x"827fc00001" #xf"7fc00001">
float14: @"+qNaN" <Test #x"827fc00111" #xf"7fc00111">
float15: @"-qNaN" <Test #x"82ffc00001" #xf"ffc00001">
float16: @"-qNaN" <Test #x"82ffc00111" #xf"ffc00111">
int-257: <Test #x"a1feff" -257>
int-256: <Test #x"a1ff00" -256>
int-255: <Test #x"a1ff01" -255>
int-254: <Test #x"a1ff02" -254>
int-129: <Test #x"a1ff7f" -129>
int-128: <Test #x"a080" -128>
int-127: <Test #x"a081" -127>
int-4: <Test #x"a0fc" -4>
int-3: <Test #x"9d" -3>
int-2: <Test #x"9e" -2>
int-1: <Test #x"9f" -1>
int0: <Test #x"90" 0>
int+0: <Test #x"90" +0>
int-0: <Test #x"90" -0>
int1: <Test #x"91" 1>
int12: <Test #x"9c" 12>
int13: <Test #x"a00d" 13>
int127: <Test #x"a07f" 127>
int+127: <Test #x"a07f" +127>
int128: <Test #x"a10080" 128>
int255: <Test #x"a100ff" 255>
int256: <Test #x"a10100" 256>
int32767: <Test #x"a17fff" 32767>
int32768: <Test #x"a2008000" 32768>
int65535: <Test #x"a200ffff" 65535>
int65536: <Test #x"a2010000" 65536>
int131072: <Test #x"a2020000" 131072>
int2500000000: <Test #x"a4009502f900" 2500000000>
float13: @"+qNaN" <Test #x"87047fc00001" #xf"7fc00001">
float14: @"+qNaN" <Test #x"87047fc00111" #xf"7fc00111">
float15: @"-qNaN" <Test #x"8704ffc00001" #xf"ffc00001">
float16: @"-qNaN" <Test #x"8704ffc00111" #xf"ffc00111">
int-257: <Test #x"b002feff" -257>
int-256: <Test #x"b002ff00" -256>
int-255: <Test #x"b002ff01" -255>
int-254: <Test #x"b002ff02" -254>
int-129: <Test #x"b002ff7f" -129>
int-128: <Test #x"b00180" -128>
int-127: <Test #x"b00181" -127>
int-4: <Test #x"b001fc" -4>
int-3: <Test #x"b001fd" -3>
int-2: <Test #x"b001fe" -2>
int-1: <Test #x"b001ff" -1>
int0: <Test #x"b000" 0>
int+0: <Test #x"b000" +0>
int-0: <Test #x"b000" -0>
int1: <Test #x"b00101" 1>
int12: <Test #x"b0010c" 12>
int13: <Test #x"b0010d" 13>
int127: <Test #x"b0017f" 127>
int+127: <Test #x"b0017f" +127>
int128: <Test #x"b0020080" 128>
int255: <Test #x"b00200ff" 255>
int256: <Test #x"b0020100" 256>
int32767: <Test #x"b0027fff" 32767>
int32768: <Test #x"b003008000" 32768>
int65535: <Test #x"b00300ffff" 65535>
int65536: <Test #x"b003010000" 65536>
int131072: <Test #x"b003020000" 131072>
int2500000000: <Test #x"b005009502f900" 2500000000>
int87112285931760246646623899502532662132736: <Test #x"b012010000000000000000000000000000000000" 87112285931760246646623899502532662132736>
list0: <Test #x"b584" []>
list4: <Test #x"b59192939484" [1 2 3 4]>
list4a: <Test #x"b59192939484" [1, 2, 3, 4]>
list5: <Test #x"b59e9f909184" [-2 -1 0 1]>
list4: <Test #x"b5b00101b00102b00103b0010484" [1 2 3 4]>
list4a: <Test #x"b5b00101b00102b00103b0010484" [1, 2, 3, 4]>
list5: <Test #x"b5b001feb001ffb000b0010184" [-2 -1 0 1]>
list6: <Test #x"b5 b10568656c6c6f b3057468657265 b205776f726c64 b584 b684 81 80 84" ["hello" there #"world" [] #{} #t #f]>
list7: <Test #x"b5 b303616263 b3032e2e2e b303646566 84" [abc ... def]>
list8: @"Missing close bracket" <ParseShort "[">
list9: @"Unexpected close bracket" <ParseError "]">
list10: @"Missing end byte" <DecodeShort #x"b58080">
list11: <Test #x"b59184" [01]>
list12: <Test #x"b59c84" [12]>
list11: <Test #x"b5b0010184" [01]>
list12: <Test #x"b5b0010c84" [12]>
noinput0: @"No input at all" <DecodeEOF #x"">
embed0: <Test #x"8690" #!0>
embed1: <Test #x"868690" #!#!0>
embed2: <Test #x"b5869086b10568656c6c6f84" [#!0 #!"hello"]>
embed0: <Test #x"86b000" #!0>
embed1: <Test #x"8686b000" #!#!0>
embed2: <Test #x"b586b00086b10568656c6c6f84" [#!0 #!"hello"]>
record1: <Test #x"b4 b30763617074757265 b4 b30764697363617264 84 84" <capture <discard>>>
record2: <Test #x"b4 b3076f627365727665 b4 b305737065616b b4 b30764697363617264 84 b4 b30763617074757265 b4 b30764697363617264 84 84 84 84" <observe <speak <discard>, <capture <discard>>>>>
record3: <Test #x"b4 b5 b3067469746c6564 b306706572736f6e 92 b3057468696e67 91 84 a065 b109426c61636b77656c6c b4 b30464617465 a1071d 92 93 84 b1024472 84" <[titled person 2 thing 1] 101 "Blackwell" <date 1821 2 3> "Dr">>
record3: <Test #x"b4 b5 b3067469746c6564 b306706572736f6e b00102 b3057468696e67 b00101 84 b00165 b109426c61636b77656c6c b4 b30464617465 b002071d b00102 b00103 84 b1024472 84" <[titled person 2 thing 1] 101 "Blackwell" <date 1821 2 3> "Dr">>
record4: <Test #x"b4 b30764697363617264 84" <discard>>
record5: <Test #x"b497b58484" <7[]>>
record5: <Test #x"b4b00107b58484" <7[]>>
record6: <Test #x"b4b30764697363617264b308737572707269736584" <discard surprise>>
record7: <Test #x"b4b10761537472696e67939484" <"aString" 3 4>>
record8: <Test #x"b4b4b3076469736361726484939484" <<discard> 3 4>>
record7: <Test #x"b4b10761537472696e67b00103b0010484" <"aString" 3 4>>
record8: <Test #x"b4b4b3076469736361726484b00103b0010484" <<discard> 3 4>>
record9: @"Missing record label" <ParseError "<>">
record10: @"Missing close-angle-bracket" <ParseShort "<">
record11: @"Unexpected close-angle-bracket" <ParseError ">">
set0: <Test #x"b684" #{}>
set1: <NondeterministicTest #x"b691929384" #{1 2 3}>
set1: <NondeterministicTest #x"b6b00101b00102b0010384" #{1 2 3}>
set2: @"Missing close brace" <ParseShort "#{ 1 2 3 ">
set2a: @"Missing close brace" <ParseShort "#{">
set3: @"Duplicate value" <ParseError "#{a a}">
@ -277,17 +278,17 @@
B7
B1 03 494473
B5
A0 74
A1 03 AF
A1 00 EA
A2 00 97 89
B0 01 74
B0 02 03 AF
B0 02 00 EA
B0 03 00 97 89
84
B1 05 5469746c65
B1 14 566965772066726f6d203135746820466c6f6f72
B1 05 5769647468
A1 03 20
B0 02 03 20
B1 06 486569676874
A1 02 58
B0 02 02 58
B1 08 416e696d61746564
B3 05 66616c7365
B1 09 5468756d626e61696c
@ -295,9 +296,9 @@
B1 03 55726c
B1 26 687474703a2f2f7777772e6578616d706c652e636f6d2f696d6167652f343831393839393433
B1 05 5769647468
A0 64
B0 01 64
B1 06 486569676874
A0 7D
B0 01 7D
84
84
84"
@ -324,8 +325,8 @@
b1 05 5374617465 b1 02 4341
b1 07 41646472657373 b1 00
b1 07 436f756e747279 b1 02 5553
b1 08 4c61746974756465 83 4042e226809d4952
b1 09 4c6f6e676974756465 83 c05e99566cf41f21
b1 08 4c61746974756465 8708 4042e226809d4952
b1 09 4c6f6e676974756465 8708 c05e99566cf41f21
b1 09 707265636973696f6e b1 03 7a6970
84
b7
@ -334,8 +335,8 @@
b1 05 5374617465 b1 02 4341
b1 07 41646472657373 b1 00
b1 07 436f756e747279 b1 02 5553
b1 08 4c61746974756465 83 4042af9d66adb403
b1 09 4c6f6e676974756465 83 c05e81aa4fca42af
b1 08 4c61746974756465 8708 4042af9d66adb403
b1 09 4c6f6e676974756465 8708 c05e81aa4fca42af
b1 09 707265636973696f6e b1 03 7a6970
84
84"