dnd functionality works.

This commit is contained in:
Jordan
2024-02-29 09:11:13 -08:00
parent d9c1282d99
commit ee266ea372
13 changed files with 486 additions and 50 deletions

View File

@ -1,4 +1,4 @@
import { v4 as randomUUID } from "uuid";
import { v4 as randomUUID, v4 as uuidv4 } from "uuid";
import { Op } from "./operator";
import { atom, computed } from "nanostores";
@ -47,6 +47,14 @@ export type Operation = IdAble & {
export type PromptItem = Operation | Nugget
export function itemIsOperation(item: PromptItem): boolean {
return "op" in item;
}
export function itemIsNugget(item: PromptItem): boolean {
return !itemIsOperation(item);
}
export type Composition = Array<PromptItem>;
export const $library = atom<Library>([])
@ -103,6 +111,51 @@ export function changeOperationOp(operationId: Id, op: Op) {
]);
}
/**
* utility method to remove & return a prompt item by ID
* @param id PromptItem ID
*/
export function popPromptItem (id : Id) {
const found = $composition.get().find(item => item.id === id);
$composition.set($composition.get().filter(item => item.id !== id));
return found;
}
export function lassoNuggets (n1id : Id, n2id : Id, op : Op) {
const n1 = popPromptItem(n1id);
const n2 = popPromptItem(n2id);
$composition.set([...$composition.get(), {
id: uuidv4(),
op,
items: [n1, n2],
} as Operation])
}
export function addToOperation(nId : Id, opId : Id) {
const comp = $composition.get();
const nugget = comp.find(i => i.id === nId);
$composition.set($composition.get().map(i => {
if (![nId, opId].includes(i.id)) {
return i;
}
// if this is the nugget...
if (i.id === nId) {
return null;
}
// if this is the operation...
if (i.id == opId && "op" in i) {
return {
...i,
items: [
...i.items, nugget
]
}
}
return i;
}).filter(i => i != null) as Composition);
}
export function nuggetToText(nugget: Nugget) {
const absScore = Math.abs(nugget.score);
const neg = nugget.score < 0;