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()
}
}