func composeFloat32s(expr *ast.Expr) (funcs.Float32s, error) { uniq, err := prep(expr, types.LIST_FLOAT) if err != nil { return nil, err } if expr.List != nil { vs, err := newValues(expr.GetList().GetElems()) if err != nil { return nil, err } bs := make([]funcs.Float32, len(vs)) var ok bool for i := range vs { bs[i], ok = vs[i].(funcs.Float32) if !ok { return nil, &errExpected{types.SINGLE_FLOAT.String(), expr.String()} } } return funcs.NewListOfFloat32(bs), nil } values, err := newValues(expr.GetFunction().GetParams()) if err != nil { return nil, err } return funcs.NewFloat32sFunc(uniq, values...) }
func Which(expr *ast.Expr) (types.Type, error) { if expr.Terminal != nil { term := expr.GetTerminal() if term.DoubleValue != nil { return types.SINGLE_DOUBLE, nil } if term.FloatValue != nil { return types.SINGLE_FLOAT, nil } if term.Int64Value != nil { return types.SINGLE_INT64, nil } if term.Uint64Value != nil { return types.SINGLE_UINT64, nil } if term.Int32Value != nil { return types.SINGLE_INT32, nil } if term.BoolValue != nil { return types.SINGLE_BOOL, nil } if term.StringValue != nil { return types.SINGLE_STRING, nil } if term.BytesValue != nil { return types.SINGLE_BYTES, nil } if term.Uint32Value != nil { return types.SINGLE_UINT32, nil } if term.Variable != nil { return term.Variable.Type, nil } } if expr.List != nil { return expr.GetList().GetType(), nil } if expr.Function != nil { fnc := expr.GetFunction() uniq, err := WhichFunc(fnc) if err != nil { return 0, err } return funcs.Out(uniq) } return 0, &errUnknownType{expr} }