export const findIndex = (self: X): O.Option<number> =>
ROA.findFirstIndex(Xs, Equal.equals(self));
export const isFormY = (
a: X,
b: X,
c: X,
): O.Option<boolean> => {
const modularQuotient = (n: number) => Math.floor(mod(n + 1, 12) / 3);
return O.Do().pipe(
O.bind('indexA', () => findIndex(a)),
O.bind('indexB', () => findIndex(b)),
O.bind('indexC', () => findIndex(c)),
O.map(
({ indexA, indexB, indexC }) =>
modularQuotient(indexA) === modularQuotient(indexB) &&
modularQuotient(indexB) === modularQuotient(indexC),
),
);
};
export const findIndex = (self: X): O.Option<number> =>
ROA.findFirstIndex(Xs, Equal.equals(self));
export const isFormY = (
a: X,
b: X,
c: X,
): O.Option<boolean> => {
const modularQuotient = (n: number) => Math.floor(mod(n + 1, 12) / 3);
return O.Do().pipe(
O.bind('indexA', () => findIndex(a)),
O.bind('indexB', () => findIndex(b)),
O.bind('indexC', () => findIndex(c)),
O.map(
({ indexA, indexB, indexC }) =>
modularQuotient(indexA) === modularQuotient(indexB) &&
modularQuotient(indexB) === modularQuotient(indexC),
),
);
};