diff --git a/packages/arrays/src/blit.ts b/packages/arrays/src/blit.ts index b29e73bac9..e5b8d63e83 100644 --- a/packages/arrays/src/blit.ts +++ b/packages/arrays/src/blit.ts @@ -1,4 +1,4 @@ -import type { TypedArray } from "@thi.ng/api"; +import type { Fn3, TypedArray } from "@thi.ng/api"; /** * Selectively copies all non-`mask` values from `src` into `dest` starting from @@ -51,6 +51,44 @@ export function blit1d(dest: any[], x: number, src: ArrayLike, mask: any) { return dest; } +/** + * Similar to {@link blit1d}, but uses a predicate function to + * determine/transform copied values. The predicate is called with the src, and + * dest item values and src index. The result of that function is written to the + * `dest` array. If the predicate returns `undefined`, no value will be written. + * + * @param dest + * @param dx + * @param src + * @param pred + */ +export function blitPred1d( + dest: T, + dx: number, + src: ArrayLike, + pred: Fn3 +): T; +export function blitPred1d( + dest: T[], + dx: number, + src: ArrayLike, + pred: Fn3 +): T[]; +export function blitPred1d( + dest: any[], + x: number, + src: ArrayLike, + pred: any +) { + const [sx, sw, dx, dw] = __clip(0, src.length, x, dest.length); + if (sw < 1 || dx >= dw) return dest; + for (let i = 0; i < sw; i++) { + const val = pred(src[sx + i], dest[dx + i], sx + i); + val !== undefined && (dest[dx + i] = val); + } + return dest; +} + /** * 2D version of {@link blit1d} (also with region clipping). Positions and sizes * are given as 2D vectors.