aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Lasseter <user@4574.co.uk>2019-05-28 15:38:15 +0100
committerNat Lasseter <user@4574.co.uk>2019-05-28 15:38:15 +0100
commit82e3e6660f13bcc260e73a92225e1fa0a3c3f8ed (patch)
tree6bad238301300b8a8ea6a054516282b830741eb0
parenta918f9b462b8966620d699d40a9072dcd2f5d3c7 (diff)
Another example becoming, more complex
-rw-r--r--becomings/fib.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/becomings/fib.go b/becomings/fib.go
new file mode 100644
index 0000000..c1e9958
--- /dev/null
+++ b/becomings/fib.go
@@ -0,0 +1,53 @@
+package main
+
+import (
+ "fmt"
+ "net"
+ "os"
+ "strconv"
+ "sync"
+)
+
+const (
+ LISTEN = "localhost:3334"
+)
+
+type becoming struct {
+ Fibmutex sync.Mutex
+ Last [2]int
+}
+
+func (b *becoming) Become() {
+ b.Last = [2]int{0, 0}
+ l, err := net.Listen("tcp", LISTEN)
+ if err != nil {
+ fmt.Println("Error listening: ", err.Error())
+ os.Exit(1)
+ }
+ defer l.Close()
+ for {
+ conn, err := l.Accept()
+ if err != nil {
+ fmt.Println("Error accepting: ", err.Error())
+ } else {
+ go handleRequest(conn, b)
+ }
+ }
+}
+
+func handleRequest(conn net.Conn, b *becoming) {
+ defer conn.Close()
+ b.Fibmutex.Lock()
+ defer b.Fibmutex.Unlock()
+ if b.Last == [2]int{0, 0} {
+ conn.Write([]byte(strconv.Itoa(0)))
+ b.Last[1] = 1
+ } else {
+ conn.Write([]byte(strconv.Itoa(b.Last[1])))
+ sum := b.Last[0] + b.Last[1]
+ b.Last[0] = b.Last[1]
+ b.Last[1] = sum
+ }
+}
+
+var Become becoming