blob
Blobs are binary large objects — containers of bits (not bytes). They're used for encoding data, messages, images, network payloads, and more.
States
A blob exists in one of two states:
- antestone (mutable) — write operations allowed
- stone (immutable) — read operations allowed
var blob = use('blob')
var b = blob.make() // antestone
blob.write_bit(b, 1)
blob.write_fit(b, 42, 8)
stone(b) // now stone, readable
Creation
blob.make()
Create an empty blob.
var b = blob.make()
blob.make(capacity)
Create with initial capacity (bits).
var b = blob.make(1024) // 1024 bits capacity
blob.make(length, logical)
Create filled with zeros or ones.
blob.make(64, false) // 64 zero bits
blob.make(64, true) // 64 one bits
blob.make(blob, from, to)
Copy a range from another blob.
var slice = blob.make(original, 0, 32) // first 32 bits
Writing (antestone only)
blob.write_bit(b, logical)
Append a single bit.
blob.write_bit(b, true) // append 1
blob.write_bit(b, false) // append 0
blob.write_fit(b, value, length)
Append a fixed-width integer.
blob.write_fit(b, 255, 8) // 8-bit value
blob.write_fit(b, 1000, 16) // 16-bit value
blob.write_blob(b, other)
Append another blob's contents.
blob.write_blob(b, other_blob)
blob.write_dec64(b, number)
Append a 64-bit DEC64 number.
blob.write_dec64(b, 3.14159)
blob.write_text(b, text)
Append text (kim-encoded length + characters).
blob.write_text(b, "hello")
blob.write_pad(b, block_size)
Pad to block boundary (1 bit + zeros).
blob.write_pad(b, 8) // pad to byte boundary
Reading (stone only)
blob.read_logical(b, from)
Read a single bit.
var bit = blob.read_logical(b, 0) // first bit
blob.read_fit(b, from, length)
Read a fixed-width integer.
var value = blob.read_fit(b, 0, 8) // read 8 bits from position 0
blob.read_blob(b, from, to)
Extract a range as new blob.
var slice = blob.read_blob(b, 8, 24) // bits 8-23
blob.read_dec64(b, from)
Read a 64-bit DEC64 number.
var num = blob.read_dec64(b, 0)
blob.read_text(b, from)
Read kim-encoded text.
var str = blob.read_text(b, 0)
blob.pad?(b, from, block_size)
Check if padding is valid.
if (blob["pad?"](b, pos, 8)) {
// valid byte-aligned padding
}
Length
length(b) // returns bit count
Example
var blob = use('blob')
// Encode a simple message
var msg = blob.make()
blob.write_fit(msg, 1, 8) // message type
blob.write_fit(msg, 42, 32) // payload
blob.write_text(msg, "hello") // text data
stone(msg)
// Decode
var type = blob.read_fit(msg, 0, 8)
var payload = blob.read_fit(msg, 8, 32)
var txt = blob.read_text(msg, 40)