Skip to content

Commit

Permalink
refactor(grid-iterators): add/rename types/opts
Browse files Browse the repository at this point in the history
BREAKING CHANGE: rename various option types (add 2D/3D suffixes)
  • Loading branch information
postspectacular committed Mar 30, 2023
1 parent 113852c commit bc3ea21
Show file tree
Hide file tree
Showing 18 changed files with 58 additions and 51 deletions.
25 changes: 16 additions & 9 deletions packages/grid-iterators/src/api.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
import type { Fn, FnU2 } from "@thi.ng/api";
import type { Fn, FnU2, FnU3 } from "@thi.ng/api";

export type GridCoord2D = [number, number];

export type GridCoord3D = [number, number, number];

/**
* Higher order point coordinate transformation function. First is called with
* grid resolution (cols,rows), then returns a function which is applied to each
* generated grid coordinate.
*/
export type PointTransform = FnU2<number, FnU2<number, [number, number]>>;
export type PointTransform2D = FnU2<number, FnU2<number, GridCoord2D>>;
/**
* Higher order point coordinate transformation function. First is called with
* grid resolution (cols,rows,slices), then returns a function which is applied
* to each generated grid coordinate.
*/
export type PointTransform3D = FnU3<number, FnU3<number, GridCoord3D>>;

export interface GridIterOpts {
export interface GridIterOpts2D {
/**
* Number of grid columns
*/
Expand All @@ -22,12 +32,9 @@ export interface GridIterOpts {
*
* @defaultValue {@link ident}
*/
tx?: PointTransform;
tx?: PointTransform2D;
}

export type GridIterator2D = Fn<GridIterOpts, Iterable<[number, number]>>;
export type GridIterator2D = Fn<GridIterOpts2D, Iterable<GridCoord2D>>;

export type GridIterator3D = Fn<
GridIterOpts,
Iterable<[number, number, number]>
>;
export type GridIterator3D = Fn<GridIterOpts2D, Iterable<GridCoord3D>>;
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/column-ends.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -7,7 +7,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* columnEnds2d(opts: GridIterOpts) {
export function* columnEnds2d(opts: GridIterOpts2D) {
let { cols, rows, tx } = __opts(opts);
rows--;
for (let x = 0; x < cols; x++) {
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/columns.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { map } from "@thi.ng/transducers/map";
import { range2d } from "@thi.ng/transducers/range2d";
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
* Yields sequence of 2D grid coordinates in column-major order.
*
* @param opts -
*/
export const columns2d = (opts: GridIterOpts) => {
export const columns2d = (opts: GridIterOpts2D) => {
const { cols, rows, tx } = __opts(opts);
return map((p) => tx(p[1], p[0]), range2d(rows | 0, cols | 0));
};
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/diagonal-ends.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { diagonal2d } from "./diagonal.js";
import { __opts } from "./utils.js";

Expand All @@ -12,7 +12,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* diagonalEnds2d(opts: GridIterOpts & { all?: boolean }) {
export function* diagonalEnds2d(opts: GridIterOpts2D & { all?: boolean }) {
const { cols, rows, tx } = __opts(opts);
const num = cols * rows - 1;
const maxX = cols - 1;
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/diagonal-slope.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { assert } from "@thi.ng/errors/assert";
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

interface DiagonalSlopeOpts extends GridIterOpts {
interface DiagonalSlopeOpts extends GridIterOpts2D {
/**
* Diagonal slope / step size
*/
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/diagonal.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -11,7 +11,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* diagonal2d(opts: GridIterOpts) {
export function* diagonal2d(opts: GridIterOpts2D) {
const { cols, rows, tx } = __opts(opts);
const num = cols * rows - 1;
for (let x = 0, y = 0, nx = 1, ny = 0, i = 0; i <= num; i++) {
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/hilbert.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -10,7 +10,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* hilbert2d(opts: GridIterOpts) {
export function* hilbert2d(opts: GridIterOpts2D) {
const { cols, rows, tx } = __opts(opts);
let hIndex = 0; // hilbert curve index
let hOrder = 0; // hilbert curve order
Expand Down
8 changes: 4 additions & 4 deletions packages/grid-iterators/src/interleave.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { map } from "@thi.ng/transducers/map";
import { range2d } from "@thi.ng/transducers/range2d";
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

interface InterleaveOpts extends GridIterOpts {
interface InterleaveOpts2D extends GridIterOpts2D {
/**
* Row or column stride.
*
Expand All @@ -27,7 +27,7 @@ interface InterleaveOpts extends GridIterOpts {
*
* @param opts -
*/
export function* interleaveColumns2d(opts: InterleaveOpts) {
export function* interleaveColumns2d(opts: InterleaveOpts2D) {
const { cols, rows, tx } = __opts(opts);
const step = (opts.step != null ? opts.step : 2) | 0;
for (let j = 0; j < step; j++) {
Expand All @@ -49,7 +49,7 @@ export function* interleaveColumns2d(opts: InterleaveOpts) {
*
* @param opts -
*/
export function* interleaveRows2d(opts: InterleaveOpts) {
export function* interleaveRows2d(opts: InterleaveOpts2D) {
const { cols, rows, tx } = __opts(opts);
const step = (opts.step != null ? opts.step : 2) | 0;
for (let j = 0; j < step; j++) {
Expand Down
6 changes: 3 additions & 3 deletions packages/grid-iterators/src/random.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import { shuffle } from "@thi.ng/arrays/shuffle";
import type { IRandom } from "@thi.ng/random";
import { SYSTEM } from "@thi.ng/random/system";
import { range } from "@thi.ng/transducers/range";
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

interface Random2DOpts extends GridIterOpts {
interface RandomOpts2D extends GridIterOpts2D {
/**
* PRNG instance to use
*
Expand All @@ -23,7 +23,7 @@ interface Random2DOpts extends GridIterOpts {
*
* @param opts -
*/
export function* random2d(opts: Random2DOpts) {
export function* random2d(opts: RandomOpts2D) {
const { cols, rows, tx } = __opts(opts);
const rnd = opts.rnd || SYSTEM;
for (let i of shuffle([...range(cols * rows)], undefined, rnd)) {
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/row-ends.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -7,7 +7,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* rowEnds2d(opts: GridIterOpts) {
export function* rowEnds2d(opts: GridIterOpts2D) {
let { cols, rows, tx } = __opts(opts);
cols--;
for (let y = 0; y < rows; y++) {
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/rows.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { map } from "@thi.ng/transducers/map";
import { range2d } from "@thi.ng/transducers/range2d";
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -9,7 +9,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export const rows2d = (opts: GridIterOpts) => {
export const rows2d = (opts: GridIterOpts2D) => {
const { cols, rows, tx } = __opts(opts);
return map((p) => tx(p[0], p[1]), range2d(cols, rows));
};
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/spiral.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -10,7 +10,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* spiral2d(opts: GridIterOpts) {
export function* spiral2d(opts: GridIterOpts2D) {
const { cols, rows, tx } = __opts(opts);
const num = cols * rows;
const center = (Math.min(cols, rows) - 1) >> 1;
Expand Down
14 changes: 7 additions & 7 deletions packages/grid-iterators/src/transforms.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import type { PointTransform } from "./api.js";
import type { PointTransform2D } from "./api.js";

/**
* No-op / identity {@link PointTransform}.
*/
export const ident: PointTransform = () => (x, y) => [x, y];
export const ident: PointTransform2D = () => (x, y) => [x, y];

export const flipX: PointTransform = (cols) => (x, y) => [cols - 1 - x, y];
export const flipX: PointTransform2D = (cols) => (x, y) => [cols - 1 - x, y];

export const flipY: PointTransform = (_, rows) => (x, y) => [x, rows - 1 - y];
export const flipY: PointTransform2D = (_, rows) => (x, y) => [x, rows - 1 - y];

export const flipXY: PointTransform = (cols, rows) => (x, y) =>
export const flipXY: PointTransform2D = (cols, rows) => (x, y) =>
[cols - 1 - x, rows - 1 - y];

/**
* {@link PointTransform} to swaps X & Y coords.
*/
export const swapXY: PointTransform = () => (x, y) => [y, x];
export const swapXY: PointTransform2D = () => (x, y) => [y, x];

/**
* Higher order {@link PointTransform} to compose given transforms in
Expand All @@ -25,7 +25,7 @@ export const swapXY: PointTransform = () => (x, y) => [y, x];
* @param b
*/
export const compTransforms =
(a: PointTransform, b: PointTransform): PointTransform =>
(a: PointTransform2D, b: PointTransform2D): PointTransform2D =>
(cols, rows) => {
const $a = a(cols, rows);
const $b = b(cols, rows);
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// thing:no-export
import { asInt } from "@thi.ng/api/typedarray";
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { ident } from "./transforms.js";

export const __opts = (opts: GridIterOpts) => {
export const __opts = (opts: GridIterOpts2D) => {
let { cols, rows, tx } = { rows: opts.cols, tx: ident, ...opts };
[cols, rows] = asInt(cols, rows);
return { cols, rows, tx: tx(cols, rows) };
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/zcurve.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ceilPow2 } from "@thi.ng/binary/pow";
import { demux2 } from "@thi.ng/morton/mux";
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -11,7 +11,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* zcurve2d(opts: GridIterOpts) {
export function* zcurve2d(opts: GridIterOpts2D) {
const { cols, rows, tx } = __opts(opts);
const max = ceilPow2(Math.pow(Math.max(cols, rows), 2));
for (let i = 0; i < max; i++) {
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/zigzag-columns.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -10,7 +10,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* zigzagColumns2d(opts: GridIterOpts) {
export function* zigzagColumns2d(opts: GridIterOpts2D) {
const { cols, rows, tx } = __opts(opts);
const num = cols * rows;
for (let i = 0; i < num; i++) {
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/zigzag-diagonal.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -7,7 +7,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* zigzagDiagonal2d(opts: GridIterOpts) {
export function* zigzagDiagonal2d(opts: GridIterOpts2D) {
const { cols, rows, tx } = __opts(opts);
const num = cols * rows - 1;
for (
Expand Down
4 changes: 2 additions & 2 deletions packages/grid-iterators/src/zigzag-rows.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { GridIterOpts } from "./api.js";
import type { GridIterOpts2D } from "./api.js";
import { __opts } from "./utils.js";

/**
Expand All @@ -10,7 +10,7 @@ import { __opts } from "./utils.js";
*
* @param opts -
*/
export function* zigzagRows2d(opts: GridIterOpts) {
export function* zigzagRows2d(opts: GridIterOpts2D) {
const { cols, rows, tx } = __opts(opts);
const num = cols * rows;
for (let i = 0; i < num; i++) {
Expand Down

0 comments on commit bc3ea21

Please sign in to comment.