Skip to content

Instantly share code, notes, and snippets.

@Yerazhas
Last active June 15, 2020 07:26
Show Gist options
  • Save Yerazhas/1a630916d4db7df9e303f2dc4ecd23b2 to your computer and use it in GitHub Desktop.
Save Yerazhas/1a630916d4db7df9e303f2dc4ecd23b2 to your computer and use it in GitHub Desktop.
A code snippet for code reviewer assignment
final class Reviewer {
let name: String
var revieweesCount: Int
init(name: String) {
self.name = name
self.revieweesCount = 0
}
}
extension Reviewer: Equatable {
static func ==(_ lhs: Reviewer, _ rhs: Reviewer) -> Bool {
lhs.name == rhs.name
}
}
final class ReviewManager {
private let devs = [Reviewer(name: "Dosbol"),
Reviewer(name: "Kudaibergen"),
Reviewer(name: "Nurtugan"),
Reviewer(name: "Ulan"),
Reviewer(name: "Yerassyl")]
private var reviewersMap = [String: [String]]()
private let revieweesCount: Int
init(revieweesCount: Int) {
self.revieweesCount = revieweesCount
}
func buildReviewersMap() {
for dev in devs {
let reviewersPair = getReviewerPair(for: dev)
reviewersMap[dev.name] = reviewersPair
}
}
func getReviewersMap() -> [String: [String]] {
reviewersMap
}
private func getReviewerPair(for dev: Reviewer) -> [String] {
var reviewers = [String]()
var tempDevs = devs.filter { $0 != dev }
var assignedReviewers = [Reviewer]()
for _ in 0..<revieweesCount {
tempDevs = tempDevs.filter { !assignedReviewers.contains($0) && $0.revieweesCount < revieweesCount }
let reviewer = getReviewer(from: tempDevs)
assignedReviewers.append(reviewer)
reviewers.append(reviewer.name)
}
return reviewers
}
private func getReviewer(from filteredDevs: [Reviewer]) -> Reviewer {
var reviewer: Reviewer?
while reviewer == nil {
let tempReviewer = filteredDevs[Int.random(in: 0..<filteredDevs.count)]
if tempReviewer.revieweesCount < revieweesCount {
tempReviewer.revieweesCount += 1
reviewer = tempReviewer
}
}
return reviewer!
}
}
let reviewManager = ReviewManager(revieweesCount: 1)
reviewManager.buildReviewersMap()
let reviewersMap = reviewManager.getReviewersMap()
print(reviewersMap)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment