The partial ownership variant of the MutableData I proposed in RFC 47 topic would allow this.
The organizer creates such a MD with one value per voter, then transfers ownership to them so they can vote. The key of a value depends on the organization, it can be a user name or an anonymous identifier. Content of struct PartialData for each voter could be:
After MD creation:
After transfer to voters:
At any time, anyone can compute the results by reading the whole MD and summing:
votes for each choice
non-participating users (version = 1)
voters that have changed their minds (version > 2). Depending on the organization, this could be accepted or not.
All this is transparent and controlled by vaults. The voting app can be open source and decentralized, but each ballot is centralized because the organizer defines the question, decides who can vote and creates the MD (but this should be agreed within an organization).
The biggest problem is that the ballot never stops, meaning that users can still vote after agreed closure and so the proof of results is lost. But nothing can be done about this, because no date field can be reliably added until the network has a consensus about time.
Normally there is one MD per organization and ballot. This is okay for small organizations (<= 100, according to current maximum number of entries in RFC). For bigger organizations one MD must be created for each group of 100 and the results must be consolidated globally.