diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-17 11:56:43 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-02-19 23:51:31 +0300 |
| commit | bd5339bff8bf5f5e877e94dfef265a22570a69c7 (patch) | |
| tree | 5902df7a9f21c00d9c414f6b0c2b79aadfd84752 /tmp/automap.go | |
| parent | df935315c7201b7d42eb361b3ac3d36fe83e53e6 (diff) | |
first working version
Diffstat (limited to 'tmp/automap.go')
| -rw-r--r-- | tmp/automap.go | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/tmp/automap.go b/tmp/automap.go new file mode 100644 index 0000000..187960c --- /dev/null +++ b/tmp/automap.go @@ -0,0 +1,103 @@ +package server + +import ( + "strconv" + "sort" + "fmt" + "io" +) + +type autokey struct { + flag bool + n int + v string +} + +type automap map[string]interface{} + +type autokeys []autokey + +func (t autokey) String() string { + return t.v +} + +func (t autokeys) Len() int { + return len(t) +} + +func (t autokeys) Less(i, j int) bool { + a := &t[i] + b := &t[j] + + if a.flag && b.flag { + return a.n < b.n + } + + if !a.flag && !b.flag { + return a.v < b.v + } + + return b.flag +} + +func (t autokeys) Swap(i, j int) { + t[i], t[j] = t[j], t[i] +} + +func (m automap) add(v interface{}) { + for n := 1;; n++ { + k := fmt.Sprint(n) + if _, ok := m[k]; !ok { + m[k] = v + break + } + } +} + +func (m automap) del(k string) bool { + if _, ok := m[k]; !ok { + return false + } + + delete(m, k) + + return true +} + +func (m automap) rename(old string, new string) bool { + if _, ok := m[old]; !ok { + return false + } + + if _, ok := m[new]; ok { + return false + } + + m[new] = m[old] + + delete(m, old) + + return true +} + +func (m automap) show(w io.Writer) { + var keys autokeys + + for k, _ := range m { + t := autokey{v: k} + + n, err := strconv.Atoi(k) + if err == nil { + t.flag = true + t.n = n + } + + keys = append(keys, t) + } + + sort.Sort(keys) + + for _, k := range keys { + fmt.Fprintln(w, k, m[k.v]) + } +} |
