/* Sample file contents:
{"name": "Acme Corp", prices: [12, 14, 13, 18, 11, 14]}
{"name": "Example Enterprises", prices: [50, 49, 55, 53]}
Desired output written to a file:
{"name": "Example Enterprises", "buy_day": 1, "sell_day": 2}
...
*/
import (
"io"
"sys"
"fmt"
"ioutils"
"json"
)
package main
const fileName="foo.bar"
func main {
f,err:=io.ReadFile(fileName)
if err!=nil {
fmt.Printf("Error while reading file %s:%v",fileName,err)
sys.Exit(1)
}
c,err:=ioutil.ReadAll(f)
if err!=nil {
fmt.Printf("Error while reading contents of file %s:%v",fileName,err)
sys.Exit(1)
}
st:=stock{}
ch:=make(chan []byte,4)
ctlCh:=make(chan struct{},4)
for _,v:=range c {
<-ctlCh
go processEntry(v,ch,ctlCh)
}
}
func processEntry (v []byte,out <-chan []byte, in chan struct{}) {
err:=json.Unmarshal(&st,v)
if err!=nil {
fmt.Printf("Error while marshaling stock result %v:%v",r,err)
os.Exit(1)
}
min:=stockValue{}
max:=stockValue{}
for i,x:=range v.Prices {
if min.value==nil || (min.value!=nil && min.value > x){
min=stockValue{value:&x,day:i}
max=stockValue{}
continue
}
if max.value==nil || (max.value!=nil && max.value < x){
max=stockValue{value:&x,day:i}
}
}
r:=stockResult{Name:v.Name,BuyDay:min.day,SellDay:max.day}
b:=[]byte{}
err:=json.Marshal(b,r)
if err!=nil {
fmt.Printf("Error while marshaling stock result %v:%v",r,err)
os.Exit(1)
}
// here we write to a file
out <-b
in<-struct{}{}
}
type concurrentWrite struct {
f File
mux sync.Mux
}
type Write(b []byte) interface
func (c *concurrentWrite) Write(b []byte) {
c.mux.Lock()
defer c.mux.Unlock()
f.Write(b)
}
type stockResult struct {
Name string `json:"name"`
BuyDay int `json:"buy_day"`
SellDay int `json:"sell_day"`
}
type stockValue struct {
value *int
day int
}
type stock struct {
Name string `json:"name"`
Prices []int `json:"prices"`
}