// © Broadcom. All Rights Reserved. // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. // SPDX-License-Identifier: Apache-2.0 package progress type scaledReport struct { Report n int i int } func (r scaledReport) Percentage() float32 { b := 100 * float32(r.i) / float32(r.n) return b + (r.Report.Percentage() / float32(r.n)) } type scaleOne struct { s Sinker n int i int } func (s scaleOne) Sink() chan<- Report { upstream := make(chan Report) downstream := s.s.Sink() go s.loop(upstream, downstream) return upstream } func (s scaleOne) loop(upstream <-chan Report, downstream chan<- Report) { defer close(downstream) for r := range upstream { downstream <- scaledReport{ Report: r, n: s.n, i: s.i, } } } type scaleMany struct { s Sinker n int i int } func Scale(s Sinker, n int) Sinker { return &scaleMany{ s: s, n: n, } } func (s *scaleMany) Sink() chan<- Report { if s.i == s.n { s.n++ } ch := scaleOne{s: s.s, n: s.n, i: s.i}.Sink() s.i++ return ch }