@thi.ng/shader-ast
Version:
DSL to define shader code in TypeScript and cross-compile to GLSL, JS and other targets
42 lines (41 loc) • 1.28 kB
JavaScript
import { isArrayLike } from "@thi.ng/checks/is-arraylike";
import { isNumber } from "@thi.ng/checks/is-number";
import { isPlainObject } from "@thi.ng/checks/is-plain-object";
import {
B,
F,
I,
U
} from "../api/types.js";
const RE_VEC = /^[iub]?vec[234]$/;
const RE_MAT = /^mat[234]$/;
const isTerm = (t) => isPlainObject(t) && !!t.tag && !!t.type;
const isBool = (t) => t.type === B;
const isFloat = (t) => t.type === F;
const isInt = (t) => t.type === I;
const isUint = (t) => t.type === U;
const isLit = (t) => t.tag === "lit";
const isLitFloat = (t) => isLit(t) && isFloat(t);
const isLitInt = (t) => isLit(t) && isInt(t);
const isLitNumeric = (t) => isLit(t) && (isFloat(t) || isInt(t) || isUint(t));
const isLitNumericConst = (t) => isLit(t) && isNumber(t.val);
const isLitVecConst = (t) => isLit(t) && isVec(t) && isArrayLike(t.val);
const isLitNumOrVecConst = (t, n) => isLitNumericConst(t) && t.val === n || isLitVecConst(t) && t.val.every((x) => isLitNumericConst(x) && x.val === n);
const isVec = (t) => RE_VEC.test(t.type);
const isMat = (t) => RE_MAT.test(t.type);
export {
isBool,
isFloat,
isInt,
isLit,
isLitFloat,
isLitInt,
isLitNumOrVecConst,
isLitNumeric,
isLitNumericConst,
isLitVecConst,
isMat,
isTerm,
isUint,
isVec
};