about summary refs log tree commit diff
path: root/tools/seqstat/seqstat.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tools/seqstat/seqstat.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/tools/seqstat/seqstat.go b/tools/seqstat/seqstat.go
new file mode 100644
index 0000000..8709fa4
--- /dev/null
+++ b/tools/seqstat/seqstat.go
@@ -0,0 +1,63 @@
+package main
+
+import (
+	"bufio"
+	"flag"
+	"fmt"
+	"os"
+	"strconv"
+	"strings"
+)
+
+var (
+	stats = flag.Bool("S", false, "Display statistics about the sequence.")
+)
+
+func main() {
+	flag.Parse()
+
+	flag.Usage = func() {
+		fmt.Fprintf(os.Stderr, "usage: [-S] <INPUT>")
+		flag.PrintDefaults()
+	}
+
+	elements := argsToElements(flag.Args())
+
+	if len(elements) < 1 {
+		scanner := bufio.NewScanner(os.Stdin)
+		var e []string
+		for scanner.Scan() {
+			e = append(e, strings.Split(scanner.Text(), " ")...)
+		}
+		elements = argsToElements(e)
+	}
+
+	seq := newSequence(elements)
+
+	fmt.Println(string(seq.histogram()))
+
+	if *stats {
+		fmt.Printf("min:   %f\n", seq.min)
+		fmt.Printf("max:   %f\n", seq.max)
+		fmt.Printf("avg:   %f\n", seq.avg())
+		fmt.Printf("p50:   %f\n", seq.p50())
+		fmt.Printf("p90:   %f\n", seq.p90())
+		fmt.Printf("p99:   %f\n", seq.p99())
+		fmt.Printf("p999:  %f\n", seq.p999())
+		fmt.Printf("ordered sequence: %v\n", seq.elementsSorted)
+	}
+}
+
+// converts the input to float64
+func argsToElements(args []string) []float64 {
+	elements := make([]float64, len(args))
+
+	for i, input := range args {
+		num, err := strconv.ParseFloat(input, 64)
+		if err != nil {
+			panic(err)
+		}
+		elements[i] = num
+	}
+	return elements
+}