arcs.rs

1.8 kB · rust · 51 lines

1use crate::{checked, Fault, Grid};2use mrlyrs::core::json;3use mrlyrs::math::arcs::{self, Arcs};4use mrlyrs::math::bang::Code;5use wasm_bindgen::prelude::*;67const CELLS: usize = 1 << 16;89fn drawn(code: &str, base: usize, level: usize) -> Result<Arcs, Fault> {10    let code = checked(code, 2, base)?;11    if level > arcs_cap(base) {12        return Err(Fault::new(format!(13            "level {level} at base {base} is past the {CELLS} cells this page draws."14        )));15    }16    Ok(arcs::draw(Code::from(code), base, level)?)17}1819/// Returns the deepest level, at least one, whose arcs this page draws at the base: at most 65536 cells.20#[wasm_bindgen]21pub fn arcs_cap(base: usize) -> usize {22    crate::bang::level_cap(base, 2, CELLS)23}2425/// Draws the level in Truchet arcs as a byte grid, row 0 at the bottom: bit 0 a filled cell, bit 1 its lower arc on a loop, bit 2 its upper arc on a loop.26#[wasm_bindgen]27pub fn arcs_grid(code: &str, base: usize, level: usize) -> Result<Grid, Fault> {28    let arcs = drawn(code, base, level)?;29    Ok(Grid {30        width: arcs.side as u32,31        height: arcs.side as u32,32        types: arcs.cells,33    })34}3536/// Reads the level in Truchet arcs: its side, filled cells, loops and strands, and the proved loop law at that level or null, as JSON.37#[wasm_bindgen]38pub fn arcs_read(code: &str, base: usize, level: usize) -> Result<String, Fault> {39    let arcs = drawn(code, base, level)?;40    let law = arcs::law(Code::from(checked(code, 2, base)?), base, level)?;41    let filled = arcs.cells.iter().filter(|&&byte| byte & 1 == 1).count();42    Ok(json!({43        "side": arcs.side,44        "cells": arcs.side * arcs.side,45        "filled": filled,46        "loops": arcs.loops,47        "strands": arcs.strands,48        "law": law.map(|law| json!({ "formula": law.formula, "loops": law.loops })),49    })50    .to_string())51}