mohayonao/SCScript

View on GitHub
src/sc/classlib/Collections/Environment.js

Summary

Maintainability
A
0 mins
Test Coverage
SCScript.install(function(sc) {
  "use strict";

  require("./Dictionary");

  var $ = sc.lang.$;
  var $nil = $.nil;

  sc.lang.klass.refine("Environment", function(builder) {
    var envStack = [];

    builder.addClassMethod("make",function($function) {
      return this.new().make($function);
    });

    builder.addClassMethod("use", function($function) {
      return this.new().use($function);
    });

    builder.addMethod("make", {
      args: "function"
    }, function($function) {
      var $saveEnvir;

      $saveEnvir = sc.lang.main.getCurrentEnvir();
      sc.lang.main.setCurrentEnvir(this);
      try {
        $function.value(this);
      } catch (e) {}
      sc.lang.main.setCurrentEnvir($saveEnvir);

      return this;
    });

    builder.addMethod("use", {
      args: "function"
    }, function($function) {
      var $result, $saveEnvir;

      $saveEnvir = sc.lang.main.getCurrentEnvir();
      sc.lang.main.setCurrentEnvir(this);
      try {
        $result = $function.value(this);
      } catch (e) {}
      sc.lang.main.setCurrentEnvir($saveEnvir);

      return $result || /* istanbul ignore next */ $nil;
    });

    builder.addMethod("eventAt", {
      args: "key"
    }, function($key) {
      return this.at($key);
    });

    builder.addMethod("composeEvents", {
      args: "event"
    }, function($event) {
      return this.copy().putAll($event);
    });

    builder.addClassMethod("pop", function() {
      if (envStack.length) {
        sc.lang.main.setCurrentEnvir(envStack.pop());
      }
      return this;
    });

    builder.addClassMethod("push", {
      args: "envir"
    }, function($envir) {
      envStack.push(sc.lang.main.getCurrentEnvir());
      sc.lang.main.setCurrentEnvir($envir);
      return this;
    });

    builder.addMethod("pop", function() {
      return this.class().pop();
    });

    builder.addMethod("push", function() {
      return this.class().push(this);
    });
    // TODO: implements linkDoc
    // TODO: implements unlinkDoc
  });
});