summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--go/mixed-server.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/go/mixed-server.go b/go/mixed-server.go
index 44dfcdc..fd44591 100644
--- a/go/mixed-server.go
+++ b/go/mixed-server.go
@@ -1,8 +1,15 @@
package main
import (
+ "fmt"
+ "net/http"
+ "net/url"
+ "os"
+ "os/signal"
"sort"
+ "strings"
"sync"
+ "io"
)
type wordsByCount struct {
@@ -59,5 +66,64 @@ func (m *Model) GetMostCommonPairs(how_many uint) []string {
defer m.lock.RUnlock()
wbc := newWordsByCount(&m.words)
mcw := wbc.MostCommonWords()
+ if how_many >= uint(len(mcw)) {
+ how_many = uint(len(mcw))
+ }
return mcw[:how_many]
}
+
+type View struct{}
+
+func NewView() View {
+ return View{}
+}
+func (v View) WordsFromInput(input string) []string {
+ return strings.Fields(input)
+}
+func (v View) TableFromRankedPairs(ranked_pairs []string) string {
+ // we're not actually getting pairs, just strings
+ var b strings.Builder
+ for _, s := range ranked_pairs {
+ fmt.Fprintf(&b, "%s\n", s)
+ }
+ return b.String()
+}
+
+func NewHttpController(m Model, v View) *http.ServeMux {
+ controller := http.NewServeMux()
+ controller.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
+ if req.Method == "GET" {
+ uri, _ := url.Parse(req.RequestURI)
+ q := uri.Query()
+ n, _ := q["n"]
+ var how_many uint
+ if len(n) > 0 {
+ fmt.Sscanf(n[0], "%d", &how_many)
+ }
+ if how_many == 0 {
+ how_many = 10
+ }
+ most_common_pairs := m.GetMostCommonPairs(how_many)
+
+ table := v.TableFromRankedPairs(most_common_pairs)
+ strings.NewReader(table + "\n").WriteTo(w)
+ } else if req.Method == "POST" {
+ var body strings.Builder
+ io.Copy(&body,req.Body)
+ words := v.WordsFromInput(body.String())
+ m.AddWords(words)
+ }
+ })
+ return controller
+}
+
+func main() {
+ model := NewModel()
+ view := NewView()
+ httpcontroller := NewHttpController(model, view)
+ go http.ListenAndServe("localhost:8080", httpcontroller)
+
+ sigs := make(chan os.Signal, 1)
+ signal.Notify(sigs, os.Interrupt)
+ <-sigs
+}