diff --git a/html/common.tsx b/html/common.tsx index a885fdd..6bcb36b 100644 --- a/html/common.tsx +++ b/html/common.tsx @@ -102,3 +102,38 @@ export const DisappearOnClick = ({ {children} ); + +export function shuffle(array: T[]): T[] { + let currentIndex = array.length, + randomIndex; + + // While there remain elements to shuffle. + while (currentIndex != 0) { + // Pick a remaining element. + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex--; + + // And swap it with the current element. + [array[currentIndex], array[randomIndex]] = [ + array[randomIndex], + array[currentIndex], + ]; + } + + return array; +} + +// type NOf = R["length"] extends N +// ? R +// : NOf; + +// export function n_of( +// n: N, +// x: T +// ): NOf { +// return []; +// } + +export function n_of(n: number, x: T): T[] { + return new Array(n).fill(x); +} diff --git a/html/hot_people_who_eat_croissants_are_dangerous.tsx b/html/hot_people_who_eat_croissants_are_dangerous.tsx index 740622f..8d5840f 100644 --- a/html/hot_people_who_eat_croissants_are_dangerous.tsx +++ b/html/hot_people_who_eat_croissants_are_dangerous.tsx @@ -30,7 +30,7 @@ const get_delays = (...lengths: number[]): number[] => { return out; }; -const Wheel = ({ +export const Wheel = ({ items, width, calc_width, @@ -74,12 +74,12 @@ function slices(arr: T[]): T[][] { return arr.map((_, i) => arr.slice(0, i)); } -function weird_slices(arr: T[]): T[][] { +export function weird_slices(arr: T[]): T[][] { console.log(arr.map(item => [...arr.filter(t => t != item), item])); return arr.map(item => [...arr.filter(t => t != item), item]); } -const MultiWheel = ({ +export const MultiWheel = ({ items, calc_width, shl, diff --git a/html/random-tag-of-the-day.tsx b/html/random-tag-of-the-day.tsx new file mode 100644 index 0000000..da9854a --- /dev/null +++ b/html/random-tag-of-the-day.tsx @@ -0,0 +1,74 @@ +import { ComponentChildren, toChildArray } from "preact"; +import { Main, render_and_copy, shuffle, n_of } from "./common.tsx"; + +const Tag = ({ tag }: { tag: string }) => ( + {`#${tag}`} +); + +const tags = `\ +CSS Crimes +borgesposting +NEISVoid +circling the square +retrocomputing +cats of cohost +coho film club +cohost crafts +the cohost plural feed +cohost summer mixtape +trans trucks +The Cohost Local Feed (Minnesota) +cohost draws +tv head +make up a mech pilot +frasierposting +cohost utilities`.split("\n"); + +// repeating makes it seem more random +export const PseudoRandom = ({ + children, + repeat = 5, +}: { + children: ComponentChildren; + repeat?: number; +}) => ( +
+ {...n_of(repeat, toChildArray(children)) + .map(shuffle) + .flat() + .map(child => {child})} +
+); + +/// width is 0-1 +export const Choice = ({ children }: { children: ComponentChildren }) => ( +
+ +
{children}
+
+); + +render_and_copy( +
+ Click for a random @TagOfTheDay tag + {...tags.map(tag => )} +
+);