Skip to content

Instantly share code, notes, and snippets.

@haskelash
Created February 23, 2021 10:51
Show Gist options
  • Save haskelash/faeebdbd61d5f2da7fa05d0aa552064a to your computer and use it in GitHub Desktop.
Save haskelash/faeebdbd61d5f2da7fa05d0aa552064a to your computer and use it in GitHub Desktop.
A Swift queue with a recursive enum
//
// 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