forked from remotemobprogramming/mob
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfind_next.go
More file actions
56 lines (51 loc) · 1.46 KB
/
find_next.go
File metadata and controls
56 lines (51 loc) · 1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package main
func findNextTypist(lastCommitters []string, gitUserName string) (nextTypist string, previousCommitters []string) {
numberOfLastCommitters := len(lastCommitters)
for i := 0; i < numberOfLastCommitters; i++ {
if lastCommitters[i] == gitUserName && i > 0 {
nextTypist = lastCommitters[i-1]
if nextTypist != gitUserName {
// '2*i+1' defines how far we look ahead. It is the number of already processed elements.
lookaheadThreshold := min(2*i+1, len(lastCommitters))
previousMobber := lookahead(lastCommitters[:i], lastCommitters[i:lookaheadThreshold])
if previousMobber != "" {
nextTypist = previousMobber
}
return
}
}
// Do not add the last committer multiple times.
if i == 0 || previousCommitters[0] != lastCommitters[i] {
previousCommitters = prepend(previousCommitters, lastCommitters[i])
}
}
return
}
func lookahead(processedCommitters []string, previousCommitters []string) (nextTypist string) {
for i := 0; i < len(previousCommitters); i++ {
if !contains(processedCommitters, previousCommitters[i]) {
nextTypist = previousCommitters[i]
}
}
return
}
func contains(list []string, element string) bool {
for i := 0; i < len(list); i++ {
if list[i] == element {
return true
}
}
return false
}
func min(a int, b int) int {
if a < b {
return a
}
return b
}
func prepend(list []string, element string) []string {
list = append(list, element)
copy(list[1:], list)
list[0] = element
return list
}