feat(base): 0.R4 - a queue keeps its own count, so every package verb takes only its own state; ludic migrate state --prune
ludic.base's Queue<T> carries a QueueTag (its name and pending count): queue_new(name), q_push(q, v), q_drain(q), q_clear(q) take no BaseState, and core_undrained(tags) names the given queues still holding facts. A reducer on a package's state can now call that package's verbs (wallet_earn(wallet_st, n)). ludic migrate state --prune (ludicc --migrate-prune) takes out each state parameter a function no longer uses, nor anything it calls, and the argument that fills it - including an argument for a parameter the callee has dropped, which is taken out before the call is checked, so a generic's T is told by the argument that says it. A reducer keeps its state. --dry-run now counts the edits it would make. Every package was moved with it: 608 base_st parameters and their arguments, 1889 edits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
8cf4b3fed6
commit
71735b10a2
151 changed files with 58668 additions and 54719 deletions
|
|
@ -59,7 +59,7 @@ program WeatherTest {
|
|||
}
|
||||
|
||||
# clear, rain and storm: clear always goes to rain, rain to storm, storm to clear
|
||||
function fresh(base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) -> void {
|
||||
function fresh(weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) -> void {
|
||||
weather_test_st.owns = true
|
||||
weather_test_st.hours = 12.0
|
||||
weather_test_st.bias = WEATHER_NO_BIAS
|
||||
|
|
@ -70,132 +70,132 @@ program WeatherTest {
|
|||
push(ks, kind("storm", true, true, odds3(1.0, 0.0, 0.0)))
|
||||
weather_kinds(weather_st, ks)
|
||||
weather_config_wind(weather_st, 0.5, 2.5, 10.0, 19.0)
|
||||
weather_reset(base_st, weather_st)
|
||||
weather_reset(weather_st)
|
||||
}
|
||||
|
||||
function facts(base_st: mut BaseState, weather_st: mut WeatherState) -> []WeatherFact { return q_drain(base_st, weather_facts(base_st, weather_st)) }
|
||||
function step(base_st: mut BaseState, weather_st: mut WeatherState, dt: float, gh: float, n: int) -> void { for i in 0 .. n { weather_run(base_st, weather_st, dt, gh) } }
|
||||
function facts(weather_st: mut WeatherState) -> []WeatherFact { return q_drain(weather_facts(weather_st)) }
|
||||
function step(weather_st: mut WeatherState, dt: float, gh: float, n: int) -> void { for i in 0 .. n { weather_run(weather_st, dt, gh) } }
|
||||
function count(fs: []WeatherFact, what: int) -> int {
|
||||
var n = 0
|
||||
for i in 0 .. len(fs) { if fs[i].what == what { n += 1 } }
|
||||
return n
|
||||
}
|
||||
|
||||
test "a new trip is clear, dry and forecast clear" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "a new trip is clear, dry and forecast clear" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
expect_eq(weather_state(weather_st), 0)
|
||||
expect_eq(weather_forecast(weather_st), 0)
|
||||
expect(not weather_wet(weather_st))
|
||||
expect(weather_cold(weather_st) == 0.0)
|
||||
}
|
||||
|
||||
test "a spell that runs out gives way to the next, as a fact" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "a spell that runs out gives way to the next, as a fact" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_set(weather_st, 0, 1, 0.1)
|
||||
step(base_st, weather_st, 0.1, 0.2, 1)
|
||||
step(weather_st, 0.1, 0.2, 1)
|
||||
expect_eq(weather_state(weather_st), 1)
|
||||
expect_eq(weather_next(weather_st), 2)
|
||||
let fs = facts(base_st, weather_st)
|
||||
let fs = facts(weather_st)
|
||||
expect_eq(count(fs, WEATHER_BEGAN), 1)
|
||||
expect(weather_left(weather_st) >= 1.0 and weather_left(weather_st) < 3.0)
|
||||
}
|
||||
|
||||
test "the amount eases in, and wet follows it" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "the amount eases in, and wet follows it" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_set(weather_st, 0, 1, 0.01)
|
||||
step(base_st, weather_st, 0.1, 0.02, 1)
|
||||
step(weather_st, 0.1, 0.02, 1)
|
||||
expect(not weather_wet(weather_st))
|
||||
step(base_st, weather_st, 0.1, 0.0, 200)
|
||||
step(weather_st, 0.1, 0.0, 200)
|
||||
expect(weather_wet(weather_st))
|
||||
expect(weather_cold(weather_st) > 4.0)
|
||||
expect(weather_ground_wet(weather_st) > 0.5)
|
||||
}
|
||||
|
||||
test "a storm throws lightning, and a clearing in daylight is a fact" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "a storm throws lightning, and a clearing in daylight is a fact" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_set(weather_st, 2, 0, 2.0)
|
||||
step(base_st, weather_st, 1.0, 0.0, 60)
|
||||
expect(count(facts(base_st, weather_st), WEATHER_THUNDER) > 0)
|
||||
step(weather_st, 1.0, 0.0, 60)
|
||||
expect(count(facts(weather_st), WEATHER_THUNDER) > 0)
|
||||
weather_set(weather_st, 2, 0, 0.05)
|
||||
step(base_st, weather_st, 0.1, 0.1, 1)
|
||||
step(weather_st, 0.1, 0.1, 1)
|
||||
expect_eq(weather_state(weather_st), 0)
|
||||
expect(weather_after_front(weather_st))
|
||||
expect_eq(count(facts(base_st, weather_st), WEATHER_CLEARED), 1)
|
||||
expect_eq(count(facts(weather_st), WEATHER_CLEARED), 1)
|
||||
}
|
||||
|
||||
test "the world's odds overrule the kind's" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "the world's odds overrule the kind's" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_test_st.lean = odds3(0.0, 0.0, 1.0)
|
||||
weather_set(weather_st, 0, 0, 0.01)
|
||||
step(base_st, weather_st, 0.1, 0.1, 1)
|
||||
step(weather_st, 0.1, 0.1, 1)
|
||||
expect_eq(weather_next(weather_st), 2)
|
||||
}
|
||||
|
||||
test "wanting rain forecasts a front and holds it long enough" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "wanting rain forecasts a front and holds it long enough" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_test_st.bias = WEATHER_WANT_WET
|
||||
step(base_st, weather_st, 0.1, 0.01, 1)
|
||||
step(weather_st, 0.1, 0.01, 1)
|
||||
expect(weather_forced(weather_st))
|
||||
expect_eq(weather_forecast(weather_st), 1)
|
||||
expect_eq(count(facts(base_st, weather_st), WEATHER_FRONT), 1)
|
||||
step(base_st, weather_st, 0.1, 2.0, 1)
|
||||
expect_eq(count(facts(weather_st), WEATHER_FRONT), 1)
|
||||
step(weather_st, 0.1, 2.0, 1)
|
||||
expect_eq(weather_state(weather_st), 1)
|
||||
expect(not weather_forced(weather_st))
|
||||
expect(weather_left(weather_st) >= 6.0)
|
||||
}
|
||||
|
||||
test "wanting clear sky clears it and keeps it" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "wanting clear sky clears it and keeps it" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_set(weather_st, 1, 1, 5.0)
|
||||
weather_test_st.bias = WEATHER_WANT_CLEAR
|
||||
step(base_st, weather_st, 0.1, 0.6, 1)
|
||||
step(weather_st, 0.1, 0.6, 1)
|
||||
expect_eq(weather_state(weather_st), 0)
|
||||
step(base_st, weather_st, 0.1, 0.9, 5)
|
||||
step(weather_st, 0.1, 0.9, 5)
|
||||
expect_eq(weather_state(weather_st), 0)
|
||||
}
|
||||
|
||||
test "a machine that does not own the world runs no spells, but is told them" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "a machine that does not own the world runs no spells, but is told them" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_test_st.owns = false
|
||||
weather_set(weather_st, 0, 1, 0.1)
|
||||
step(base_st, weather_st, 0.1, 5.0, 3)
|
||||
step(weather_st, 0.1, 5.0, 3)
|
||||
expect_eq(weather_state(weather_st), 0)
|
||||
weather_told(base_st, weather_st, 2, 0, 3.0, 1.0, 0.9, 1.0, 2)
|
||||
weather_told(weather_st, 2, 0, 3.0, 1.0, 0.9, 1.0, 2)
|
||||
expect_eq(weather_state(weather_st), 2)
|
||||
expect_eq(count(facts(base_st, weather_st), WEATHER_BEGAN), 1)
|
||||
step(base_st, weather_st, 1.0, 0.0, 60)
|
||||
expect(count(facts(base_st, weather_st), WEATHER_THUNDER) > 0)
|
||||
expect_eq(count(facts(weather_st), WEATHER_BEGAN), 1)
|
||||
step(weather_st, 1.0, 0.0, 60)
|
||||
expect(count(facts(weather_st), WEATHER_THUNDER) > 0)
|
||||
}
|
||||
|
||||
test "the wind turns with the hours" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "the wind turns with the hours" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_test_st.hours = 3.0
|
||||
step(base_st, weather_st, 1.0, 0.0, 100)
|
||||
step(weather_st, 1.0, 0.0, 100)
|
||||
expect(Math.abs(weather_dir(weather_st) - 0.5) < 0.01)
|
||||
weather_test_st.hours = 12.0
|
||||
step(base_st, weather_st, 1.0, 0.0, 100)
|
||||
step(weather_st, 1.0, 0.0, 100)
|
||||
expect(Math.abs(weather_dir(weather_st) - 2.5) < 0.01)
|
||||
}
|
||||
|
||||
test "a morning after rain remembers it was wet" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "a morning after rain remembers it was wet" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_set(weather_st, 1, 1, 5.0)
|
||||
step(base_st, weather_st, 0.1, 0.0, 1)
|
||||
step(weather_st, 0.1, 0.0, 1)
|
||||
weather_morning(weather_st)
|
||||
expect(weather_wet_yesterday(weather_st))
|
||||
}
|
||||
|
||||
test "a save section reads back the same sky" (base_st: mut BaseState, weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(base_st, weather_st, weather_test_st)
|
||||
test "a save section reads back the same sky" (weather_st: mut WeatherState, weather_test_st: mut WeatherTestState) {
|
||||
fresh(weather_st, weather_test_st)
|
||||
weather_set(weather_st, 1, 2, 4.25)
|
||||
weather_morning(weather_st)
|
||||
let fc = weather_forecast(weather_st)
|
||||
let root = save_tree()
|
||||
save_section(root, "weather", 1, weather_save(weather_st))
|
||||
let text = save_encode(root)
|
||||
weather_reset(base_st, weather_st)
|
||||
weather_reset(weather_st)
|
||||
let n = load_section(save_decode(text), "weather")
|
||||
weather_load(base_st, weather_st, n.data, n.version)
|
||||
weather_load(weather_st, n.data, n.version)
|
||||
expect_eq(weather_state(weather_st), 1)
|
||||
expect(weather_left(weather_st) == 4.25)
|
||||
expect_eq(weather_forecast(weather_st), fc)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue