commit e600d33237973ba4300ca9bca53a41508c239667
parent 0b5c78aec29fc0e25a6aa649f48185d82e82b02d
Author: tomas <tomas@logand.com>
Date:   Sun, 24 Jan 2010 21:12:54 +0100
forall operator added
Diffstat:
| M | wps.js |  |  | 40 | ++++++++++++++++++++++++++++++++++++++++ | 
1 file changed, 40 insertions(+), 0 deletions(-)
diff --git a/wps.js b/wps.js
@@ -312,6 +312,46 @@ function Wps() {
       if(J <= L) Es.push([false, J, B]);
     }
   });
+  function XforallA() {
+    var B = Os.pop();
+    var A = Os.pop();
+    var I = Os.pop();
+    var N = A.length;
+    if(1 < N - I) Es.push([true, I + 1, A, B, XforallA]);
+    if(0 < N - I) Es.push([false, A[I], B]);
+  }
+  function XforallO() {
+    var B = Os.pop();
+    var O = Os.pop();
+    var L = Os.pop();
+    var N = L.length;
+    var K;
+    if(0 < N) K = L.pop();
+    if(1 < N) Es.push([true, L, O, B, XforallO]);
+    if(0 < N) Es.push([false, K, O[K], B]);
+  }
+  def("forall", function() { // TODO in ps
+    var B = Os.pop();
+    var O = Os.pop();
+    if(isArray(O)) {
+      Os.push(0);
+      Os.push(O);
+      Os.push(B);
+      XforallA();
+    } else if(isObject(O)) {
+      var L = [];
+      for(var K in O) {L.push(K);}
+      Os.push(L);
+      Os.push(O);
+      Os.push(B);
+      XforallO();
+    } else if("string" == typeof O) {
+      Os.push(0);
+      Os.push(O.split(""));
+      Os.push(B);
+      XforallA();
+    } else throw "Cannot apply forall to " + O;
+  });
   def("exec", function() {Es.push([false, Os.pop()]);});
   def("cvx", function() {
     var X = Os.pop();