# Inorequals

**URL:** <https://discourse.julialang.org/t/inorequals/68577>\
**Category:** General Usage\
**Created:** [September 22, 2021, 2:00pm UTC](https://discourse.julialang.org/t/inorequals/68577 "2021-09-22T14:00:24Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![gustaphe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gustaphe/32/18174_2.png) [@gustaphe](https://discourse.julialang.org/u/gustaphe)\
**Post date:** [September 22, 2021, 2:00pm UTC](https://discourse.julialang.org/t/inorequals/68577/1 "2021-09-22T14:00:24Z")

</div>

A fairly common pattern for me is to have a part of a function depend on what amounts to flags:

```julia
using Plots

function f(x; extras=[])
    pl = plot(x)
    if :v in extras
        vline!(pl, 0)
    end
    if :h in extras
       hline!(pl, 0)
    end
    return pl
end

```

I often find myself wanting something akin to

```julia
if extras === :h || extras isa AbstractArray && :h in extras

```

to allow scalar arguments to be passed as well as a vector. Is there a builtin workaround to make this less cumbersome? Or would you rewrite this? (perhaps `extras = extras isa AbstractArray ? extras : [extras]`) In my specific case, the most common usage would be to supply just one symbol, so it feels silly to enforce array-ness.

---

<div class="post-metadata">

**Author:** ![yha](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yha/32/3502_2.png) [@yha](https://discourse.julialang.org/u/yha)\
**Post date:** [September 22, 2021, 2:05pm UTC](https://discourse.julialang.org/t/inorequals/68577/2 "2021-09-22T14:05:18Z")

</div>

Two ideas:

1. `any(extras .== :h)`
2. At the start of your function, do `extras isa Symbol && (extras = [extras])` Edit: I now notice this is almost what you wrote in parentheses.

---

<div class="post-metadata">

**Author:** ![gustaphe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gustaphe/32/18174_2.png) [@gustaphe](https://discourse.julialang.org/u/gustaphe)\
**Post date:** [September 22, 2021, 2:06pm UTC](https://discourse.julialang.org/t/inorequals/68577/3 "2021-09-22T14:06:28Z")

</div>

```julia
function inorequals(a, b)
    try
        return a in b
    catch
        return a === b
    end
end

```

does the job, but feels a bit dirty.

---

<div class="post-metadata">

**Author:** ![gustaphe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gustaphe/32/18174_2.png) [@gustaphe](https://discourse.julialang.org/u/gustaphe)\
**Post date:** [September 22, 2021, 2:11pm UTC](https://discourse.julialang.org/t/inorequals/68577/4 "2021-09-22T14:11:50Z")

</div>

1. Oh, I tried the shortcutting `any(isequal(:h), extras)` (which errors with `no method iterate(::Symbol)`). Didn’t even consider a normal broadcasting, that’s probably the neatest solution.
2. Testing for `isa Symbol` is probably better than `isa AbstractArray`, because it catches `Tuple`s etc. too.

---

<div class="post-metadata">

**Author:** ![jonniedie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jonniedie/32/12842_2.png) [@jonniedie](https://discourse.julialang.org/u/jonniedie)\
**Post date:** [September 22, 2021, 2:46pm UTC](https://discourse.julialang.org/t/inorequals/68577/5 "2021-09-22T14:46:02Z")

</div>

You could do something like this. The symbol is typed out as `\in<TAB>\_=<TAB>`. You could define it directly as a function, but I feel like it’s a gross enough abuse of unicode that it should have an easy to type, written-out version as well.

```julia
julia> in_or_equals(a, b) = a==b || a∈b
in_or_equals (generic function with 1 method)

julia> const ∈₌ = in_or_equals
in_or_equals (generic function with 1 method)

julia> :v ∈₌ :v
true

julia> :v ∈₌ [:v, :h]
true

```

---

<div class="post-metadata">

**Author:** ![gustaphe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gustaphe/32/18174_2.png) [@gustaphe](https://discourse.julialang.org/u/gustaphe)\
**Post date:** [September 22, 2021, 3:22pm UTC](https://discourse.julialang.org/t/inorequals/68577/6 "2021-09-22T15:22:33Z")

</div>

The problem with that is `in(:a, :b)` is not `false`, it errors out.

---

<div class="post-metadata">

**Author:** ![jonniedie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jonniedie/32/12842_2.png) [@jonniedie](https://discourse.julialang.org/u/jonniedie)\
**Post date:** [September 22, 2021, 3:24pm UTC](https://discourse.julialang.org/t/inorequals/68577/7 "2021-09-22T15:24:46Z")

</div>

That’s why the `a==b` comes first. If b is not iterable (e.g. a `Symbol`), it will error on `in`. Doing it this way allows it to check for equality first and bypass the `in` if equality holds.

EDIT: Oh, I see what you mean. For something like `:v ∈₌ :h`, you hit an error because it goes to the `in` branch.

---

<div class="post-metadata">

**Author:** ![jonniedie](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jonniedie/32/12842_2.png) [@jonniedie](https://discourse.julialang.org/u/jonniedie)\
**Post date:** [September 22, 2021, 3:27pm UTC](https://discourse.julialang.org/t/inorequals/68577/8 "2021-09-22T15:27:25Z")

</div>

```julia
julia> in_or_equals(a, b) = a == b || any(a .== b)
in_or_equals (generic function with 1 method)

julia> :v ∈₌ :h
false

```
