From dc31b5bde1a7ec55eb05197089da256f388ce43e Mon Sep 17 00:00:00 2001
From: capossele <angelocapossele@gmail.com>
Date: Thu, 26 Mar 2020 19:17:07 +0000
Subject: [PATCH] :sparkles: adds Float64()

---
 packages/binary/drng/state/state.go      | 16 +++++++++++-----
 packages/binary/drng/state/state_test.go |  9 +++++++++
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/packages/binary/drng/state/state.go b/packages/binary/drng/state/state.go
index b0a89b50..f29f2253 100644
--- a/packages/binary/drng/state/state.go
+++ b/packages/binary/drng/state/state.go
@@ -1,6 +1,7 @@
 package state
 
 import (
+	"encoding/binary"
 	"sync"
 	"time"
 
@@ -13,6 +14,11 @@ type Randomness struct {
 	Timestamp  time.Time
 }
 
+// Float64 returns a float64 [0.0,1.0) rapresentation of the randomness byte slice
+func (r Randomness) Float64() float64 {
+	return float64(binary.BigEndian.Uint64(r.Randomness[:8])>>11) / (1 << 53)
+}
+
 type Committee struct {
 	InstanceID    uint32
 	Threshold     uint8
@@ -21,7 +27,7 @@ type Committee struct {
 }
 type State struct {
 	randomness *Randomness
-	committe   *Committee
+	committee  *Committee
 
 	mutex sync.RWMutex
 }
@@ -34,7 +40,7 @@ func New(setters ...Option) *State {
 	}
 	return &State{
 		randomness: args.Randomness,
-		committe:   args.Committee,
+		committee:  args.Committee,
 	}
 }
 
@@ -56,14 +62,14 @@ func (s *State) Randomness() Randomness {
 func (s *State) SetCommittee(c *Committee) {
 	s.mutex.Lock()
 	defer s.mutex.Unlock()
-	s.committe = c
+	s.committee = c
 }
 
 func (s *State) Committee() Committee {
 	s.mutex.RLock()
 	defer s.mutex.RUnlock()
-	if s.committe == nil {
+	if s.committee == nil {
 		return Committee{}
 	}
-	return *s.committe
+	return *s.committee
 }
diff --git a/packages/binary/drng/state/state_test.go b/packages/binary/drng/state/state_test.go
index 314241ed..ac8c881b 100644
--- a/packages/binary/drng/state/state_test.go
+++ b/packages/binary/drng/state/state_test.go
@@ -40,3 +40,12 @@ func TestState(t *testing.T) {
 	stateTest.SetRandomness(newRandomness)
 	require.Equal(t, *newRandomness, stateTest.Randomness())
 }
+
+func TestFloat64(t *testing.T) {
+
+	max := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
+	r := &Randomness{1, max, time.Now()}
+	stateTest := New(SetRandomness(r))
+	require.Equal(t, 0.9999999999999999, stateTest.Randomness().Float64())
+
+}
-- 
GitLab