123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import * as React from "react";
- import {newVersionedModel} from "./versioned_model";
- import {TrivialParser} from "../parser/trivial_parser";
- import {Version} from "../onion/version";
- import {GraphState} from "../onion/graph_state";
- // Pure function
- // Replays all deltas in a version to compute the graph state of that version.
- function getGraphState(version: Version): GraphState {
- const graphState = new GraphState();
- for (const d of [...version].reverse()) {
- graphState.exec(d);
- }
- return graphState;
- }
- export function newCorrespondence({generateUUID, primitiveRegistry, cs, as}) {
- // const cs = newVersionedModel({readonly, generateUUID, primitiveRegistry});
- const {initialState, getReducer: getReducerOrig} = newVersionedModel({readonly: true, generateUUID, primitiveRegistry});
- const parser = new TrivialParser(primitiveRegistry, generateUUID);
- const corrMap: Map<Version,{csVersion:Version,asVersion:Version}> = new Map([
- [initialState.version, {csVersion: cs.initialState.version, asVersion: as.initialState.version}]
- ]);
- function getReducer([state, setState], csReducer, asReducer) {
- const {
- getReactComponents,
- callbacks: {
- gotoVersion: gotoVersionOrig,
- createAndGotoNewVersion,
- undo,
- redo,
- },
- } = getReducerOrig([state, setState]);
- const parse = (csDeltas, description: string) => {
- const [csGS, corrGS, asGS] = [csReducer.state.version, state.version, asReducer.state.version].map(v => getGraphState(v));
- const {corrDeltas, asDeltas} = parser.parse(csDeltas, csGS, corrGS, asGS);
- const csVersionPromise = new Promise<Version>(resolve => {
- csReducer.callbacks.createAndGotoNewVersion(csDeltas, description, resolve);
- });
- const corrVersionPromise = new Promise<Version>(resolve => {
- createAndGotoNewVersion(corrDeltas, description, resolve);
- });
- const asVersionPromise = new Promise<Version>(resolve => {
- if (asDeltas.length > 0) {
- asReducer.callbacks.createAndGotoNewVersion(asDeltas, "parse:"+description, resolve);
- } else {
- resolve(asReducer.state.version);
- }
- });
- // Remember which Corr version embeds which CS/AS versions:
- Promise.all([csVersionPromise, corrVersionPromise, asVersionPromise]).then(([csVersion, corrVersion, asVersion]) => {
- corrMap.set(corrVersion, {csVersion, asVersion});
- });
- };
- const render = (asDeltas, description: string) => {
- const [csGS, corrGS, asGS] = [csReducer.state.version, state.version, asReducer.state.version].map(v => getGraphState(v));
-
- const {corrDeltas, csDeltas} = parser.render(asDeltas, csGS, corrGS, asGS);
- const csVersionPromise = new Promise<Version>(resolve => {
- if (asDeltas.length > 0) {
- csReducer.callbacks.createAndGotoNewVersion(csDeltas, "render:"+description, resolve);
- } else {
- resolve(csReducer.state.version);
- }
- });
- const corrVersionPromise = new Promise<Version>(resolve => {
- createAndGotoNewVersion(corrDeltas, description, resolve);
- });
- const asVersionPromise = new Promise<Version>(resolve => {
- asReducer.callbacks.createAndGotoNewVersion(asDeltas, description, resolve);
- });
- // Remember which Corr version embeds which CS/AS versions:
- Promise.all([csVersionPromise, corrVersionPromise, asVersionPromise]).then(([csVersion, corrVersion, asVersion]) => {
- corrMap.set(corrVersion, {csVersion, asVersion});
- });
- };
- const gotoVersion = (corrVersion: Version) => {
- const {csVersion, asVersion} = corrMap.get(corrVersion)!;
- csReducer.callbacks.gotoVersion(csVersion);
- gotoVersionOrig(corrVersion);
- asReducer.callbacks.gotoVersion(asVersion);
- };
- return {
- state,
- getReactComponents,
- callbacks: {
- parse,
- render,
- gotoVersion,
- undo,
- redo,
- },
- };
- }
- return {
- initialState,
- getReducer,
- };
- }
|