unless Array::includes
Array::includes = (el) -> @indexOf(el) >= 0
unless Array::filter
Array::filter = (fn) -> arr = [] (arr.push(el) if fn(el)) for el in @
unless Array::intersection
Array::intersection = (arr) -> @filter((el) -> arr.includes(el))
unless Array::intersects
Array::intersects = (arr) -> @intersection(arr).length > 0
unless Array::subtract
Array::subtract = (arr) -> @filter((el) -> !arr.includes(el))
unless Array::pluck
Array::pluck = (keys...) -> keys = keys.flatten() arr = [] for el in @ arr.push(keys.map (key) -> el[key]) return if keys.length == 1 then arr.flatten() else arr
unless Array::flatten
Array::flatten = -> arr = [] for l in @ if Array.isArray(l) for i in l.flatten() arr.push i else arr.push l arr
unless Array::min
Array::min = -> return Math.min.apply(null,@) Array::max = -> return Math.max.apply(null,@)
unless Array::first
Array::first = -> @[0] Array::last = -> @[@length - 1]
unless Array::dup
Array::dup = -> return @slice(0) Array::empty = -> @length == 0 Array::present = -> @length != 0
unless Array::merge
Array::merge = (arr) -> @push(el) for el in arr @