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
// Type-safe State Machine with Phantom Type May 2022 @AtarayoSD | |
import Foundation | |
protocol State {} | |
// Transitions | |
protocol TransferableToB {} | |
protocol TransferableToC {} | |
protocol TransferableToD {} | |
// States | |
enum StateA: State, TransferableToB, TransferableToC {} | |
enum StateB: State, TransferableToC, TransferableToD {} | |
enum StateC: State {} | |
enum StateD: State {} | |
// State Machine | |
final class StateMachine<T: State> { | |
init() {} | |
} | |
extension StateMachine where T == StateA { | |
var transitionX: StateMachine<StateB> { | |
print("=> State B") | |
return StateMachine<StateB>() | |
} | |
var transitionY: StateMachine<StateC> { | |
print("=> State C") | |
return StateMachine<StateC>() | |
} | |
} | |
extension StateMachine where T == StateB { | |
var transitionZ: StateMachine<StateC> { | |
print("=> State C") | |
return StateMachine<StateC>() | |
} | |
var transitionW: StateMachine<StateD> { | |
print("=> State D") | |
return StateMachine<StateD>() | |
} | |
var transitionQ: StateMachine<StateB> { | |
print("=> State B") | |
return StateMachine<StateB>() | |
} | |
} | |
extension StateMachine where T == StateC { | |
} | |
extension StateMachine where T == StateD { | |
} | |
final class Something { | |
func start() -> StateMachine<StateA> { | |
return StateMachine<StateA>() | |
} | |
} | |
let something = Something() | |
print("State A") | |
let stateMachine = something.start().transitionX.transitionQ.transitionW |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment