head/tail implementation using protocol
another implementation inspired from python
// Swift // python
var arr = [1,2,3] // arr = [1,2,3]
arr[1..(-1)] // arr[1:-1]
arr[1..(-2)] // arr[1:-2]
@infix func .. (lhs: Int, rhs: Int) -> (Int, Int) { | |
return (lhs, rhs) | |
} | |
extension Array { | |
subscript(range: (Int, Int)) -> [T] { | |
var (start, end) = range | |
end = end < 0 ? self.count + end : end | |
return Array(self[start...end]) | |
} | |
var head: T { | |
get { return self[0] } | |
} | |
var tail: [T] { | |
get { return self[1..(-1)] } | |
} | |
} |
protocol Butcher { | |
typealias T | |
var head: T { get } | |
var tail: Array<T> { get } | |
} | |
extension Array:Butcher { | |
typealias Foo = T | |
var head: T { | |
// non-optional for optimization | |
get { return self[0] } | |
} | |
var tail: Array<T> { | |
get { | |
return self.count > 1 ? Array(self[1..<self.count]) : [] | |
} | |
} | |
} | |
var char = ["a", "b", "c", "d"] | |
println(char.head) | |
println(char.tail) | |
var arr = [1] | |
println(arr.head) | |
println(arr.tail) | |
var arr2:Array<Int> = [] | |
arr2.head // error occured |