Created
February 23, 2021 10:51
-
-
Save haskelash/faeebdbd61d5f2da7fa05d0aa552064a to your computer and use it in GitHub Desktop.
A Swift queue with a recursive enum
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
// | |
// Queue.swift | |
// Queue | |
// | |
// Created by Haskel Ash on 2/23/21. | |
// | |
import Foundation | |
fileprivate enum QueueNode<Element> { | |
case empty | |
indirect case node(value: Element, next: QueueNode<Element>) | |
mutating func enqueue(_ newValue: Element) { | |
guard case .node(let value, var next) = self else { | |
self = .node(value: newValue, next: .empty) | |
return | |
} | |
next.enqueue(newValue) | |
self = .node(value: value, next: next) | |
} | |
mutating func dequeue() -> Element? { | |
guard case let .node(value, next) = self else { return nil } | |
self = next | |
return value | |
} | |
} | |
struct Queue<Element> { | |
private var head = QueueNode<Element>.empty | |
mutating func enqueue(_ value: Element) { | |
head.enqueue(value) | |
} | |
@discardableResult mutating func dequeue() -> Element? { | |
return head.dequeue() | |
} | |
} | |
extension QueueNode: CustomStringConvertible { | |
var description: String { | |
var desc = "(head) -> " | |
var p: QueueNode<Element> = self | |
while case let .node(value, q) = p { | |
desc += "\(value) -> " | |
p = q | |
} | |
desc += "(tail)" | |
return desc | |
} | |
} | |
extension Queue: CustomStringConvertible { | |
var description: String { | |
return head.description | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment