package builtins import ( "monkey/internal/context" "monkey/internal/object" "monkey/internal/typing" "sort" ) import ( "strings" ) // Find ... func Find(ctx context.Context, args ...object.Object) object.Object { if err := typing.Check( "find", args, typing.ExactArgs(2), ); err != nil { return newError(err.Error()) } // find substring in string if haystack, ok := args[0].(object.String); ok { if err := typing.Check( "find", args, typing.WithTypes(object.StringType, object.StringType), ); err != nil { return newError(err.Error()) } needle := args[1].(object.String) index := strings.Index(haystack.Value, needle.Value) return object.Integer{Value: int64(index)} } // find in array if haystack, ok := args[0].(*object.Array); ok { needle := args[1].(object.Comparable) i := sort.Search(len(haystack.Elements), func(i int) bool { return needle.Compare(haystack.Elements[i]) == 0 }) if i < len(haystack.Elements) && needle.Compare(haystack.Elements[i]) == 0 { return object.Integer{Value: int64(i)} } return object.Integer{Value: -1} } return newError( "TypeError: find() expected argument #1 to be `array` or `str` got `%d`", args[0].Type(), ) }