Skip to content

Instantly share code, notes, and snippets.

@phausler
Created June 15, 2017 00:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phausler/2a1195bcbc16b4b4cd8675c975c41af5 to your computer and use it in GitHub Desktop.
Save phausler/2a1195bcbc16b4b4cd8675c975c41af5 to your computer and use it in GitHub Desktop.
//
// main.swift
// Stacks
//
// Created by Philippe Hausler on 6/14/17.
// Copyright © 2017 Philippe Hausler. All rights reserved.
//
import Foundation
import Darwin
func generateEnum(_ count: Int) {
let preamble = """
enum Stack<T> {
init() { self = .s0 }
case s0
"""
print(preamble)
for idx in 1..<count {
let tuple = "(" + repeatElement("T", count: idx).joined(separator: ", ") + ")"
let generatedCase = " case s\(idx)\(tuple)\n"
print(generatedCase, terminator: "")
}
let postamble1 = """
subscript(_ idx: Int) -> T {
get {
switch self {
case .s0: fatalError("Index out of range")
"""
print(postamble1)
for idx in 1..<count {
let variables = (0..<idx).map { "let t\($0)" }.joined(separator: ", ")
let cases = (0..<idx).map { " case \($0): return t\($0)"}.joined(separator: "\n")
let generatedCase = """
case .s\(idx)(\(variables)):
switch idx {
\(cases)
default: fatalError("Index out of range")
}
"""
print(generatedCase)
}
let postamble2 = """
}
}
set {
switch self {
case .s0: fatalError("Index out of range")
case .s1:
switch idx {
case 0: self = .s1(newValue)
default: fatalError("Index out of range")
}
"""
print(postamble2)
for idx in 2..<count {
let variables = (0..<idx).map { "let t\($0)" }.joined(separator: ", ")
let baseAssignments = (0..<idx).map { "t\($0)" }
var cases = ""
for caseIdx in 0..<idx {
var assignments = baseAssignments
assignments[caseIdx] = "newValue"
let caseInstance = """
case \(caseIdx): self = .s\(idx)(\(assignments.joined(separator: ", ")))
"""
cases += caseInstance
}
let generatedCase = """
case .s\(idx)(\(variables)):
switch idx {
\(cases)
default: fatalError("Index out of range")
}
"""
print(generatedCase)
}
let postamble3 = """
}
}
}
}
"""
print(postamble3)
}
generateEnum(32) // creates a valid swift file
// generateEnum(512) // creates an invalid swift file?!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment