package state import ( "sort" "time" ) // weightedTime for computing a median. type weightedTime struct { Time time.Time Weight int64 } // newWeightedTime with time and weight. func newWeightedTime(time time.Time, weight int64) *weightedTime { return &weightedTime{ Time: time, Weight: weight, } } // weightedMedian computes weighted median time for a given array of WeightedTime and the total voting power. func weightedMedian(weightedTimes []*weightedTime, totalVotingPower int64) (res time.Time) { median := totalVotingPower / 2 sort.Slice(weightedTimes, func(i, j int) bool { if weightedTimes[i] == nil { return false } if weightedTimes[j] == nil { return true } return weightedTimes[i].Time.UnixNano() < weightedTimes[j].Time.UnixNano() }) for _, weightedTime := range weightedTimes { if weightedTime != nil { if median <= weightedTime.Weight { res = weightedTime.Time break } median -= weightedTime.Weight } } return }