themer
Version:
Customizable theme creator for editors, terminals, wallpaper, and more.
50 lines (40 loc) • 1.32 kB
text/typescript
import { source } from 'common-tags';
import type { AnnotatedColorSet } from '../color-set/index.js';
export type RenderOptions = {
wallpaperSizes: { w: number; h: number }[];
};
export type OutputFile = {
path: string;
content: string;
};
export interface Template {
name: string;
render: (
colorSet: AnnotatedColorSet,
options: RenderOptions,
) => AsyncGenerator<OutputFile>;
renderInstructions: (paths: string[], colorSet: AnnotatedColorSet) => string;
}
export const listOutputFiles: Template['renderInstructions'] = (
paths: string[],
) => source`
Files generated:
${paths.map((p) => `* \`${p}\``).join('\n')}
`;
export function weightedRandom<T>(map: Map<T, number>): T {
if (map.size === 0) throw new Error('weightedRandom map must have values');
const cumulativeWeights = [...map.values()].reduce<number[]>(
(c, weight, i) => c.concat(weight + (c[i - 1] || 0)),
[],
);
const random =
(cumulativeWeights[cumulativeWeights.length - 1] || 0) * Math.random();
return [...map.keys()][cumulativeWeights.findIndex((cw) => random < cw)]!;
}
export const version = '5.0.1';
export function join(...parts: string[]): string {
return parts.join('/');
}
export function dirname(path: string): string {
return path.substring(0, path.lastIndexOf('/'));
}