(between? )

Here’s some code that maps a score to a grade.

(cond
  (<= 80 grade) "A"
  ((and (<= 70 grade) (> grade 80)) "B"
  ((and (<= 60 grade) (> grade 70)) "C"
  ((and (<= 50 grade) (> grade 60)) "D"
  ((and (<= 40 grade) (> grade 50)) "E"
  (> 40 grade) "F"))

A nicer way with currying.

(defn between? [low high]
  (fn [score]
    (and (<= low score) (> high score)))

(cond
  (<= 80 grade) "A"
  ((between? 70 80) grade) "B"
  ((between? 60 70) grade) "C"
  ((between? 50 60) grade) "D"
  ((between? 40 50) grade) "E"
  (> 40 grade) "F"))

between? takes the low and high parameters, and returns a function (fn [score] ) that checks if score is between low and high.

(not (nil? ))

Nested functions can get unwieldly:

(not (nil? name))

Try:

((comp not nil?) name)

Or:

((complement nil?) name)

Better, extend the language for yourself:

(defn not-nil? [v] (not (nil? v)))

(not-nil? name)

gatlingGun shoots holes in your array

Here’s a snippet I created to generate invalid data from a valid key-value array. It’s really handy for testing. Feel free to use it.

  /**
   * Gatling gun takes an array of valid params and returns every
   * combination of invalid data caused by blanking out individual params.
   *
   * Example:
   *
   * $validData = array('firstName' => 'Gatling',
   *                    'lastName' => 'Gun',
   *                    'age' => 12);
   *
   * $ggData = gatlingGun($validData);
   *
   * $ggData = array(
   *     array('firstName' => '',        'lastName' => '',    'age' => ''),
   *     array('firstName' => '',        'lastName' => '',    'age' => 12),
   *     array('firstName' => '',        'lastName' => 'Gun', 'age' => ''),
   *     array('firstName' => '',        'lastName' => 'Gun', 'age' => 12),
   *     array('firstName' => 'Gatling', 'lastName' => '',    'age' => ''),
   *     array('firstName' => 'Gatling', 'lastName' => '',    'age' => 12),
   *     array('firstName' => 'Gatling', 'lastName' => 'Gun', 'age' => '')
   * );
   *
   *
   * @param array $validData
   * @return array
   *
   */
  function gatlingGun($validData)
  {
      $original = $validData;
      $invalidCombinations = array();

      $max = count($original);
      $keys = array_keys($original);
      $combinations = pow(2, $max) - 1;

      for ($i = 0; $i < $combinations; $i++) {
           $tmp = array();
           $j = count($keys) - 1;
           foreach ($keys as $k => $key) {
              $tmp[$key] = (($i & pow(2,$j)) == 0) ? '' : $original[$key];
              $j--;
          }

          $invalidCombinations[] = $tmp;
      }
      return $invalidCombinations;
  }

Just be careful, the number of combinations it comes up with is 2^n - 1. So the number of invalid combinations from an array with 10 key-value pairs will quickly balloon to 1023.

Do drop me a line to let me know if this has been helpful for you.