MODULE JsArray; IMPORT JS, Object, JsString; TYPE Type* = POINTER TO RECORD END; Strings* = POINTER TO RECORD END; PROCEDURE len*(a: Type): INTEGER; VAR result: INTEGER; BEGIN JS.do("result = a.length"); RETURN result END len; PROCEDURE stringsLen*(a: Strings): INTEGER; VAR result: INTEGER; BEGIN JS.do("result = a.length"); RETURN result END stringsLen; PROCEDURE add*(a: Type; o: Object.PType); BEGIN JS.do("a.push(o)"); END add; PROCEDURE addString*(a: Strings; o: JsString.Type); BEGIN JS.do("a.push(o)"); END addString; PROCEDURE removeString*(a: Strings; i: INTEGER); BEGIN JS.do("a.splice(i, 1)"); END removeString; PROCEDURE at*(a: Type; i: INTEGER): Object.PType; VAR result: Object.PType; BEGIN JS.do("result = a[i]"); RETURN result END at; PROCEDURE stringsAt*(a: Strings; i: INTEGER): JsString.Type; VAR result: JsString.Type; BEGIN JS.do("result = a[i]"); RETURN result END stringsAt; PROCEDURE stringsIndexOf*(a: Strings; x: JsString.Type): INTEGER; VAR result: INTEGER; BEGIN JS.do("result = a.indexOf(x)"); RETURN result END stringsIndexOf; PROCEDURE contains*(a: Type; x: Object.PType): BOOLEAN; VAR result: BOOLEAN; BEGIN JS.do("result = (a.indexOf(x) != -1)"); RETURN result END contains; PROCEDURE containsString*(a: Strings; x: JsString.Type): BOOLEAN; RETURN stringsIndexOf(a, x) # -1 END containsString; PROCEDURE make*(): Type; VAR result: Type; BEGIN JS.do("result = []"); RETURN result END make; PROCEDURE makeStrings*(): Strings; VAR result: Strings; BEGIN JS.do("result = []"); RETURN result END makeStrings; END JsArray.