inline optional<std::string> toString(const mbgl::android::Value& value) {
    if (value.isString()) {
        return value.toString();
    } else {
        return {};
    }
}
inline optional<bool> toBool(const mbgl::android::Value& value) {
    if (value.isBool()) {
        return value.toBool();
    } else {
        return {};
    }
}
inline optional<float> toNumber(const mbgl::android::Value& value) {
    if (value.isNumber()) {
        return value.toNumber();
    } else {
        return {};
    }
}
optional<std::array<LatLng, 4>> Converter<std::array<LatLng, 4>>::operator()(const mbgl::android::Value& value, Error& error) const {
    if (value.isNull() || !value.isArray()) {
        error = { "value cannot be converted to LatLng array" };
        return {};
    }

    return convert<GeoJSON>(value.toString(), error);
}
inline optional<mbgl::android::Value> objectMember(const mbgl::android::Value& value, const char* key) {
    mbgl::android::Value member = value.get(key);

    if (!member.isNull()) {
        return member;
    } else {
        return {};
    }
}
inline optional<Value> toValue(const mbgl::android::Value& value) {
    if (value.isNull()) {
        return {};
    } else if (value.isBool()) {
        return { value.toBool() };
    } else if (value.isString()) {
        return { value.toString() };
    } else if (value.isNumber()) {
        //Need to cast to a double here as the float is otherwise considered a bool...
        return { (double) value.toNumber() };
    } else {
        return {};
    }
}
inline optional<Value> toValue(const mbgl::android::Value& value) {
    if (value.isBool()) {
        return { value.toBool() };
    } else if (value.isString()) {
        return { value.toString() };
    } else if (value.isNumber()) {
       return { value.toNumber() };
    } else {
        return {};
    }
}
inline mbgl::android::Value arrayMember(const mbgl::android::Value& value, std::size_t i) {
    return value.get(i);
}
inline std::size_t arrayLength(const mbgl::android::Value& value) {
    return value.getLength();;
}
inline bool isObject(const mbgl::android::Value& value) {
    return value.isObject();
}
inline bool isArray(const mbgl::android::Value& value) {
    return value.isArray();
}
inline bool isUndefined(const mbgl::android::Value& value) {
    return value.isNull();
}