1 IO.include("frame/Opt.js");
   2 IO.include("frame/Chain.js");
   3 IO.include("frame/Link.js");
   4 IO.include("frame/String.js");
   5 IO.include("frame/Hash.js");
   6 IO.include("frame/Namespace.js");
   7 //IO.include("frame/Reflection.js");
   8 
   9 /** A few helper functions to make life a little easier. */
  10 
  11 /**
  12  * 引数oが未定義(undefined)でなければtrueを返します。
  13  * @param {*} o 何らかの値
  14  * @return {Boolean} 引数oが未定義(undefined)でなければtrue、未定義ならfalse
  15  */
  16 function defined(o) {
  17     return (o !== undefined);
  18 }
  19 
  20 /**
  21  * 引数で渡されたオブジェクトに対して、「深いコピー」による複製を作成して返します。
  22  * ただし引数がオブジェクトでなかった場合は値をそのまま返します。<br>
  23  * ※この関数を使用する場合、循環参照による無限ループに注意してください。 
  24  * @param {Object} o コピー元のオブジェクト
  25  * @return {Object} 作成されたコピー
  26  */
  27 function copy(o) { // todo check for circular refs
  28     if (o == null || typeof(o) != 'object') return o;
  29     var c = new o.constructor();
  30     for(var p in o)    c[p] = copy(o[p]);
  31     return c;
  32 }
  33 
  34 /**
  35  * 引数で渡された配列の要素に重複がなければtrueを返します。
  36  * @param {*[]} arr 検査対象の配列
  37  * @return {Boolean} 配列要素に重複がなければtrue、あればfalse
  38  */
  39 function isUnique(arr) {
  40     var l = arr.length;
  41     for(var i = 0; i < l; i++ ) {
  42         if (arr.lastIndexOf(arr[i]) > i) return false;
  43     }
  44     return true;
  45 }
  46 
  47 /**
  48  * 引数で渡された文字列中に含まれる正規表現メタ文字を全て\でエスケープした文字列を返します。
  49  * <p class="org_comment">Returns the given string with all regex meta characters backslashed.</p>
  50  * @param {String} str 処理対象の文字列
  51  * @return {String} 正規表現メタ文字がエスケープされた文字列
  52  */
  53 RegExp.escapeMeta = function(str) {
  54     return str.replace(/([$^\\\/()|?+*\[\]{}.-])/g, "\\$1");
  55 }
  56