From f337a14154b488233804202f4cfb0fa777cfdf51 Mon Sep 17 00:00:00 2001 From: Inanc Gumus Date: Wed, 24 Apr 2019 22:33:54 +0300 Subject: [PATCH] reorganize: x-tba --- x-tba/{6-methods => 2-methods}/README.md | 0 .../xxx-project-file-parser}/log.txt | 0 .../xxx-project-file-parser}/main.go | 0 .../xxx-project-file-parser}/parser.go | 4 +- .../{7-interfaces => 3-interfaces}/README.md | 0 .../README.md | 0 .../xxx-project-file-parser/01-funcs/main.go | 70 ----------- .../01-funcs/parser.go | 109 ------------------ .../02-pointers/log.txt | 6 - .../02-pointers/main.go | 56 --------- .../02-pointers/parser.go | 108 ----------------- .../03-methods/log.txt | 6 - 12 files changed, 2 insertions(+), 357 deletions(-) rename x-tba/{6-methods => 2-methods}/README.md (100%) rename x-tba/{6-methods/xxx-project-file-parser/01-funcs => 2-methods/xxx-project-file-parser}/log.txt (100%) rename x-tba/{6-methods/xxx-project-file-parser/03-methods => 2-methods/xxx-project-file-parser}/main.go (100%) rename x-tba/{6-methods/xxx-project-file-parser/03-methods => 2-methods/xxx-project-file-parser}/parser.go (98%) rename x-tba/{7-interfaces => 3-interfaces}/README.md (100%) rename x-tba/{8-concurrency => 4-concurrency}/README.md (100%) delete mode 100644 x-tba/6-methods/xxx-project-file-parser/01-funcs/main.go delete mode 100644 x-tba/6-methods/xxx-project-file-parser/01-funcs/parser.go delete mode 100644 x-tba/6-methods/xxx-project-file-parser/02-pointers/log.txt delete mode 100644 x-tba/6-methods/xxx-project-file-parser/02-pointers/main.go delete mode 100644 x-tba/6-methods/xxx-project-file-parser/02-pointers/parser.go delete mode 100644 x-tba/6-methods/xxx-project-file-parser/03-methods/log.txt diff --git a/x-tba/6-methods/README.md b/x-tba/2-methods/README.md similarity index 100% rename from x-tba/6-methods/README.md rename to x-tba/2-methods/README.md diff --git a/x-tba/6-methods/xxx-project-file-parser/01-funcs/log.txt b/x-tba/2-methods/xxx-project-file-parser/log.txt similarity index 100% rename from x-tba/6-methods/xxx-project-file-parser/01-funcs/log.txt rename to x-tba/2-methods/xxx-project-file-parser/log.txt diff --git a/x-tba/6-methods/xxx-project-file-parser/03-methods/main.go b/x-tba/2-methods/xxx-project-file-parser/main.go similarity index 100% rename from x-tba/6-methods/xxx-project-file-parser/03-methods/main.go rename to x-tba/2-methods/xxx-project-file-parser/main.go diff --git a/x-tba/6-methods/xxx-project-file-parser/03-methods/parser.go b/x-tba/2-methods/xxx-project-file-parser/parser.go similarity index 98% rename from x-tba/6-methods/xxx-project-file-parser/03-methods/parser.go rename to x-tba/2-methods/xxx-project-file-parser/parser.go index 7c48e57..94fe141 100644 --- a/x-tba/6-methods/xxx-project-file-parser/03-methods/parser.go +++ b/x-tba/2-methods/xxx-project-file-parser/parser.go @@ -96,7 +96,7 @@ func (p *parser) parse(line string) (dom domain, err error) { fields := strings.Fields(line) if len(fields) != 2 { err = fmt.Errorf("wrong input: %v (line #%d)", fields, p.lines) - return dom, err + return } name, visits := fields[0], fields[1] @@ -104,7 +104,7 @@ func (p *parser) parse(line string) (dom domain, err error) { n, err := strconv.Atoi(visits) if n < 0 || err != nil { err = fmt.Errorf("wrong input: %q (line #%d)", visits, p.lines) - return dom, err + return } return domain{name: name, visits: n}, nil diff --git a/x-tba/7-interfaces/README.md b/x-tba/3-interfaces/README.md similarity index 100% rename from x-tba/7-interfaces/README.md rename to x-tba/3-interfaces/README.md diff --git a/x-tba/8-concurrency/README.md b/x-tba/4-concurrency/README.md similarity index 100% rename from x-tba/8-concurrency/README.md rename to x-tba/4-concurrency/README.md diff --git a/x-tba/6-methods/xxx-project-file-parser/01-funcs/main.go b/x-tba/6-methods/xxx-project-file-parser/01-funcs/main.go deleted file mode 100644 index d79c157..0000000 --- a/x-tba/6-methods/xxx-project-file-parser/01-funcs/main.go +++ /dev/null @@ -1,70 +0,0 @@ -// For more tutorials: https://blog.learngoprogramming.com -// -// Copyright © 2018 Inanc Gumus -// Learn Go Programming Course -// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ -// - -package main - -import ( - "bufio" - "fmt" - "os" -) - -func main() { - in := bufio.NewScanner(os.Stdin) - - p := newParser() - for in.Scan() { - // dom, err := parse(p, in.Text()) - // if err != nil { - // fmt.Println(err) - // return - // } - - // p = push(p, dom) - - p = add(p, in.Text()) - } - - summarize(p) - dumpErrs(in.Err(), err(p)) -} - -// funcs not always need to be reused. -// here, it tells about what it does: it summarizes the parsing result. -func summarize(p parser) { - // multiple iterators can be created. each one remembers the last - // read domain record. - next, cur := iterator(p) - for next() { - dom := cur() - fmt.Printf("%-25s -> %d\n", dom.name, dom.visits) - } - fmt.Printf("\n%-25s -> %d\n", "TOTAL", p.total) -} - -// // funcs not always need to be reused. -// // here, it tells about what it does: it summarizes the parsing result. -// func summarize(p parser) { -// // Print the visits per domain -// for _, d := range p.domains { -// vis := p.sum[d.name] - -// fmt.Printf("%-25s -> %d\n", d.name, vis) -// } - -// // Print the total visits for all domains -// fmt.Printf("\n%-25s -> %d\n", "TOTAL", p.total) -// } - -// this variadic func simplifies the multiple error handling -func dumpErrs(errs ...error) { - for _, err := range errs { - if err != nil { - fmt.Printf("> Err: %s\n", err) - } - } -} diff --git a/x-tba/6-methods/xxx-project-file-parser/01-funcs/parser.go b/x-tba/6-methods/xxx-project-file-parser/01-funcs/parser.go deleted file mode 100644 index 70daef6..0000000 --- a/x-tba/6-methods/xxx-project-file-parser/01-funcs/parser.go +++ /dev/null @@ -1,109 +0,0 @@ -package main - -import ( - "fmt" - "strconv" - "strings" -) - -// domain represents a domain log record -type domain struct { - name string - visits int -} - -// parser parses a log file and provides an iterator to iterate upon the domains -// -// the parser struct is carefully crafted to be usable using its zero values except the map field. -type parser struct { - sum map[string]int // visits per unique domain - domains []domain // unique domain names - total int // total visits to all domains - lines int // number of parsed lines (for the error messages) - err error // saves the last error occurred -} - -// newParser creates and returns a new parser. -func newParser() parser { - return parser{sum: make(map[string]int)} -} - -func add(p parser, line string) parser { - // if there was a previous error do not add - if p.err != nil { - return p - } - - p, dom, err := parse(p, line) - - // store only the last error - if err != nil { - p.err = err - return p - } - - return push(p, dom) -} - -// iterator returns two functions for iterating over domains. -// next = returns true when there are more domains to iterate on. -// cur = returns the current domain -// -// READ METHOD -func iterator(p parser) (next func() bool, cur func() domain) { - // remember the last received line - var last int - - next = func() bool { - defer func() { last++ }() - return len(p.domains) > last - } - - cur = func() domain { - d := p.domains[last-1] - vis := p.sum[d.name] - - // return a copy so the caller cannot change it - return domain{name: d.name, visits: vis} - } - - return -} - -// error returns the last error occurred -// -// READ METHOD -func err(p parser) error { - return p.err -} - -func parse(p parser, line string) (pr parser, dom domain, err error) { - p.lines++ // increase the parsed line counter (only write is here) - - fields := strings.Fields(line) - if len(fields) != 2 { - err = fmt.Errorf("wrong input: %v (line #%d)", fields, p.lines) - return p, dom, err - } - - name, visits := fields[0], fields[1] - - n, err := strconv.Atoi(visits) - if n < 0 || err != nil { - err = fmt.Errorf("wrong input: %q (line #%d)", visits, p.lines) - return p, dom, err - } - - return p, domain{name: name, visits: n}, nil -} - -func push(p parser, d domain) parser { - // collect the unique domains - if _, ok := p.sum[d.name]; !ok { - p.domains = append(p.domains, d) - } - - p.sum[d.name] += d.visits - p.total += d.visits - return p -} diff --git a/x-tba/6-methods/xxx-project-file-parser/02-pointers/log.txt b/x-tba/6-methods/xxx-project-file-parser/02-pointers/log.txt deleted file mode 100644 index fb2432b..0000000 --- a/x-tba/6-methods/xxx-project-file-parser/02-pointers/log.txt +++ /dev/null @@ -1,6 +0,0 @@ -learngoprogramming.com 10 -learngoprogramming.com 10 -golang.org 4 -golang.org 6 -blog.golang.org 20 -blog.golang.org 10 \ No newline at end of file diff --git a/x-tba/6-methods/xxx-project-file-parser/02-pointers/main.go b/x-tba/6-methods/xxx-project-file-parser/02-pointers/main.go deleted file mode 100644 index 819e044..0000000 --- a/x-tba/6-methods/xxx-project-file-parser/02-pointers/main.go +++ /dev/null @@ -1,56 +0,0 @@ -// For more tutorials: https://blog.learngoprogramming.com -// -// Copyright © 2018 Inanc Gumus -// Learn Go Programming Course -// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ -// - -package main - -import ( - "bufio" - "fmt" - "os" -) - -func main() { - in := bufio.NewScanner(os.Stdin) - - p := newParser() - for in.Scan() { - // dom, err := parse(p, in.Text()) - // if err != nil { - // fmt.Println(err) - // return - // } - - // p = push(p, dom) - - add(p, in.Text()) - } - - summarize(p) - dumpErrs(in.Err(), err(p)) -} - -// funcs not always need to be reused. -// here, it tells about what it does: it summarizes the parsing result. -func summarize(p *parser) { - // multiple iterators can be created. each one remembers the last - // read domain record. - next, cur := iterator(p) - for next() { - dom := cur() - fmt.Printf("%-25s -> %d\n", dom.name, dom.visits) - } - fmt.Printf("\n%-25s -> %d\n", "TOTAL", p.total) -} - -// this variadic func simplifies the multiple error handling -func dumpErrs(errs ...error) { - for _, err := range errs { - if err != nil { - fmt.Printf("> Err: %s\n", err) - } - } -} diff --git a/x-tba/6-methods/xxx-project-file-parser/02-pointers/parser.go b/x-tba/6-methods/xxx-project-file-parser/02-pointers/parser.go deleted file mode 100644 index 5cfb6ab..0000000 --- a/x-tba/6-methods/xxx-project-file-parser/02-pointers/parser.go +++ /dev/null @@ -1,108 +0,0 @@ -package main - -import ( - "fmt" - "strconv" - "strings" -) - -// domain represents a domain log record -type domain struct { - name string - visits int -} - -// parser parses a log file and provides an iterator to iterate upon the domains -// -// the parser struct is carefully crafted to be usable using its zero values except the map field -type parser struct { - sum map[string]int // visits per unique domain - domains []domain // unique domain names - total int // total visits to all domains - lines int // number of parsed lines (for the error messages) - err error // saves the last error occurred -} - -// newParser creates and returns a new parser. -func newParser() *parser { - return &parser{sum: make(map[string]int)} -} - -func add(p *parser, line string) { - // if there was a previous error do not add - if p.err != nil { - return - } - - dom, err := parse(p, line) - - // store only the last error - if err != nil { - p.err = err - return - } - - push(p, dom) -} - -// iterator returns two functions for iterating over domains. -// next = returns true when there are more domains to iterate on. -// cur = returns the current domain -// -// READ METHOD -func iterator(p *parser) (next func() bool, cur func() domain) { - // remember the last received line - var last int - - next = func() bool { - defer func() { last++ }() - return len(p.domains) > last - } - - cur = func() domain { - d := p.domains[last-1] - vis := p.sum[d.name] - - // return a copy so the caller cannot change it - return domain{name: d.name, visits: vis} - } - - return -} - -// error returns the last error occurred -// -// READ METHOD -func err(p *parser) error { - return p.err -} - -func parse(p *parser, line string) (dom domain, err error) { - p.lines++ // increase the parsed line counter (only write is here) - - fields := strings.Fields(line) - if len(fields) != 2 { - err = fmt.Errorf("wrong input: %v (line #%d)", fields, p.lines) - return dom, err - } - - name, visits := fields[0], fields[1] - - n, err := strconv.Atoi(visits) - if n < 0 || err != nil { - err = fmt.Errorf("wrong input: %q (line #%d)", visits, p.lines) - return dom, err - } - - return domain{name: name, visits: n}, nil -} - -func push(p *parser, d domain) { - // collect the unique domains - if _, ok := p.sum[d.name]; !ok { - p.domains = append(p.domains, d) - } - - p.sum[d.name] += d.visits - p.total += d.visits -} diff --git a/x-tba/6-methods/xxx-project-file-parser/03-methods/log.txt b/x-tba/6-methods/xxx-project-file-parser/03-methods/log.txt deleted file mode 100644 index fb2432b..0000000 --- a/x-tba/6-methods/xxx-project-file-parser/03-methods/log.txt +++ /dev/null @@ -1,6 +0,0 @@ -learngoprogramming.com 10 -learngoprogramming.com 10 -golang.org 4 -golang.org 6 -blog.golang.org 20 -blog.golang.org 10 \ No newline at end of file