Last active
December 30, 2015 19:53
-
-
Save aciidgh/83a02055a1772e739d29 to your computer and use it in GitHub Desktop.
Learning Sequence and Generators
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
struct Stack<T> { | |
private var store = [T]() | |
mutating func push(anObject: T) { | |
store.append(anObject) | |
} | |
mutating func pop() -> T? { | |
let lastItem = store.last | |
store = Array(store.dropLast()) | |
return lastItem | |
} | |
} | |
/// Using stack to create stack generator | |
/// Thanks Psy | |
struct StackGenerator<T>: GeneratorType { | |
var stack: Stack<T> | |
mutating func next() -> T? { | |
return stack.pop() | |
} | |
} | |
extension Stack: SequenceType { | |
func generate() -> StackGenerator<T> { | |
return StackGenerator<T>(stack: self) | |
} | |
} | |
struct ArrayGenerator<T>: GeneratorType { | |
var items: [T] | |
mutating func next() -> T? { | |
if items.isEmpty { return .None } | |
let element = items.last! | |
items = Array(items[0..<items.count-1]) | |
return element | |
} | |
} | |
///Using ArrayGenerator | |
//extension Stack: SequenceType { | |
// func generate() -> ArrayGenerator<T> { | |
// return ArrayGenerator<T>(items: store) | |
// } | |
//} | |
///Easy Way | |
//extension Stack: SequenceType { | |
// func generate() -> IndexingGenerator<[T]> { | |
// return store.reverse().generate() | |
// } | |
//} | |
var fruitStore = Stack<String>() | |
fruitStore.push("apple") | |
fruitStore.push("banana") | |
fruitStore.pop() | |
fruitStore.push("banana2") | |
fruitStore.push("banana3") | |
for fruit in fruitStore { | |
print("\(fruit)") | |
} | |
print("") | |
//=========================================================================================================// | |
struct StringStack { | |
private var stackStore = [String]() | |
mutating func push(someString: String) { | |
stackStore.append(someString) | |
} | |
mutating func pop() -> String? { | |
let lastItem = stackStore.last | |
stackStore = Array(stackStore.dropLast()) | |
return lastItem | |
} | |
} | |
var fruitStack = StringStack() | |
fruitStack.push("apple") | |
fruitStack.push("banana") | |
fruitStack.push("orange") | |
fruitStack.push("papaya") | |
fruitStack.pop() | |
//for fruit in fruitStack.stackStore { | |
// print("\(fruit)") | |
//} | |
struct StringStackGenerator: GeneratorType { | |
var items: [String] | |
mutating func next() -> String? { | |
if items.isEmpty { return .None } | |
let element = items.last! | |
items = Array(items[0..<items.count-1]) | |
return element | |
} | |
} | |
extension StringStack: SequenceType { | |
func generate() -> StringStackGenerator { | |
return StringStackGenerator(items: stackStore) | |
} | |
} | |
//Easy way | |
//extension StringStack: SequenceType { | |
// func generate() -> IndexingGenerator<[String]> { | |
// return stackStore.reverse().generate() | |
// } | |
//} | |
for fruit in fruitStack { | |
print("\(fruit)") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
❤️ thanks erica