import nth from './nth';

const is = {
  even: n => !!(n % 2),
  odd:  n => !(n % 2)
};

function even_or_odd(expr) {
  return /^(even|odd)$/.test(expr);
}

export default {

  at({ x, y }) {
    return (x1, y1) => (x == x1 && y == y1);
  },

  nth({ count, grid }) {
    return expr => even_or_odd(expr)
      ? is[expr](count - 1)
      : nth(expr, count, grid.count);
  },

  row({ x, grid }) {
    return expr => even_or_odd(expr)
      ? is[expr](x - 1)
      : nth(expr, x, grid.x);
  },

  col({ y, grid }) {
    return expr => even_or_odd(expr)
      ? is[expr](y - 1)
      : nth(expr, y, grid.y);
  },

  even({ count }) {
    return _ => is.even(count - 1);
  },

  odd({ count }) {
    return _ => is.odd(count - 1);
  },

  random() {
    return (ratio = .5) => {
      if (ratio >= 1 && ratio <= 0) ratio = .5;
      return Math.random() < ratio;
    }
  }

}

@@ -264,39 +264,70 @@
 %7D) %7B%0A    return 
+(...exprs) =%3E exprs.some(
 expr =%3E
+%0A     
  even_or_odd(exp
@@ -327,32 +327,34 @@
 odd(expr)%0A      
+  
 ? is%5Bexpr%5D(count
@@ -355,24 +355,26 @@
 (count - 1)%0A
+  
       : nth(
@@ -397,16 +397,22 @@
 d.count)
+%0A    )
 ;%0A  %7D,%0A%0A
@@ -435,39 +435,70 @@
 %7D) %7B%0A    return 
+(...
 expr
+s)
  =%3E
+ exprs.some(expr =%3E%0A     
  even_or_odd(exp
@@ -498,32 +498,34 @@
 odd(expr)%0A      
+ 
+ 
 ? is%5Bexpr%5D(x - 1
@@ -522,24 +522,26 @@
 xpr%5D(x - 1)%0A
+  
       : nth(
@@ -556,16 +556,22 @@
  grid.x)
+%0A    )
 ;%0A  %7D,%0A%0A
@@ -602,23 +602,53 @@
  return 
+(...
 expr
+)
  =%3E
+ exprs.some(expr =%3E%0A     
  even_or
@@ -654,24 +654,26 @@
 r_odd(expr)%0A
+  
       ? is%5Be
@@ -686,24 +686,26 @@
  - 1)%0A      
+ 
+ 
 : nth(expr, 
@@ -714,16 +714,22 @@
  grid.y)
+%0A    )
 ;%0A  %7D,%0A%0A

support multiple arguments for nth(), row() and col()