diff --git a/TODO.md b/TODO.md index a436ee8..2007f03 100644 --- a/TODO.md +++ b/TODO.md @@ -1,10 +1,8 @@ -`barometer-belief.test` -- 在测试中增加书中的叙述 -- 与对 belief-system 的测试相同 - # 4.3 Dependencies Explain Contradictions > https://github.com/cicada-lang/propagator/issues/9 -修复对 `MergeConflict` 的使用 -- 如何处理原实现中的 `call/cc`? +implementation `MergeConflict` without `call/cc` # 4.4 Dependencies Improve Search @@ -37,6 +35,8 @@ # later +[later] `barometer-belief.test` -- 在测试中增加书中的叙述 -- 与对 belief-system 的测试相同 + [later] barometer-belief-system.test.ts -- 理解我们的测试中与书中有差异的地方 - 书中第一个测试只有: diff --git a/src/belief-system/assimilateBeliefSystem.ts b/src/belief-system/assimilateBeliefSystem.ts index a913144..8d91c72 100644 --- a/src/belief-system/assimilateBeliefSystem.ts +++ b/src/belief-system/assimilateBeliefSystem.ts @@ -1,4 +1,3 @@ -import { type Nothing, isNothing } from "../nothing/Nothing.js" import { assimilateBelief } from "./assimilateBelief.js" import type { BeliefSystem } from "./BeliefSystem.js" @@ -8,12 +7,8 @@ import type { BeliefSystem } from "./BeliefSystem.js" export function assimilateBeliefSystem( base: BeliefSystem, - target: BeliefSystem | Nothing, + target: BeliefSystem, ): BeliefSystem { - if (isNothing(target)) { - return base - } - return target.beliefs.reduce>( (result, belief) => assimilateBelief(result, belief), base, diff --git a/src/belief-system/checkConsistent.ts b/src/belief-system/checkConsistent.ts index fd34f36..8bbb2b1 100644 --- a/src/belief-system/checkConsistent.ts +++ b/src/belief-system/checkConsistent.ts @@ -1,17 +1,15 @@ import { detectMergeConflict } from "../merge-conflict/detectMergeConflict.js" -import { isRunning } from "../scheduler/run.js" + import { clearScheduledPropagators } from "../scheduler/schedule.js" import { log } from "../utils/log.js" export function checkConsistent(value: any): void { + return + if (detectMergeConflict(value)) { const who = "checkConsistent" const message = "Inconsistent value" log({ who, message, value }) clearScheduledPropagators() - - if (isRunning) { - throw new Error(`[${who}] ${message}`) - } } } diff --git a/src/belief/beliefMerge.ts b/src/belief/beliefMerge.ts index 6568c7e..afbccfa 100644 --- a/src/belief/beliefMerge.ts +++ b/src/belief/beliefMerge.ts @@ -1,4 +1,3 @@ -import type { MergeConflict } from "../merge-conflict/index.js" import { merge } from "../merge/index.js" import { setIsSubsetOf, setUnion } from "../utils/set/index.js" import { Belief } from "./Belief.js" @@ -24,7 +23,7 @@ import { Belief } from "./Belief.js" export function beliefMerge( content: Belief, increment: Belief, -): Belief | MergeConflict { +): Belief { const mergedValue = merge(content.value, increment.value) // 下面刚好是偏序关系中比较两个元素的四种可能: @@ -45,6 +44,10 @@ export function beliefMerge( } } + // if (isMergeConflict(mergedValue)) { + // console.log({ who: "beliefMerge", increment, content }) + // } + if (mergedValue === increment.value) { return increment } diff --git a/src/cell/put.ts b/src/cell/put.ts index 5a1b188..e560dfa 100644 --- a/src/cell/put.ts +++ b/src/cell/put.ts @@ -3,15 +3,11 @@ import { schedule } from "../scheduler/index.js" import { type Cell } from "./Cell.js" export function put(cell: Cell, increment?: any): void { - try { - const newContent = merge(cell.content, increment) - if (newContent === cell.content) { - return - } - - cell.content = newContent - schedule(cell.propagators) - } catch (error) { - console.error({ who: "put", error }) + const newContent = merge(cell.content, increment) + if (newContent === cell.content) { + return } + + cell.content = newContent + schedule(cell.propagators) } diff --git a/src/examples/barometer-belief-system.test.ts b/src/examples/barometer-belief-system.test.ts index d114167..135531c 100644 --- a/src/examples/barometer-belief-system.test.ts +++ b/src/examples/barometer-belief-system.test.ts @@ -417,6 +417,14 @@ test("examples / barometer-belief-system", async () => { await run() + log(beliefSystemQuery(buildingHeight.content)) log(buildingHeight.content) + log(beliefSystemQuery(barometerHeight.content)) + + // kickOut("pressure") + + // await run() + + // log(beliefSystemQuery(barometerHeight.content)) // log(beliefSystemQuery(buildingHeight.content)) }) diff --git a/src/monad/index.ts b/src/monad/index.ts index 982aedf..4c1fed3 100644 --- a/src/monad/index.ts +++ b/src/monad/index.ts @@ -1,4 +1,5 @@ export * from "./belief-monad.js" export * from "./belief-system-monad.js" +export * from "./merge-conflict-monad.js" export * from "./monad.js" export * from "./nothing-monad.js" diff --git a/src/monad/merge-conflict-monad.ts b/src/monad/merge-conflict-monad.ts new file mode 100644 index 0000000..3f43cef --- /dev/null +++ b/src/monad/merge-conflict-monad.ts @@ -0,0 +1,9 @@ +import { defineHandler } from "../generic/index.js" +import { isMergeConflict } from "../merge-conflict/index.js" +import { nothing } from "../nothing/index.js" +import { isFunction } from "../utils/isFunction.js" +import { flatten, fmap } from "./monad.js" + +defineHandler(fmap, [isFunction, isMergeConflict], (f, ma) => nothing) + +defineHandler(flatten, [isMergeConflict], (mma) => nothing) diff --git a/src/scheduler/run.ts b/src/scheduler/run.ts index 6a24125..94a6a6a 100644 --- a/src/scheduler/run.ts +++ b/src/scheduler/run.ts @@ -1,17 +1,10 @@ import type { Job } from "./Scheduler.js" import { globalScheduler } from "./initializeScheduler.js" -export let isRunning = false export async function run(): Promise { - try { - isRunning = true - while (globalScheduler.jobs.length > 0) { - // 我们用「先进先出」的方式来处理 job 的 queue。 - const job = globalScheduler.jobs.shift() as Job - await job.propagator() - } - isRunning = false - } catch (error) { - console.error({ who: "run", error }) + while (globalScheduler.jobs.length > 0) { + // 我们用「先进先出」的方式来处理 job 的 queue。 + const job = globalScheduler.jobs.shift() as Job + await job.propagator() } }