X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=r3-netstatus%2Fbrain%2Fbrain.go;fp=r3-netstatus%2Fbrain%2Fbrain.go;h=c7c39402ad66bd1d9774b9514ef700062f1ab2c2;hb=3532254fdc34a8649a2894e8e746a4bf61947bde;hp=0000000000000000000000000000000000000000;hpb=6f78aae1eac804c1049def612920f9ddf9e189c8;p=svn42.git diff --git a/r3-netstatus/brain/brain.go b/r3-netstatus/brain/brain.go new file mode 100644 index 0000000..c7c3940 --- /dev/null +++ b/r3-netstatus/brain/brain.go @@ -0,0 +1,116 @@ +package brain + +import "errors" + +type informationtuple struct { + name string + value interface{} +} + +type informationretrievalpath struct { + name string + returnpath chan interface{} +} + +type hippocampus map[string]interface{} + +type Brain struct { + storeTuple chan informationtuple + retrieveValue chan informationretrievalpath + shutdown chan bool +} + +func New() *Brain { + b := new(Brain) + b.storeTuple = make(chan informationtuple) + b.retrieveValue = make(chan informationretrievalpath) + go b.runBrain() + return b +} + +func (b *Brain) runBrain() { + var h hippocampus = make(hippocampus) + for { + select { + case newtuple := <- b.storeTuple: + h[newtuple.name] = newtuple.value + + case retrievvalue := <- b.retrieveValue: + v, e := h[retrievvalue.name] + if e { + retrievvalue.returnpath <- v + } else { + retrievvalue.returnpath <- nil + } + + case <- b.shutdown: + break + } + } +} + +func (b *Brain) Shutdown() { + b.shutdown <- true +} + +func (b *Brain) Oboite(name string, value interface{}) { + b.storeTuple <- informationtuple{name, value} +} + +func (b *Brain) OmoiDashite(name string) (interface{}, error) { + rc := make(chan interface{}) + b.retrieveValue <- informationretrievalpath{name, rc} + v := <- rc + if v == nil { + return v, errors.New("name not in brain") + } + return v, nil +} + +func (b *Brain) OmoiDashiteBool(name string) (bool, error) { + v, e := b.OmoiDashite(name) + if e != nil { + return false, e + } + vc, ok := v.(bool) + if !ok { + return false, errors.New(name + " does not have type bool") + } + return vc, nil +} + +func (b *Brain) OmoiDashiteInt(name string) (int, error) { + v, e := b.OmoiDashite(name) + if e != nil { + return 0, e + } + vc, ok := v.(int) + if !ok { + return 0, errors.New(name + " does not have type int") + } + return vc, nil +} + +func (b *Brain) OmoiDashiteFloat(name string) (float64, error) { + v, e := b.OmoiDashite(name) + if e != nil { + return 0, e + } + vc, ok := v.(float64) + if !ok { + return 0, errors.New(name + " does not have type float64") + } + return vc, nil +} + +func (b *Brain) OmoiDashiteString(name string) (string, error) { + v, e := b.OmoiDashite(name) + if e != nil { + return "", e + } + vc, ok := v.(string) + if !ok { + return "", errors.New(name + " does not have type string") + } + return vc, nil +} \ No newline at end of file