Created
June 15, 2017 00:57
-
-
Save phausler/2a1195bcbc16b4b4cd8675c975c41af5 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
// | |
// 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