Skip to content

Instantly share code, notes, and snippets.

@ijoshsmith
Created July 19, 2016 03:59
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 ijoshsmith/ed023849a29f48187174053ea04ecae4 to your computer and use it in GitHub Desktop.
Save ijoshsmith/ed023849a29f48187174053ea04ecae4 to your computer and use it in GitHub Desktop.
Uses the Concealment pattern to enable transforming the Morse code data model
/// Converts an `EncodedMessage` to an alternate representation.
struct MorseTransformation<T> {
let dot, dash, markSeparator, symbolSeparator, termSeparator: T
func apply(to encodedMessage: EncodedMessage) -> [T] {
return encodedMessage.apply(self)
}
}
private extension EncodedMessage {
func apply<T>(transformation: MorseTransformation<T>) -> [T] {
return encodedTerms
.map { $0.apply(transformation) }
.joinWithSeparator([transformation.termSeparator])
.toArray()
}
}
private extension EncodedTerm {
func apply<T>(transformation: MorseTransformation<T>) -> [T] {
return symbols
.map { $0.apply(transformation) }
.joinWithSeparator([transformation.symbolSeparator])
.toArray()
}
}
private extension Symbol {
func apply<T>(transformation: MorseTransformation<T>) -> [T] {
return marks
.map { $0.apply(transformation) }
.joinWithSeparator([transformation.markSeparator])
.toArray()
}
}
private extension Mark {
func apply<T>(transformation: MorseTransformation<T>) -> [T] {
return [self == .Dot ? transformation.dot : transformation.dash]
}
}
private extension JoinSequence {
func toArray() -> [Base.Generator.Element.Generator.Element] {
return Array(self)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment