general: snapshot

This commit is contained in:
k
2024-07-03 20:40:35 +02:00
parent b7e8cbea20
commit 069311dcf3
24 changed files with 407 additions and 312 deletions

View File

@@ -4,11 +4,9 @@ export { averages } from "./consts/averages";
export function createScaleDatasets<Scale extends ResourceScale>({
scale,
setActiveResources,
groupedKeysToURLPath,
}: {
scale: Scale;
setActiveResources: Setter<Set<ResourceDataset<any, any>>>;
groupedKeysToURLPath: GroupedKeysToURLPath[Scale];
}) {
type Key = keyof typeof groupedKeysToURLPath;
@@ -23,7 +21,6 @@ export function createScaleDatasets<Scale extends ResourceScale>({
datasets[key as unknown as Exclude<Key, "ohlc">] = createResourceDataset({
scale,
path: groupedKeysToURLPath[key as Key] as any,
setActiveResources,
});
}
}
@@ -31,7 +28,6 @@ export function createScaleDatasets<Scale extends ResourceScale>({
const price = createResourceDataset<Scale, OHLC>({
scale,
path: `/${scale}-to-ohlc`,
setActiveResources,
});
Object.assign(datasets, { price });

View File

@@ -3,10 +3,8 @@ import { createResourceDataset } from "./resource";
export { averages } from "./consts/averages";
export function createDateDatasets({
setActiveResources,
groupedKeysToURLPath,
}: {
setActiveResources: Setter<Set<ResourceDataset<any, any>>>;
groupedKeysToURLPath: GroupedKeysToURLPath["date"];
}) {
type Key = keyof typeof groupedKeysToURLPath;
@@ -21,7 +19,6 @@ export function createDateDatasets({
datasets[key as Exclude<Key, "ohlc">] = createResourceDataset<"date">({
scale: "date",
path: groupedKeysToURLPath[key as Key],
setActiveResources,
});
}
}
@@ -29,7 +26,6 @@ export function createDateDatasets({
const price = createResourceDataset<"date", OHLC>({
scale: "date",
path: "/date-to-ohlc",
setActiveResources,
});
Object.assign(datasets, { price });

View File

@@ -1,10 +1,8 @@
import { createResourceDataset } from "./resource";
export function createHeightDatasets({
setActiveResources,
groupedKeysToURLPath,
}: {
setActiveResources: Setter<Set<ResourceDataset<any, any>>>;
groupedKeysToURLPath: GroupedKeysToURLPath["height"];
}) {
type Key = keyof typeof groupedKeysToURLPath;
@@ -19,7 +17,6 @@ export function createHeightDatasets({
datasets[key as Exclude<Key, "ohlc">] = createResourceDataset<"height">({
scale: "height",
path: groupedKeysToURLPath[key as Key],
setActiveResources,
});
}
}
@@ -27,7 +24,6 @@ export function createHeightDatasets({
const price = createResourceDataset<"height", OHLC>({
scale: "height",
path: "/height-to-ohlc",
setActiveResources,
});
Object.assign(datasets, { price });

View File

@@ -7,18 +7,12 @@ export const scales = ["date" as const, "height" as const];
export const HEIGHT_CHUNK_SIZE = 10_000;
export function createDatasets({
setActiveResources,
}: {
setActiveResources: Setter<Set<ResourceDataset<any, any>>>;
}) {
export function createDatasets() {
const date = createDateDatasets({
setActiveResources,
groupedKeysToURLPath: groupedKeysToURLPath.date,
});
const height = createHeightDatasets({
setActiveResources,
groupedKeysToURLPath: groupedKeysToURLPath.height,
});

View File

@@ -1,5 +1,3 @@
import { createLazyMemo } from "@solid-primitives/memo";
import {
ONE_DAY_IN_MS,
ONE_HOUR_IN_MS,
@@ -8,19 +6,12 @@ import {
import { createRWS } from "/src/solid/rws";
import { HEIGHT_CHUNK_SIZE } from ".";
import { debounce } from "../utils/debounce";
export function createResourceDataset<
Scale extends ResourceScale,
Type extends OHLC | number = number,
>({
scale,
path,
setActiveResources,
}: {
scale: Scale;
path: string;
setActiveResources: Setter<Set<ResourceDataset<any, any>>>;
}) {
>({ scale, path }: { scale: Scale; path: string }) {
type Dataset = Scale extends "date"
? FetchedDateDataset<Type>
: FetchedHeightDataset<Type>;
@@ -85,8 +76,7 @@ export function createResourceDataset<
}) as FetchedResult<Scale, Type>[];
const _fetch = async (id: number) => {
const index =
scale === "date" ? id - 2009 : Math.floor(id / HEIGHT_CHUNK_SIZE);
const index = chunkIdToIndex(scale, id);
if (
index < 0 ||
@@ -205,25 +195,43 @@ export function createResourceDataset<
fetched.loading = false;
};
const valuesCallback = (vecs: Value[][]) => {
let length = 0;
for (let i = 0; i < vecs.length; i++) {
length += vecs[i].length;
}
if (!length) return;
const array = new Array(length);
let k = 0;
for (let i = 0; i < vecs.length; i++) {
let vec = vecs[i];
for (let j = 0; j < vec.length; j++) {
array[k++] = vec[j];
}
}
if (k !== length) throw Error("e");
values.set(array);
};
const debouncedValuesCallback = debounce(valuesCallback, 100);
const values = createRWS<Value[]>([]);
createEffect(() => {
const vecs = fetchedJSONs.map((fetched) => fetched.vec() || []);
debouncedValuesCallback(vecs);
});
const resource: ResourceDataset<Scale, Type> = {
scale,
url: baseURL,
fetch: _fetch,
fetchedJSONs,
values: createLazyMemo(() => {
setActiveResources((resources) => resources.add(resource));
onCleanup(() =>
setActiveResources((resources) => {
resources.delete(resource);
return resources;
}),
);
const flat = fetchedJSONs.flatMap((fetched) => fetched.vec() || []);
return flat;
}),
values,
drop() {
fetchedJSONs.forEach((fetched) => {
fetched.at = null;
@@ -245,3 +253,7 @@ async function convertResponseToJSON<
return null;
}
}
function chunkIdToIndex(scale: ResourceScale, id: number) {
return scale === "date" ? id - 2009 : Math.floor(id / HEIGHT_CHUNK_SIZE);
}

View File

@@ -8,14 +8,6 @@ type ResourceScale = (typeof import("./index").scales)[index];
type DatasetValue<T> = T & Numbered & Valued;
interface Dataset<
Scale extends ResourceScale,
Value extends SingleValueData | CandlestickData = SingleValueData,
> {
scale: Scale;
values: Accessor<DatasetValue<Value>[]>;
}
interface ResourceDataset<
Scale extends ResourceScale,
Type extends OHLC | number = number,
@@ -27,16 +19,15 @@ interface ResourceDataset<
Value extends SingleValueData | CandlestickData = Type extends number
? SingleValueData
: CandlestickData,
> extends Dataset<Scale, Value> {
> {
scale: Scale;
url: string;
fetch: (id: number) => void;
fetchedJSONs: FetchedResult<Scale, Type>[];
values: Accessor<DatasetValue<Value>[]>;
drop: VoidFunction;
}
type AnyDataset<Scale extends ResourceScale> = Dataset<Scale> &
Partial<ResourceDataset<Scale>>;
interface FetchedResult<
Scale extends ResourceScale,
Type extends number | OHLC,