hclang
Version:
Homoiconic C: Programming without a Language
104 lines • 7.56 kB
JavaScript
import { FrameAtom } from './frame-atom.js';
import { NilContext } from './meta-frame.js';
export class FrameBlob extends FrameAtom {
static fix_source(source) {
if (source === '') {
return '0' + FrameBlob.BLOB_PREFIX[16] + '0';
}
if (source[0] !== '0') {
return '0' + source;
}
return source;
}
static find_base(source) {
const prefix = source.substr(1, 1);
const keys = Object.keys(FrameBlob.BLOB_PREFIX);
const base = keys.find((k) => FrameBlob.BLOB_PREFIX[parseInt(k, 10)] === prefix);
return parseInt(base || '10', 10);
}
static count_bits(source, base) {
const digits = source.substr(2);
const length = digits.length;
const entropy = Math.log2(base);
const bits = length * entropy;
return BigInt(bits);
}
constructor(source) {
super(NilContext);
source = FrameBlob.fix_source(source);
this.data = BigInt(source);
this.base = FrameBlob.find_base(source);
this.n_bits = FrameBlob.count_bits(source, this.base);
}
called_by(context, parameter) {
if (context instanceof FrameBlob) {
const left_operand = context;
const result = left_operand.append(this);
return result;
}
return super.called_by(context, parameter);
}
string_start() {
return FrameBlob.BLOB_START;
}
;
string_prefix() {
const sigil = FrameBlob.BLOB_PREFIX[this.base];
return '0' + sigil;
}
;
canInclude(char) {
const regex = FrameBlob.BLOB_DIGITS[64]; // accept everything, to start
return regex.test(char);
}
toString() {
const dataString = this.toData().toString(this.base);
const pad = this.n_chars() - dataString.length;
const digits = '0'.repeat(pad) + dataString;
return this.string_prefix() + digits + this.string_suffix();
}
toData() {
return this.data;
}
append(right_operand) {
const left = BigInt(right_operand.exalt(this));
this.data = left + right_operand.data;
this.n_bits = this.n_bits + right_operand.n_bits;
return this;
}
;
exalt(left_operand) {
const result = left_operand.shift_left(this.n_bits);
return result;
}
;
shift_left(n_bits) {
const bigint_result = this.data << n_bits;
return bigint_result;
}
;
n_chars() {
const entropy = Math.log2(this.base);
const bits = Number(this.n_bits);
const chars = bits / entropy;
return Math.ceil(chars);
}
;
}
FrameBlob.BLOB_START = '0';
FrameBlob.BLOB_DIGITS = {
2: /[01]/,
8: /[0-7]/,
16: /[0-9a-fA-F]/,
32: /[0-9a-hj-np-z]/,
64: /[0-9a-zA-Z+/=]/
};
FrameBlob.BLOB_PREFIX = {
2: 'b',
8: 'o',
16: 'x',
32: 't',
64: 's' // 6
};
;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWUtYmxvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcmFtZXMvZnJhbWUtYmxvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBVzVDLE1BQU0sT0FBTyxTQUFVLFNBQVEsU0FBUztJQWtCL0IsTUFBTSxDQUFDLFVBQVUsQ0FBRSxNQUFjO1FBQ3RDLElBQUksTUFBTSxLQUFLLEVBQUUsRUFBRTtZQUNqQixPQUFPLEdBQUcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtTQUM3QztRQUNELElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUNyQixPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUE7U0FDcEI7UUFDRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFFLE1BQWM7UUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUE7UUFDaEYsT0FBTyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVUsQ0FBRSxNQUFjLEVBQUUsSUFBWTtRQUNw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