diff --git a/src/numbers/numbers.go b/src/numbers/numbers.go index c82c9c4..3020ab6 100644 --- a/src/numbers/numbers.go +++ b/src/numbers/numbers.go @@ -129,13 +129,14 @@ func numbersHandler(w http.ResponseWriter, r *http.Request) { // sort fallthrough, either the inputChan is currently "empty" // or we fetched all URLs already - go func(n []int) { - res, err := sort.SortedAndDedup(ctx, n) + go func(sorted []int, unsorted_buffer []int) { + res, err := sort.SortedAndDedup(ctx, unsorted_buffer) if err != nil { return } - sortChan <- res - }(append(sortedNumbers, numberBuffer...)) + merged := sort.MergeLists(sortedNumbers, res) + sortChan <- merged + }(sortedNumbers, numberBuffer) numberBuffer = []int{} select { diff --git a/src/numbers/sort/sort.go b/src/numbers/sort/sort.go index 6c35248..e4ddbf9 100644 --- a/src/numbers/sort/sort.go +++ b/src/numbers/sort/sort.go @@ -6,6 +6,39 @@ import ( "fmt" ) +// Merge too already sorted and deduplicated lists. +func MergeLists(l []int, r []int) []int { + n := []int{} + + i := 0 + j := 0 + for { + if i == len(l) && j == len(r) { + break + } else if i == len(l) { + n = append(n, r[j:]...) + break + } else if j == len(r) { + n = append(n, l[i:]...) + break + } + + if l[i] < r[j] { + n = append(n, l[i]) + i++ + } else if l[i] > r[j] { + n = append(n, r[j]) + j++ + } else if l[i] == r[j] { + n = append(n, l[i]) + i++ + j++ + } + } + + return n +} + // Mergesorts and deduplicates the list. func SortedAndDedup(ctx context.Context, list []int) (res []int, err error) { sorted, err := Mergesort(ctx, list) diff --git a/src/numbers/sort/sort_test.go b/src/numbers/sort/sort_test.go index 32595fd..b71c2e5 100644 --- a/src/numbers/sort/sort_test.go +++ b/src/numbers/sort/sort_test.go @@ -5,6 +5,40 @@ import ( "testing" ) +func TestMergeLists(t *testing.T) { + ls := [][]int{ + {1, 3, 4, 5, 7}, + {1, 3, 4, 5, 7}, + {}, + {1, 3, 4, 5, 7}, + {}, + } + + rs := [][]int{ + {3, 4, 6, 9}, + {}, + {1, 3, 4, 5, 7}, + {3, 5, 7}, + {}, + } + + result := [][]int{ + {1, 3, 4, 5, 6, 7, 9}, + {1, 3, 4, 5, 7}, + {1, 3, 4, 5, 7}, + {1, 3, 4, 5, 7}, + {}, + } + + for i := range ls { + merge := MergeLists(ls[i], rs[i]) + if slice_equal(merge, result[i]) != true { + t.Errorf("Failure in merging, expected %s got %s", result[i], merge) + } + } + +} + // Test the mergesort and deduplication with a predefined set of slices. func TestSortAndDedup(t *testing.T) { ctx, cancel := context.WithCancel(context.Background())