1package list
2
3import (
4	"sort"
5)
6
7type Item interface {
8	Len() int
9}
10
11type Column struct {
12	total   int
13	sorted  bool
14	lengths sort.IntSlice
15}
16
17func (c *Column) sort() {
18	if !c.sorted {
19		c.lengths.Sort()
20		c.sorted = true
21	}
22}
23
24func (c *Column) Add(item string) {
25	ln := len(item)
26	c.lengths = append(c.lengths, ln)
27	c.total += len(item)
28	c.sorted = false
29}
30
31func (c *Column) Avg() int {
32	if c.lengths.Len() == 0 {
33		return 0
34	}
35	return c.total / c.lengths.Len()
36}
37
38func (c *Column) Max() int {
39	if len(c.lengths) == 0 {
40		return 0
41	}
42	c.sort()
43	return c.lengths[len(c.lengths)-1]
44}
45
46func (c *Column) Median() int {
47	c.sort()
48	ln := c.lengths.Len()
49	mid := ln / 2
50	if ln == 0 {
51		return 0
52	} else if ln%2 == 1 {
53		return c.lengths[mid]
54	}
55	return (c.lengths[mid-1] + c.lengths[mid]) / 2
56}
57
58func (c *Column) Remove(item string) {
59	idx := c.lengths.Search(len(item))
60	if idx >= c.lengths.Len() {
61		return
62	} else if idx == c.lengths.Len()-1 {
63		c.lengths = c.lengths[:idx]
64	} else {
65		c.lengths = append(c.lengths[:idx], c.lengths[idx+1:]...)
66	}
67	c.total -= len(item)
68	c.sorted = false
69}
70
71func (c *Column) Set(items []string) {
72	c.lengths = make(sort.IntSlice, len(items))
73	c.sorted = false
74	c.total = 0
75
76	for i, item := range items {
77		ln := len(item)
78		c.lengths[i] = ln
79		c.total += c.lengths[i]
80	}
81
82	c.sort()
83}
84