Last active
June 15, 2020 07:26
-
-
Save Yerazhas/1a630916d4db7df9e303f2dc4ecd23b2 to your computer and use it in GitHub Desktop.
A code snippet for code reviewer assignment
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
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