packages feed

atomo-0.2: prelude/parameter.atomo

operator right 0 =!

Parameter = Object clone
Parameter new: v := Parameter clone do:
  { set-default: v
  }

context define: (name: Particle) as: root :=
    name define-on: [context] as: (Parameter new: root)

(p: Parameter) show :=
  "<" .. p _? show .. ">"

(p: Parameter) _? := p value: self

(p: Parameter) =! v :=
  (p) value: (self) = v

(p: Parameter) set-default: v :=
  (p) value: _ = v

with: (p: Parameter) as: new do: (action: Block) :=
  { old = p _?
    action before: { p =! new } after: { p =! old }
  } call

with-default: (p: Parameter) as: new do: (action: Block) :=
  { old = p _?
    action before: { p set-default: new } after: { p set-default: old }
  } call

with: [] do: (action: Block) := action call
with: (b . bs) do: (action: Block) :=
  with: b from as: b to do: { with: bs do: action }

with-defaults: [] do: (action: Block) := action call
with-defaults: (b . bs) do: (action: Block) :=
  with-default: b from as: b to do: { with: bs do: action }