packages feed

atomo-0.1.1: src/Atomo/Kernel/Parameter.hs

{-# LANGUAGE QuasiQuotes #-}
module Atomo.Kernel.Parameter (load) where

import Atomo.Environment
import Atomo.Haskell


load :: VM ()
load = mapM_ eval [$es|
    operator right 0 =!

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

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