The author of this famous pattern is Jean-Jacques Dubray. He wrote an introduction here SAM
You can see it in action here : SAMdemo
let actions = {
countBy(step) {
step = step || 1
model.accept({incrementBy:step})
}
}
let model = {
counter: 1,
accept(proposal) {
this.counter += (proposal.incrementBy > 0) ? proposal.incrementBy : 0
state.render(this)
}
}
let state = {
render(model) {
if (!this.nextAction(model)) {
console.log(model.counter)
}
},
nextAction(model) {
if (model.counter % 2 == 0) {
actions.countBy(1)
return true
} else {
return false
}
}
}
actions.countBy(2)
Rewrite with AI:
// --- State (immutable) ---
let model = {
counter: 1
};
// --- Renderer ---
function render(model) {
console.log(model.counter);
}
// --- Actions (pure) ---
function countBy(model, step = 1) {
if (step <= 0) return model; // ignore invalid steps
return { ...model, counter: model.counter + step };
}
// --- Next Action Logic ---
function nextAction(model) {
// If counter is even, increment by 1
if (model.counter % 2 === 0) {
return countBy(model, 1);
}
return model; // no change
}
// --- Reactive Runner ---
function runAction(model, step) {
// Apply initial action
let newModel = countBy(model, step);
// Keep applying nextAction until stable
while (true) {
const updatedModel = nextAction(newModel);
if (updatedModel.counter === newModel.counter) break; // stable
newModel = updatedModel;
}
render(newModel);
return newModel;
}
// --- Usage ---
model = runAction(model, 2); // Starts the flow
Top comments (0)