🎉🚀 May the concensus be with us!
This commit is contained in:
commit
48328e7db2
33 changed files with 4051 additions and 0 deletions
103
voting/quorum/quorum.go
Normal file
103
voting/quorum/quorum.go
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
package quorum
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Quorum uint8
|
||||
|
||||
const (
|
||||
Simple Quorum = iota
|
||||
OneFifth
|
||||
OneQuarter
|
||||
OneThird
|
||||
OneHalf
|
||||
TwoFifths
|
||||
TwoThirds
|
||||
ThreeQuarters
|
||||
ThreeFifths
|
||||
FourFifths
|
||||
Unanimous
|
||||
)
|
||||
|
||||
func ValidQuorums() []Quorum {
|
||||
return []Quorum{
|
||||
Simple,
|
||||
OneFifth, OneQuarter, OneThird, OneHalf,
|
||||
TwoThirds, TwoFifths,
|
||||
ThreeQuarters, ThreeFifths,
|
||||
FourFifths,
|
||||
}
|
||||
}
|
||||
|
||||
func FromString(s string) (Quorum, error) {
|
||||
for _, q := range ValidQuorums() {
|
||||
if strings.ToUpper(q.String()) == strings.ToUpper(s) {
|
||||
return q, nil
|
||||
}
|
||||
}
|
||||
return Simple, fmt.Errorf("inalid quorum: %s", s)
|
||||
}
|
||||
|
||||
func (q Quorum) String() string {
|
||||
switch q {
|
||||
case Simple:
|
||||
return "SIMPLE"
|
||||
case OneFifth:
|
||||
return "1/5"
|
||||
case OneQuarter:
|
||||
return "1/4"
|
||||
case OneThird:
|
||||
return "1/3"
|
||||
case OneHalf:
|
||||
return "1/2"
|
||||
case TwoThirds:
|
||||
return "2/3"
|
||||
case TwoFifths:
|
||||
return "2/5"
|
||||
case ThreeQuarters:
|
||||
return "3/4"
|
||||
case ThreeFifths:
|
||||
return "3/5"
|
||||
case FourFifths:
|
||||
return "4/5"
|
||||
case Unanimous:
|
||||
return "ALL"
|
||||
default:
|
||||
panic("this code should never be reached")
|
||||
}
|
||||
}
|
||||
|
||||
func (q Quorum) IsSatisfied(possibleVotes, totalVotes int) bool {
|
||||
if totalVotes == 0 {
|
||||
return false
|
||||
}
|
||||
switch q {
|
||||
case Simple:
|
||||
return true
|
||||
case OneFifth:
|
||||
return totalVotes * 5 >= possibleVotes
|
||||
case OneQuarter:
|
||||
return totalVotes * 4 >= possibleVotes
|
||||
case OneThird:
|
||||
return totalVotes * 3 >= possibleVotes
|
||||
case OneHalf:
|
||||
return totalVotes * 2 >= possibleVotes
|
||||
case TwoThirds:
|
||||
return totalVotes * 3 >= possibleVotes * 2
|
||||
case TwoFifths:
|
||||
return totalVotes * 5 >= possibleVotes * 2
|
||||
case ThreeQuarters:
|
||||
return totalVotes * 4 >= possibleVotes * 3
|
||||
case ThreeFifths:
|
||||
return totalVotes * 5 >= possibleVotes * 3
|
||||
case FourFifths:
|
||||
return totalVotes * 5 >= possibleVotes * 4
|
||||
case Unanimous:
|
||||
return totalVotes >= possibleVotes
|
||||
default:
|
||||
panic("this code should never be reached⚜️")
|
||||
}
|
||||
return false
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue