Skip to content

Instantly share code, notes, and snippets.

@aciidgh
Last active December 30, 2015 19:53
Show Gist options
  • Save aciidgh/83a02055a1772e739d29 to your computer and use it in GitHub Desktop.
Save aciidgh/83a02055a1772e739d29 to your computer and use it in GitHub Desktop.
Learning Sequence and Generators
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)")
}
@erica
Copy link

erica commented Dec 30, 2015

struct Stack<T> {    
    private var store: [T] = []
    mutating func push(anObject: T) { store.append(anObject) }
    mutating func pop() -> T? {return store.isEmpty ? nil : store.removeLast() }
}

@erica
Copy link

erica commented Dec 30, 2015

struct ArrayGenerator<T>: GeneratorType {
    var items: [T]
    mutating func next() -> T? {
        return items.isEmpty ? .None : items.removeLast()
    }
}

@erica
Copy link

erica commented Dec 30, 2015

struct Stack<T> {
    private var store: [T] = []
    mutating func push(anObject: T) { store.append(anObject) }
    mutating func pop() -> T? { return store.isEmpty ? nil : store.removeLast() }
}

/// 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) }
}

var fruitStore = Stack<String>()
fruitStore.push("apple")
fruitStore.push("banana")
fruitStore.pop()
fruitStore.push("banana2")
fruitStore.push("banana3")

for fruit in fruitStore {
    print("\(fruit)")
}

@aciidgh
Copy link
Author

aciidgh commented Dec 30, 2015

❤️ thanks erica

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