   length:  (x) -> x[0].length
   greater: (x) -> x[0] > x[1]
   lesser:  (x) -> x[0] < x[1]
+  range:   (x) -> [x[0]..x[1]]
+  slice:   (x) -> x[0].slice.call(x[0], x[1..])
 
 library =
-  lure:   process.argv
-  true:   true
-  false:  false
-  reduce: (a) -> a[1].reduce (p, x, i) -> a[0] [p, x]
-  map:    (a) -> a[1].map (x) -> a[0] x
+  lure:    process.argv
+  true:    true
+  false:   false
+
+  # Haskellish stuff
+  head:    (a) -> a[0][0]
+  tail:    (a) -> a[0][1..]
+  last:    (a) -> a[0].slice(-1)[0]
+  init:    (a) -> a[0][0..-1]
+  take:    (x) -> x[1][0..x[0]]
+  drop:    (x) -> x[1][(x[1].length - x[0])..-1]
+  min:     (a) -> a[0].reduce (x, y) -> if x < y then x else y
+  max:     (a) -> a[0].reduce (x, y) -> if x > y then x else y
+  elem:    (x) -> x[0] in x[1]
+  reverse: (a) -> a[0].reverse()
+
+  reduce:  (a) -> a[1].reduce (p, x, i) -> a[0] [p, x]
+  map:     (a) -> a[1].map (x) -> a[0] [x]
 
   print:   fns.print
   at:      fns.at

  '_':  fns.length
  '>':  fns.greater
  '<':  fns.lesser

module.exports = library

  length:  fns.length
  greater: fns.greater
  lesser:  fns.lesser
  range:   fns.range
  slice:   fns.slice

  # Lispy stuff and shortcuts
  '+':  (x) -> x[0] + x[1]
