Skip to content

Instantly share code, notes, and snippets.

@TramPamPam
Last active October 5, 2017 14:44
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 TramPamPam/d3a502446639e6f91e8fa18cb9683431 to your computer and use it in GitHub Desktop.
Save TramPamPam/d3a502446639e6f91e8fa18cb9683431 to your computer and use it in GitHub Desktop.
protocol Chainable {
var id: String? { get set }
var afterId: String? { get set }
}
extension Array where Element: Chainable {
func chained() -> [Element] {
let ids: [String] = self.flatMap{ return $0.id ?? "-1" }
let afterIds: [String] = self.flatMap{ return $0.afterId ?? "-1" }
var dict = [String: String]()
for i in 0..<ids.count {
dict[ids[i]] = afterIds[i]
}
let first = self.first{ $0.afterId == nil }
guard let firstId: String = first?.id else { return self }
var resIDS = [firstId]
var next = dict.first { $0.value == firstId }
while !dict.isEmpty && next != nil {
if let nextKey = next?.key {
resIDS.append(nextKey)
dict[nextKey] = nil
next = dict.first { $0.value == nextKey }
}
}
var res = [Element]()
resIDS.forEach { (anId) in
res.append(self.first{ $0.id == anId }!)
}
return res
}
}
// Usage:
// Assume we have some struct or class that confirms Chainable
struct Some: Chainable {
var id: String?
var afterId: String?
}
// We create not sorted array:
var arr: [Some] = []
arr.append(Some(id: "A, B, C,", afterId: nil))
arr.append(Some(id: "G, H, I,", afterId: "D, E, F,"))
arr.append(Some(id: "M, N, O,", afterId: "J, K, L,"))
arr.append(Some(id: "P, Q, R,", afterId: "M, N, O,"))
arr.append(Some(id: "S, T, U,", afterId: "P, Q, R,"))
arr.append(Some(id: "J, K, L,", afterId: "G, H, I,"))
arr.append(Some(id: "D, E, F,", afterId: "A, B, C,"))
arr.append(Some(id: "V, W, X, Y, Z.", afterId: "S, T, U,"))
// We want our arr to respect `afterId` property, so ids will make an alphabeth
// We now can do it like that:
arr = arr.chained()
//arr now [{{some "A, B, C,"}, nil}, {{some "G, H, I,"}, {some "D, E, F,"}}, {{some "M, N, O,"}, {some "J, K, L,"}}, {{some "P, Q, R,"}, {some "M, N, O,"}}, {{some "S, T, U,"}, {some "P, Q, R,"}}, {{some "J, K, L,"}, {some "G, H, I,"}}, {{some "D, E, F,"}, {some "A, B, C,"}}, {{some "V, W, X, Y, Z."}, {some "S, T, U,"}}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment