Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UI #76

Merged
merged 5 commits into from
Oct 11, 2023
Merged

UI #76

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@ Or simply, due to the recursive functionality of STRX, that requires the ability
// ./src/test/ownership.test.ts
const orderOfTopics: string[] = [];
let finalRun = true;
const axium = createAxium(['ownershipTest', createOwnershipConcept(), createCounterConcept(), createExperimentConcept()], true, true);
const axium = createAxium('ownershipTest', [
createOwnershipConcept(),
createCounterConcept(),
createExperimentConcept(createExperimentActionQueState(), [checkInQuality], [experimentActionQuePrinciple])
], true, true);
const staged = axium.stage(
'Testing Ownership Staging', [
(cpts, dispatch) => {
Expand Down Expand Up @@ -68,7 +72,7 @@ const staged = axium.stage(
console.log('Stage 3', ownership.ownershipLedger, ownership.pendingActions);
const counter = selectState<Counter>(cpts, counterName);
console.log('Count: ', counter.count);
dispatch(strategyBegin(primedCountingStrategy(cpts)), {
dispatch(strategyBegin(experimentPrimedCountingStrategy(cpts)), {
iterateStep: true
});
},
Expand All @@ -80,20 +84,20 @@ const staged = axium.stage(
finalRun = false;
// This will be the final test to be triggered by a log action.
console.log('Stage 3, If #3 | Count: ', counter.count, orderOfTopics);
expect(orderOfTopics[0]).toBe(countingTopic);
expect(orderOfTopics[0]).toBe(experimentCountingTopic);
expect(counter.count).toBe(3);
// Comment in if testing the halting ability of log and setCount stage is commented out.
// setTimeout(() => {done();}, 1000);
staged.close();
} else if (
(axiumState.lastStrategy === countingTopic ||
axiumState.lastStrategy === primedCountingTopic) &&
(axiumState.lastStrategy === experimentCountingTopic ||
axiumState.lastStrategy === experimentPrimedCountingTopic) &&
orderOfTopics.length === 0) {
console.log('Stage 3, If #1 | Count: ', counter.count);
orderOfTopics.push(axiumState.lastStrategy);
} else if (
(axiumState.lastStrategy === countingTopic ||
axiumState.lastStrategy === primedCountingTopic) &&
(axiumState.lastStrategy === experimentCountingTopic ||
axiumState.lastStrategy === experimentPrimedCountingTopic) &&
orderOfTopics.length === 1) {
if (orderOfTopics[0] !== axiumState.lastStrategy) {
console.log('Stage 3, If #2 | Count: ', counter.count);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@phuire/strx",
"version": "0.0.22",
"version": "0.0.23",
"description": "Unified Turing Machine",
"main": "dist/index.js",
"module": "dist/index.mjs",
Expand Down
4 changes: 2 additions & 2 deletions src/concepts/axium/axium.concept.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BehaviorSubject, Subject, Subscriber } from 'rxjs';
import { Concept, ConceptCreator } from '../../model/concept';
import { Subject, Subscriber } from 'rxjs';
import { Concept } from '../../model/concept';
import { Action } from '../../model/action';
import { axiumPrinciple } from './axium.principle';
import { blockingMode, permissiveMode } from './axium.mode';
Expand Down
4 changes: 2 additions & 2 deletions src/concepts/chain/chain.concept.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Action } from '../../index';
import { ConceptCreator, createConcept } from '../../model/concept';
import { createConcept } from '../../model/concept';
import { chainPrinciple } from './chain.principle';
import { prepareChainQuality } from './qualities/prepareChain.quality';

Expand All @@ -13,7 +13,7 @@ const initialChainState: Chain = {
actionQue: [],
};

export const createChainConcept: ConceptCreator = () => {
export const createChainConcept = () => {
return createConcept(
chainName,
initialChainState,
Expand Down
4 changes: 2 additions & 2 deletions src/concepts/counter/counter.concept.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { addQuality } from './qualities/add.quality';
import { subtractQuality } from './qualities/subtract.quality';
import { setCountQuality } from './qualities/setCount.quality';
import { ConceptCreator, createConcept } from '../../model/concept';
import { createConcept } from '../../model/concept';
export { countingStrategy, primedCountingStrategy } from './strategies/counting.strategy';

export type Counter = {
Expand All @@ -14,7 +14,7 @@ const initialCounterState: Counter = {
count: 0
};

export const createCounterConcept: ConceptCreator = () => {
export const createCounterConcept = () => {
return createConcept(
counterName,
initialCounterState,
Expand Down
27 changes: 13 additions & 14 deletions src/concepts/experiment/experiment.concept.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
import { ConceptCreator, createConcept } from '../../model/concept';
import { Mode, Quality, createConcept } from '../../model/concept';
import { Action } from '../../model/action';
import { checkInQuality } from './qualities/checkIn.quality';
import { experimentPrinciple } from './experiment.principle';
import { PrincipleFunction } from '../../model/principle';

export type ExperimentState = {
export type ExperimentActionQueState = {
actionQue: Action[],
}

export const experimentName = 'experiment';

const createExperimentState = (): ExperimentState => {
export const createExperimentActionQueState = (): ExperimentActionQueState => {
return {
actionQue: [],
};
};

export const createExperimentConcept: ConceptCreator = () => {
export const createExperimentConcept = (
state: any,
qualities?: Quality[],
principles?: PrincipleFunction[],
mode?: Mode[]) => {
return createConcept(
experimentName,
createExperimentState(),
[
checkInQuality
],
[
experimentPrinciple
],
[]
state,
qualities,
principles,
mode
);
};
6 changes: 3 additions & 3 deletions src/concepts/experiment/experiment.principle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { Concept } from '../../model/concept';
import { UnifiedSubject } from '../../model/unifiedSubject';
import { selectState } from '../../model/selector';
import { AxiumState, axiumName } from '../axium/axium.concept';
import { ExperimentState, experimentName } from './experiment.concept';
import { ExperimentActionQueState, experimentName } from './experiment.concept';

export const experimentPrinciple: PrincipleFunction = (
export const experimentActionQuePrinciple: PrincipleFunction = (
observer: Subscriber<Action>,
_concepts: Concept[],
concepts$: UnifiedSubject
Expand All @@ -18,7 +18,7 @@ export const experimentPrinciple: PrincipleFunction = (
if (axiumState.open) {
const subscription = concepts$.subscribe(cpts => {
const concepts = cpts;
const experimentState = selectState<ExperimentState>(concepts, experimentName);
const experimentState = selectState<ExperimentActionQueState>(concepts, experimentName);
// console.log('Check que', experimentState.actionQue);
if (experimentState.actionQue.length > 0) {
if (!readyToGo) {
Expand Down
4 changes: 2 additions & 2 deletions src/concepts/experiment/qualities/checkIn.quality.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { defaultMethodCreator, defaultReducer } from '../../../model/concept';
import { Action, prepareActionCreator } from '../../../model/action';
import { createQuality } from '../../../model/concept';
import { ExperimentState } from '../experiment.concept';
import { strategySuccess } from '../../../model/actionStrategy';
import { axiumConcludeType } from '../../axium/qualities/conclude.quality';
import { ExperimentActionQueState } from '../experiment.concept';

export const experimentCheckInType = 'Experiment Check in Action';

export const experimentCheckIn = prepareActionCreator(experimentCheckInType);

export function checkInReducer(state: ExperimentState, action: Action): ExperimentState {
export function checkInReducer(state: ExperimentActionQueState, action: Action): ExperimentActionQueState {
if (action.strategy) {
// console.log('Check in reducer', action);
const nextAction = strategySuccess(action.strategy);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import { counterSelectCount } from '../../counter/counter.selector';
import { ownershipBackTrackType } from '../../ownership/qualities/backTrack.quality';
import { ownershipName } from '../../ownership/ownership.concept';

export const countingTopic = 'Counting Strategy';
export function countingStrategy(): ActionStrategy {
export const experimentCountingTopic = 'Counting Strategy';
export function experimentCountingStrategy(): ActionStrategy {
const backTrack: ActionNode = {
actionType: ownershipBackTrackType,
successNode: null,
Expand Down Expand Up @@ -72,15 +72,15 @@ export function countingStrategy(): ActionStrategy {
};

const params: ActionStrategyParameters = {
topic: countingTopic,
topic: experimentCountingTopic,
initialNode: stepOne,
};

return createStrategy(params);
}

export const primedCountingTopic = 'Counting Strategy with Primed Actions';
export function primedCountingStrategy(concepts: Concept[]): ActionStrategy {
export const experimentPrimedCountingTopic = 'Counting Strategy with Primed Actions';
export function experimentPrimedCountingStrategy(concepts: Concept[]): ActionStrategy {
const addSemaphore = getSemaphore(concepts, counterName, counterAddType);
const subtractSemaphore = getSemaphore(concepts, counterName, counterSubtractType);
const backTrackSemaphore = getSemaphore(concepts, ownershipName, ownershipBackTrackType);
Expand Down Expand Up @@ -140,7 +140,7 @@ export function primedCountingStrategy(concepts: Concept[]): ActionStrategy {
};

const params: ActionStrategyParameters = {
topic: primedCountingTopic,
topic: experimentPrimedCountingTopic,
initialNode: stepOne,
};

Expand Down
4 changes: 2 additions & 2 deletions src/concepts/experiment/strategies/puntCounting.strategy.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ActionNode, ActionStrategy, ActionStrategyParameters, createStrategy, puntStrategy } from '../../../model/actionStrategy';
import { counterSelectCount } from '../../counter/counter.selector';
import { experimentCheckInType } from '../qualities/checkIn.quality';
import { countingStrategy } from './experimentCounting.strategy';
import { experimentCountingStrategy } from './experimentCounting.strategy';

export const puntCountingStrategyTopic = 'This will Punt the Counting Strategy into the Experiment\'s Action Que';
export function puntCountingStrategy(): ActionStrategy {
Expand All @@ -17,5 +17,5 @@ export function puntCountingStrategy(): ActionStrategy {
initialNode: stepOne,
};

return puntStrategy(countingStrategy(), createStrategy(params));
return puntStrategy(experimentCountingStrategy(), createStrategy(params));
}
4 changes: 2 additions & 2 deletions src/concepts/ownership/ownership.concept.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ConceptCreator, createConcept } from '../../model/concept';
import { createConcept } from '../../model/concept';
import { Action } from '../../model/action';
import { ownershipMode } from './ownership.mode';
import { initializeOwnershipQuality } from './qualities/initializeOwnership.quality';
Expand Down Expand Up @@ -31,7 +31,7 @@ const createOwnershipState = (isResponsibleForMode?: boolean): OwnershipState =>
};
};

export const createOwnershipConcept: ConceptCreator = (isResponsibleForMode?: boolean) => {
export const createOwnershipConcept = (isResponsibleForMode?: boolean) => {
return createConcept(
ownershipName,
createOwnershipState(isResponsibleForMode ? isResponsibleForMode : true),
Expand Down
19 changes: 17 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ export type {
Method,
Principle,
Mode,
ConceptCreator,
MethodCreator
} from './model/concept';
export type { KeyedSelector } from './model/selector';
Expand Down Expand Up @@ -94,4 +93,20 @@ export {
export {
ownershipClearStrategyStubsFromLedgerAndSelfType
} from './concepts/ownership/qualities/clearStrategyStubsFromLedgerAndSelf.quality';
export { ownershipResetOwnershipLedgerType } from './concepts/ownership/qualities/resetOwnershipLedger.quality';
export { ownershipResetOwnershipLedgerType } from './concepts/ownership/qualities/resetOwnershipLedger.quality';

// Experiment
export {
ExperimentActionQueState,
createExperimentActionQueState,
createExperimentConcept,
experimentName
} from './concepts/experiment/experiment.concept';
export {checkInQuality, experimentCheckIn, experimentCheckInType} from './concepts/experiment/qualities/checkIn.quality';
export {
experimentCountingStrategy,
experimentCountingTopic,
experimentPrimedCountingStrategy,
experimentPrimedCountingTopic
} from './concepts/experiment/strategies/experimentCounting.strategy';
export {experimentActionQuePrinciple} from './concepts/experiment/experiment.principle';
15 changes: 2 additions & 13 deletions src/model/concept.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,29 +42,18 @@ export type Concept = {
meta?: Record<string,unknown>;
};

export type ConceptCreator = (
// eslint-disable-next-line @typescript-eslint/no-explicit-any
...args: any[]
// name?: string,
// state?: unknown,
// qualities?: Quality[],
// principles?: PrincipleFunction[],
// mode?: Mode[],
// meta?: Record<string,unknown>
) => Concept;

export function createConcept(
name: string,
state: unknown,
qualities: Quality[],
qualities?: Quality[],
principles?: PrincipleFunction[],
mode?: Mode[],
meta?: Record<string,unknown>
): Concept {
return {
name,
state,
qualities,
qualities: qualities ? qualities : [],
principles,
mode,
meta
Expand Down
33 changes: 22 additions & 11 deletions src/model/unifiedSubject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,22 @@ const handleRun =
: [StageDelimiter, boolean] => {
if (options?.on) {
if (selectSlice(value, options?.on.selector) === options?.on.expected) {
const runOnceMap = stageDelimiter.runOnceMap.get(action.type + plan.stage);
if (runOnceMap === undefined) {
stageDelimiter.runOnceMap.set(action.type + plan.stage, true);
return [
stageDelimiter, true
];
if (options.runOnce) {
const runOnceMap = stageDelimiter.runOnceMap.get(action.type + plan.stage);
if (runOnceMap === undefined) {
stageDelimiter.runOnceMap.set(action.type + plan.stage, true);
return [
stageDelimiter, true
];
} else {
stageDelimiter.runOnceMap.set(action.type + plan.stage, false);
return [
stageDelimiter, false
];
}
} else {
stageDelimiter.runOnceMap.set(action.type + plan.stage, false);
return [
stageDelimiter, false
stageDelimiter, true
];
}
} else {
Expand Down Expand Up @@ -99,7 +105,7 @@ const handleStageDelimiter =
} else if (stageDelimiter) {
stageDelimiter = {
stage: plan.stage,
prevActions: [...stageDelimiter.prevActions ,action.type],
prevActions: [...stageDelimiter.prevActions, action.type],
unionExpiration: [...stageDelimiter.unionExpiration, action.expiration],
runOnceMap: new Map()
};
Expand All @@ -126,9 +132,10 @@ export class UnifiedSubject extends Subject<Concept[]> {
}
stage(title: string, stages: Staging[]) {
this.currentStages.set(this.stageId, {title, stages, stage: 0, stageFailed: -1});
const stageId = this.stageId;
this.stageId++;
const close = () => {
this.currentStages.delete(this.stageId);
this.currentStages.delete(stageId);
};
return {
close: close.bind(this)
Expand Down Expand Up @@ -183,7 +190,11 @@ export class UnifiedSubject extends Subject<Concept[]> {
action$.next(action);
}
}
} else if (options?.runOnce === undefined) {
} else if (
options?.runOnce === undefined &&
(options.on === undefined ||
(options.on && (!options.debounce && (options.iterateStep === undefined || options.setStep === plan.stage)))
)) {
plan.stageFailed = plan.stage;
plan.stage = plan.stages.length;
const deleted = this.currentStages.delete(key);
Expand Down
Loading