Module: Trxl::StdLib

Included in:
Calculator
Defined in:
lib/trxl/trxl.rb

Overview

This module exists only for performance reason. Loading the stdlib directly from a ruby object, should be much faster than loading it from a file.

Constant Summary collapse

FOREACH_IN =
<<-PROGRAM
  foreach_in = fun(enumerable, body) {
    _foreach_in_(enumerable, body, 0);
  };
  _foreach_in_ = fun(enumerable, body, index) {
    if(index < SIZE(enumerable) - 1)
      body(enumerable[index]);
      _foreach_in_(enumerable, body, index + 1)
    else
      body(enumerable[index])
    end
  };
PROGRAM
INJECT =
<<-PROGRAM
  inject = fun(memo, enumerable, body) {
    _inject_(memo, enumerable, body, 0);
  };
  _inject_ = fun(memo, enumerable, body, index) {
    if(index < SIZE(enumerable) - 1)
      _inject_(body(memo, enumerable[index]), enumerable, body, index + 1)
    else
      body(memo, enumerable[index])
    end
  };
PROGRAM
MAP =
<<-PROGRAM
  require 'stdlib/inject';
  map = fun(enumerable, body) {
    b = body; # WORK AROUND a bug in Trxl::Environment
    inject([], enumerable, fun(memo, e) { memo << b(e); });
  };
PROGRAM
SELECT =
<<-PROGRAM
  require 'stdlib/inject';
  select = fun(enumerable, body) {
    b = body; # WORK AROUND a bug in Trxl::Environment
    inject([], enumerable, fun(selected, value) { 
      if(b(value))
        selected << value
      else
        selected
      end 
    });
  };
PROGRAM
REJECT =
<<-REJECT
  require 'stdlib/inject';
  reject = fun(enumerable, filter) {
    f = filter; # WORKAROUND for a bug in Trxl::Environment
    inject([], enumerable, fun(rejected, value) {
      if(f(value)) 
        rejected
      else
        rejected << value
      end 
    })
  };
REJECT
IN_GROUPS_OF =
<<-IN_GROUPS_OF
  require 'stdlib/foreach_in';
  require 'stdlib/inject';
  in_groups_of = fun(size_of_group, enumerable, group_function) {
    count = 0; groups = []; cur_group = []; 
    foreach_in(enumerable, fun(element) {
      if(count < size_of_group)
        cur_group << element;
        count = count + 1
      end;
      if(count == size_of_group)
        groups << cur_group;
        cur_group = [];
        count = 0
      end
    });
    group_count = 0;
    inject([], groups, fun(memo, group) {
      group_count = group_count + 1;
      memo << group_function(group, group_count);
      memo
    });
  };
IN_GROUPS_OF
SUM_OF_TYPE =
<<-SUM_OF_TYPE
  sum_of_type = fun(type, all_types, all_values) {
    SUM(VALUES_OF_TYPE(type, all_types, all_values));
  };
SUM_OF_TYPE
AVG_SUM_OF_TYPE =
<<-AVG_SUM_OF_TYPE
  avg_sum_of_type = fun(type, all_types, all_values) {
    AVG_SUM(VALUES_OF_TYPE(type, all_types, all_values));
  };
AVG_SUM_OF_TYPE
AVG_RANGE_SUM_OF_TYPE =
<<-AVG_RANGE_SUM_OF_TYPE
  require 'stdlib/inject';
  require 'stdlib/avg_sum_of_type';
  avg_range_sum_of_type = fun(type, all_types, variable_range) {
    inject(0, variable_range, fun(sum, variable) { 
      sum + avg_sum_of_type(type, all_types, ENV[variable]) 
    });
  };
AVG_RANGE_SUM_OF_TYPE
TOTAL_RANGE_SUM_OF_TYPE =
<<-TOTAL_RANGE_SUM_OF_TYPE
  require 'stdlib/inject';
  require 'stdlib/sum_of_type';
  total_range_sum_of_type = fun(type, all_types, variable_range) {
    inject(0, variable_range, fun(sum, variable) { 
      sum + sum_of_type(type, all_types, ENV[variable]) 
    });
  };
TOTAL_RANGE_SUM_OF_TYPE
YEAR_FROM_DATE =
<<-YEAR_FROM_DATE
  year_from_date = fun(date) {
    date = SPLIT(date, '/');
    TO_INT(date[1]);
  };
YEAR_FROM_DATE
MONTH_FROM_DATE =
<<-MONTH_FROM_DATE
  month_from_date = fun(date) {
    date = SPLIT(date, '/');
    TO_INT(date[0]);
  };
MONTH_FROM_DATE
DATES =
<<-DATES
  require 'stdlib/month_from_date';
  require 'stdlib/year_from_date';
DATES
RATIO =
<<-RATIO
  require 'stdlib/foreach_in';
  ratio = fun(enumerable, true_condition, base_condition) {
    base = 0;
    positives = 0;
    foreach_in(enumerable, fun(val) {
      if(ENV[val] != base_condition)
        base = base + 1
      end;
      if(ENV[val] == true_condition)
        positives = positives + 1
      end;
    });
    if(base > 0)
      ROUND((ROUND(positives, 1) / base) * 100, 2)
    else
      NULL
    end
  };
RATIO