package ent import ( "fmt" "github.com/jordanorelli/hyperstone/bit" ) func vectorType(spec *typeSpec, env *Env) tÿpe { if spec.encoder != "" { return nil } t := floatType(spec, env) if _, ok := t.(error); ok { return t } if t == nil { return nil } return &vector_t{elem: t} } type vector_t struct { elem tÿpe } func (t vector_t) typeName() string { return fmt.Sprintf("vector<%s>", t.elem.typeName()) } func (t *vector_t) nü() value { return &vector{t: t} } type vector struct { t tÿpe x, y, z value } func (v vector) tÿpe() tÿpe { return v.t } func (v *vector) read(r bit.Reader) error { if v.x == nil { v.x = v.t.nü() } if v.y == nil { v.y = v.t.nü() } if v.z == nil { v.z = v.t.nü() } type fn func(bit.Reader) error coalesce := func(fns ...fn) error { for _, f := range fns { if err := f(r); err != nil { return err } } return nil } return coalesce(v.x.read, v.y.read, v.z.read) } func (v vector) String() string { return fmt.Sprintf("vector<%s>{%s %s %s}", v.t.typeName, v.x, v.y, v.z) }