Skip to content

Instantly share code, notes, and snippets.

Created June 10, 2014 17:43
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/9bb5f5d9f6918b1482b6 to your computer and use it in GitHub Desktop.
Save anonymous/9bb5f5d9f6918b1482b6 to your computer and use it in GitHub Desktop.
import Swift
struct SetGenerator<T : Hashable> : Generator {
var dictGenerator : DictionaryGenerator<T, Void>
init(_ d : Dictionary<T,Void>) {
dictGenerator = d.generate()
}
typealias Element = T
mutating func next() -> Element? {
if let tuple = dictGenerator.next() {
let (k, _) = tuple
return k
} else {
return nil
}
}
}
struct Set<T : Hashable> : Sequence {
var dict : Dictionary<T,Void> = [:]
init(_ a : Array<T>) {
for i in a {
insert(i)
}
}
mutating func insert(i : T) {
dict[i] = ()
}
mutating func remove(i : T) {
dict.removeValueForKey(i)
}
func isMember(i : T) -> Bool {
return dict[i].getLogicValue()
}
typealias GeneratorType = SetGenerator<T>
func generate() -> GeneratorType { return SetGenerator(dict) }
}
var s = Set<Int>([3, 5, 7, 9, 11, 13, 17])
s.insert(3)
s.insert(4)
for i in s {
println("\(i)")
}
s.isMember(6)
s.isMember(7)
@JensAyton
Copy link

extension Set: ArrayLiteralConvertible {
    static func convertFromArrayLiteral(elements: T...) -> Set<T> {
        return Set(elements)
    }
}

var s: Set<Int> = [3, 5, 7, 9, 11, 13, 17]

@robrix
Copy link

robrix commented Jun 22, 2014

An alternative implementation of Sequence conformance:

extension Set : Sequence {
    func generate() -> MapSequenceGenerator<Dictionary<Element, Void>.GeneratorType, Element> {
        return _dictionary.keys.generate()
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment