vote_set.gno
1.79 Kb ยท 105 lines
1package groups
2
3import (
4 "std"
5 "time"
6
7 "gno.land/p/demo/rat"
8)
9
10//----------------------------------------
11// VoteSet
12
13type VoteSet interface {
14 // number of present votes in set.
15 Size() int
16 // add or update vote for voter.
17 SetVote(voter std.Address, value string) error
18 // count the number of votes for value.
19 CountVotes(value string) int
20}
21
22//----------------------------------------
23// VoteList
24
25type Vote struct {
26 Voter std.Address
27 Value string
28}
29
30type VoteList []Vote
31
32func NewVoteList() *VoteList {
33 return &VoteList{}
34}
35
36func (vlist *VoteList) Size() int {
37 return len(*vlist)
38}
39
40func (vlist *VoteList) SetVote(voter std.Address, value string) error {
41 // TODO optimize with binary algorithm
42 for i, vote := range *vlist {
43 if vote.Voter == voter {
44 // update vote
45 (*vlist)[i] = Vote{
46 Voter: voter,
47 Value: value,
48 }
49 return nil
50 }
51 }
52 *vlist = append(*vlist, Vote{
53 Voter: voter,
54 Value: value,
55 })
56 return nil
57}
58
59func (vlist *VoteList) CountVotes(target string) int {
60 // TODO optimize with binary algorithm
61 var count int
62 for _, vote := range *vlist {
63 if vote.Value == target {
64 count++
65 }
66 }
67 return count
68}
69
70//----------------------------------------
71// Committee
72
73type Committee struct {
74 Quorum rat.Rat
75 Threshold rat.Rat
76 Addresses std.AddressSet
77}
78
79//----------------------------------------
80// VoteSession
81// NOTE: this seems a bit too formal and
82// complicated vs what might be possible;
83// something simpler, more informal.
84
85type SessionStatus int
86
87const (
88 SessionNew SessionStatus = iota
89 SessionStarted
90 SessionCompleted
91 SessionCanceled
92)
93
94type VoteSession struct {
95 Name string
96 Creator std.Address
97 Body string
98 Start time.Time
99 Deadline time.Time
100 Status SessionStatus
101 Committee *Committee
102 Votes VoteSet
103 Choices []string
104 Result string
105}