You can define a 'times' operation to work with any sequences, e.g.
import Foundation
enum Suits: String {
case Spades = ""
case Hearts = ""
case Diamonds = ""
case Clubs = ""
}
let suits:[Suits] = [.Spades, .Hearts, .Diamonds, .Clubs]
let ranks = ["A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3",
"2"]
infix operator ⨉ {}
func ⨉<A:SequenceType, B:SequenceType>(lhs: A, rhs: B)
-> [(A.Generator.Element, B.Generator.Element)] {
return lhs
.map{ left in rhs.map{ right in (left, right) }}
.reduce(, combine: +)
}
[1, 2] ⨉ [3, 4]
func shuffled() -> [String] {
var cards:[String] =
for (suit, rank) in suits ⨉ ranks {
let random = Int(abs(rand())) % (cards.count + 1)
cards.insert(suit.rawValue + rank, atIndex: random)
}
return cards
}
shuffled().joinWithSeparator(" ")
···
On Wed, Dec 9, 2015 at 23:00 Chris Eidhof via swift-evolution < swift-evolution@swift.org> wrote:
I think it could be really nice to extend the for-loop so that it can have
multiple clauses. Much like in the if-let with multiple clauses, I could
imagine a for-loop with multiple clauses:
var cards: [(Suit,Rank)] =
for x in suits, y in ranks {
cards.append((x,y))
}
This would be the same as writing:
var cards: [(Suit,Rank)] =
for x in suits {
for y in ranks {
cards.append((x,y))}
}
}
You could also do something like:
for x in input1, y in (x..<end) {
// Do something with (x,y)
}
In fact, once we would have that, we could combine both if-let and for,
and make it more general, to end up with something like Haskell’s
do-notation or C#’s LINQ. But that might be taking it too far...
Chris
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution