From 28535c887ab3bd4c0df5c7c7a81b08c9816ccbb7 Mon Sep 17 00:00:00 2001 From: REllEK-IO Date: Wed, 11 Oct 2023 07:00:40 -0700 Subject: [PATCH 1/5] Improved stage on functionality and stage.close() --- src/concepts/axium/axium.concept.ts | 4 +- src/concepts/chain/chain.concept.ts | 4 +- src/concepts/counter/counter.concept.ts | 4 +- src/concepts/experiment/experiment.concept.ts | 27 +++++----- .../experiment/experiment.principle.ts | 6 +-- .../experiment/qualities/checkIn.quality.ts | 4 +- src/concepts/ownership/ownership.concept.ts | 4 +- src/index.ts | 1 - src/model/concept.ts | 15 +----- src/model/unifiedSubject.ts | 33 ++++++++---- src/test/ownership.test.ts | 16 ++++-- src/test/stagedPrinciple.test.ts | 53 +++++++++++++++++++ 12 files changed, 115 insertions(+), 56 deletions(-) create mode 100644 src/test/stagedPrinciple.test.ts diff --git a/src/concepts/axium/axium.concept.ts b/src/concepts/axium/axium.concept.ts index 96b1eaa..5548f00 100644 --- a/src/concepts/axium/axium.concept.ts +++ b/src/concepts/axium/axium.concept.ts @@ -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'; diff --git a/src/concepts/chain/chain.concept.ts b/src/concepts/chain/chain.concept.ts index c01ec50..ea9ea0c 100644 --- a/src/concepts/chain/chain.concept.ts +++ b/src/concepts/chain/chain.concept.ts @@ -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'; @@ -13,7 +13,7 @@ const initialChainState: Chain = { actionQue: [], }; -export const createChainConcept: ConceptCreator = () => { +export const createChainConcept = () => { return createConcept( chainName, initialChainState, diff --git a/src/concepts/counter/counter.concept.ts b/src/concepts/counter/counter.concept.ts index edc8076..f3b5a39 100644 --- a/src/concepts/counter/counter.concept.ts +++ b/src/concepts/counter/counter.concept.ts @@ -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 = { @@ -14,7 +14,7 @@ const initialCounterState: Counter = { count: 0 }; -export const createCounterConcept: ConceptCreator = () => { +export const createCounterConcept = () => { return createConcept( counterName, initialCounterState, diff --git a/src/concepts/experiment/experiment.concept.ts b/src/concepts/experiment/experiment.concept.ts index 058bdf4..4902f21 100644 --- a/src/concepts/experiment/experiment.concept.ts +++ b/src/concepts/experiment/experiment.concept.ts @@ -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 ); }; \ No newline at end of file diff --git a/src/concepts/experiment/experiment.principle.ts b/src/concepts/experiment/experiment.principle.ts index a9867c7..5cc94c3 100644 --- a/src/concepts/experiment/experiment.principle.ts +++ b/src/concepts/experiment/experiment.principle.ts @@ -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, _concepts: Concept[], concepts$: UnifiedSubject @@ -18,7 +18,7 @@ export const experimentPrinciple: PrincipleFunction = ( if (axiumState.open) { const subscription = concepts$.subscribe(cpts => { const concepts = cpts; - const experimentState = selectState(concepts, experimentName); + const experimentState = selectState(concepts, experimentName); // console.log('Check que', experimentState.actionQue); if (experimentState.actionQue.length > 0) { if (!readyToGo) { diff --git a/src/concepts/experiment/qualities/checkIn.quality.ts b/src/concepts/experiment/qualities/checkIn.quality.ts index 3243dd1..1c1926b 100644 --- a/src/concepts/experiment/qualities/checkIn.quality.ts +++ b/src/concepts/experiment/qualities/checkIn.quality.ts @@ -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); diff --git a/src/concepts/ownership/ownership.concept.ts b/src/concepts/ownership/ownership.concept.ts index ccfe96a..39a3de1 100644 --- a/src/concepts/ownership/ownership.concept.ts +++ b/src/concepts/ownership/ownership.concept.ts @@ -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'; @@ -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), diff --git a/src/index.ts b/src/index.ts index ea8b8a1..901659c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,7 +22,6 @@ export type { Method, Principle, Mode, - ConceptCreator, MethodCreator } from './model/concept'; export type { KeyedSelector } from './model/selector'; diff --git a/src/model/concept.ts b/src/model/concept.ts index 5fcebcf..2ba44e5 100644 --- a/src/model/concept.ts +++ b/src/model/concept.ts @@ -42,21 +42,10 @@ export type Concept = { meta?: Record; }; -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 -) => Concept; - export function createConcept( name: string, state: unknown, - qualities: Quality[], + qualities?: Quality[], principles?: PrincipleFunction[], mode?: Mode[], meta?: Record @@ -64,7 +53,7 @@ export function createConcept( return { name, state, - qualities, + qualities: qualities ? qualities : [], principles, mode, meta diff --git a/src/model/unifiedSubject.ts b/src/model/unifiedSubject.ts index e99fa6a..8ad01f7 100644 --- a/src/model/unifiedSubject.ts +++ b/src/model/unifiedSubject.ts @@ -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 { @@ -126,9 +132,10 @@ export class UnifiedSubject extends Subject { } 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) @@ -147,6 +154,7 @@ export class UnifiedSubject extends Subject { let run = true; [stageDelimiter, goodAction] = handleStageDelimiter(plan, action, stageDelimiter, options); [stageDelimiter, run] = handleRun(value, stageDelimiter, plan, action, options); + console.log('HIT2', stageDelimiter, run, goodAction); this.stageDelimiters.set(key, stageDelimiter); if (goodAction && run) { const action$ = axiumState.action$ as Subject; @@ -183,11 +191,16 @@ export class UnifiedSubject extends Subject { 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); if (deleted) { + console.log('DELETED', deleted); axiumState.badPlans.push(plan); } } diff --git a/src/test/ownership.test.ts b/src/test/ownership.test.ts index 1761514..dd0b781 100644 --- a/src/test/ownership.test.ts +++ b/src/test/ownership.test.ts @@ -1,21 +1,27 @@ import { createAxium } from '../model/axium'; import { Concept } from '../model/concept'; -import { selectState } from '../model/selector'; +import { createPayload, selectState } from '../model/selector'; import { OwnershipState, createOwnershipConcept, ownershipName } from '../concepts/ownership/ownership.concept'; import { AxiumState } from '../concepts/axium/axium.concept'; import { setOwnerShipModeTopic } from '../concepts/ownership/strategies/setOwnerShipMode.strategy'; import { Counter, counterName, createCounterConcept } from '../concepts/counter/counter.concept'; -import { createExperimentConcept } from '../concepts/experiment/experiment.concept'; +import { createExperimentActionQueState, createExperimentConcept } from '../concepts/experiment/experiment.concept'; import { puntCountingStrategy } from '../concepts/experiment/strategies/puntCounting.strategy'; import { strategyBegin } from '../model/actionStrategy'; import { primedCountingStrategy, countingTopic, primedCountingTopic } from '../concepts/experiment/strategies/experimentCounting.strategy'; import { axiumLog } from '../concepts/axium/qualities/log.quality'; -import { counterSetCount } from '../concepts/counter/qualities/setCount.quality'; +import { SetCountPayload, counterSetCount } from '../concepts/counter/qualities/setCount.quality'; +import { checkInQuality } from '../concepts/experiment/qualities/checkIn.quality'; +import { experimentActionQuePrinciple } from '../concepts/experiment/experiment.principle'; test('Ownership Test', (done) => { 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) => { @@ -37,7 +43,7 @@ test('Ownership Test', (done) => { // Will be ran after both counting strategies conclude. const ownership = selectState(cpts, ownershipName); console.log('Stage 2', ownership.ownershipLedger, ownership.pendingActions); - dispatch(counterSetCount({newCount: 1000}, undefined, 7000), { iterateStep: true}); + dispatch(counterSetCount(createPayload({newCount: 1000}), undefined, 7000), { iterateStep: true}); }, (cpts, dispatch) => { const ownership = selectState(cpts, ownershipName); diff --git a/src/test/stagedPrinciple.test.ts b/src/test/stagedPrinciple.test.ts new file mode 100644 index 0000000..07a799c --- /dev/null +++ b/src/test/stagedPrinciple.test.ts @@ -0,0 +1,53 @@ +import { createAxium } from '../model/axium'; +import { selectState } from '../model/selector'; +import { createExperimentConcept, experimentName } from '../concepts/experiment/experiment.concept'; +import { PrincipleFunction } from '../model/principle'; +import { Action, ActionType, prepareActionCreator } from '../model/action'; +import { Subscriber } from 'rxjs'; +import { Concept, createQuality } from '../model/concept'; +import { UnifiedSubject } from '../model/unifiedSubject'; +import { axiumSelectOpen } from '../concepts/axium/axium.selector'; + +type ExperimentState = { + mock: boolean; +}; + +const createExperimentState = (): ExperimentState => ({ mock: false }); + +const experimentMockToTrueType: ActionType = 'Experiment set mock to True'; +const experimentMockToTrue = prepareActionCreator(experimentMockToTrueType); +function experimentMockToTrueReducer(state: ExperimentState, action: Action): ExperimentState { + return { + ...state, + mock: true + }; +} +const experimentMockToTrueQuality = createQuality(experimentMockToTrueType, experimentMockToTrueReducer); + +test('Axium Principle Stage', (done) => { + const experimentPrinciple: PrincipleFunction = (_: Subscriber, __: Concept[], concept$: UnifiedSubject) => { + const stage = concept$.stage('Experiment Principle', [ + (___, dispatch) => { + dispatch(experimentMockToTrue(), { + iterateStep: true, + on: { + selector: axiumSelectOpen, + expected: true + }, + debounce: 0 + }); + }, + (concepts) => { + const experimentState = selectState(concepts, experimentName); + if (experimentState.mock) { + expect(experimentState.mock).toBe(true); + setTimeout(() => done(), 1000); + stage.close(); + } + } + ]); + }; + createAxium('axiumStrategyTest', [ + createExperimentConcept(createExperimentState(), [experimentMockToTrueQuality], [experimentPrinciple]) + ], true, true); +}); From 6d370cd28919da9ff396c15f9d8642ab47810cb3 Mon Sep 17 00:00:00 2001 From: REllEK-IO Date: Wed, 11 Oct 2023 07:32:06 -0700 Subject: [PATCH 2/5] Clean Up and Refinement --- src/model/unifiedSubject.ts | 4 +--- src/test/stageDisptachOptions.test.ts | 7 ++++--- src/test/stagedPrinciple.test.ts | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/model/unifiedSubject.ts b/src/model/unifiedSubject.ts index 8ad01f7..57749ea 100644 --- a/src/model/unifiedSubject.ts +++ b/src/model/unifiedSubject.ts @@ -105,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() }; @@ -154,7 +154,6 @@ export class UnifiedSubject extends Subject { let run = true; [stageDelimiter, goodAction] = handleStageDelimiter(plan, action, stageDelimiter, options); [stageDelimiter, run] = handleRun(value, stageDelimiter, plan, action, options); - console.log('HIT2', stageDelimiter, run, goodAction); this.stageDelimiters.set(key, stageDelimiter); if (goodAction && run) { const action$ = axiumState.action$ as Subject; @@ -200,7 +199,6 @@ export class UnifiedSubject extends Subject { plan.stage = plan.stages.length; const deleted = this.currentStages.delete(key); if (deleted) { - console.log('DELETED', deleted); axiumState.badPlans.push(plan); } } diff --git a/src/test/stageDisptachOptions.test.ts b/src/test/stageDisptachOptions.test.ts index 30c7f16..a0dfc78 100644 --- a/src/test/stageDisptachOptions.test.ts +++ b/src/test/stageDisptachOptions.test.ts @@ -9,16 +9,17 @@ import { counterSelectCount } from '../concepts/counter/counter.selector'; test('Axium Stage Dispatch Options Test', (done) => { let runCount = 0; const axium = createAxium('axiumStageDispatchOptionsTest', [createCounterConcept()], true); - axium.subscribe((concepts) => { + const sub = axium.subscribe((concepts) => { const axiumState = concepts[0].state as AxiumState; if (axiumState.badPlans.length > 0) { const badPlan = axiumState.badPlans[0]; const counter = selectState(concepts, counterName); console.log('Stage Ran Away, badPlans.length: ', axiumState.badPlans.length, 'Count: ', counter.count); + staged.close(); + sub.unsubscribe(); expect(badPlan.stageFailed).toBe(2); expect(counter.count).toBe(2); setTimeout(() => {done();}, 500); - staged.close(); } }); const staged = axium.stage('Stage DispatchOptions Test', @@ -50,7 +51,7 @@ test('Axium Stage Dispatch Options Test', (done) => { }, (concepts, dispatch) => { runCount++; const counter = selectState(concepts, counterName); - console.log('Stage 3 ', counter, runCount); + console.log('Should run twice, Stage 3 ', counter, runCount); // Will cause an action overflow forcing the stage to close and add itself to bad Stages dispatch(counterSubtract(), { // Enabling will cause this test to timeout via the subscription watching for badPlans to never be ran. diff --git a/src/test/stagedPrinciple.test.ts b/src/test/stagedPrinciple.test.ts index 07a799c..dfb3ad8 100644 --- a/src/test/stagedPrinciple.test.ts +++ b/src/test/stagedPrinciple.test.ts @@ -34,7 +34,7 @@ test('Axium Principle Stage', (done) => { selector: axiumSelectOpen, expected: true }, - debounce: 0 + debounce: 1 }); }, (concepts) => { From 0f302878b66b61f60631578bae8150b314206492 Mon Sep 17 00:00:00 2001 From: REllEK-IO Date: Wed, 11 Oct 2023 07:33:26 -0700 Subject: [PATCH 3/5] Version Bump 0.0.23 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9aed3fe..762df8e 100644 --- a/package.json +++ b/package.json @@ -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", From a0290d64b0c466c3b38bfeb6590238e59577f4d5 Mon Sep 17 00:00:00 2001 From: REllEK-IO Date: Wed, 11 Oct 2023 07:42:21 -0700 Subject: [PATCH 4/5] Allow import for experiment concept --- README.md | 6 +++++- .../strategies/experimentCounting.strategy.ts | 12 ++++++------ .../strategies/puntCounting.strategy.ts | 4 ++-- src/index.ts | 18 +++++++++++++++++- src/test/ownership.test.ts | 18 +++++++++++------- 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index fb6c5de..5fbaabc 100644 --- a/README.md +++ b/README.md @@ -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) => { diff --git a/src/concepts/experiment/strategies/experimentCounting.strategy.ts b/src/concepts/experiment/strategies/experimentCounting.strategy.ts index 03b4802..589a5b6 100644 --- a/src/concepts/experiment/strategies/experimentCounting.strategy.ts +++ b/src/concepts/experiment/strategies/experimentCounting.strategy.ts @@ -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, @@ -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); @@ -140,7 +140,7 @@ export function primedCountingStrategy(concepts: Concept[]): ActionStrategy { }; const params: ActionStrategyParameters = { - topic: primedCountingTopic, + topic: experimentPrimedCountingTopic, initialNode: stepOne, }; diff --git a/src/concepts/experiment/strategies/puntCounting.strategy.ts b/src/concepts/experiment/strategies/puntCounting.strategy.ts index 8315f09..a66aeb9 100644 --- a/src/concepts/experiment/strategies/puntCounting.strategy.ts +++ b/src/concepts/experiment/strategies/puntCounting.strategy.ts @@ -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 { @@ -17,5 +17,5 @@ export function puntCountingStrategy(): ActionStrategy { initialNode: stepOne, }; - return puntStrategy(countingStrategy(), createStrategy(params)); + return puntStrategy(experimentCountingStrategy(), createStrategy(params)); } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 901659c..6bfa9e7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -93,4 +93,20 @@ export { export { ownershipClearStrategyStubsFromLedgerAndSelfType } from './concepts/ownership/qualities/clearStrategyStubsFromLedgerAndSelf.quality'; -export { ownershipResetOwnershipLedgerType } from './concepts/ownership/qualities/resetOwnershipLedger.quality'; \ No newline at end of file +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'; \ No newline at end of file diff --git a/src/test/ownership.test.ts b/src/test/ownership.test.ts index dd0b781..99a7350 100644 --- a/src/test/ownership.test.ts +++ b/src/test/ownership.test.ts @@ -8,7 +8,11 @@ import { Counter, counterName, createCounterConcept } from '../concepts/counter/ import { createExperimentActionQueState, createExperimentConcept } from '../concepts/experiment/experiment.concept'; import { puntCountingStrategy } from '../concepts/experiment/strategies/puntCounting.strategy'; import { strategyBegin } from '../model/actionStrategy'; -import { primedCountingStrategy, countingTopic, primedCountingTopic } from '../concepts/experiment/strategies/experimentCounting.strategy'; +import { + experimentPrimedCountingStrategy, + experimentCountingTopic, + experimentPrimedCountingTopic +} from '../concepts/experiment/strategies/experimentCounting.strategy'; import { axiumLog } from '../concepts/axium/qualities/log.quality'; import { SetCountPayload, counterSetCount } from '../concepts/counter/qualities/setCount.quality'; import { checkInQuality } from '../concepts/experiment/qualities/checkIn.quality'; @@ -50,7 +54,7 @@ test('Ownership Test', (done) => { console.log('Stage 3', ownership.ownershipLedger, ownership.pendingActions); const counter = selectState(cpts, counterName); console.log('Count: ', counter.count); - dispatch(strategyBegin(primedCountingStrategy(cpts)), { + dispatch(strategyBegin(experimentPrimedCountingStrategy(cpts)), { iterateStep: true }); }, @@ -62,20 +66,20 @@ test('Ownership Test', (done) => { 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); From 539f95e3b4c43b35f34a68154ca252cacd895fcf Mon Sep 17 00:00:00 2001 From: REllEK-IO Date: Wed, 11 Oct 2023 07:43:51 -0700 Subject: [PATCH 5/5] Allow import of Experiment Concept --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5fbaabc..6938882 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ const staged = axium.stage( console.log('Stage 3', ownership.ownershipLedger, ownership.pendingActions); const counter = selectState(cpts, counterName); console.log('Count: ', counter.count); - dispatch(strategyBegin(primedCountingStrategy(cpts)), { + dispatch(strategyBegin(experimentPrimedCountingStrategy(cpts)), { iterateStep: true }); }, @@ -84,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);