Evaluate left-or-right Originally sandboxed by @xnor
Left-or-right is a very simple language @xnor made up. Its expressions are made of arrows &lt; (left), &gt; (right), and parentheses. The goal is to evaluate an expression to either &lt; or &gt;.
An expression A&lt;B picks the left item A, while A&gt;B picks the right one B. Think of &lt; and &gt; as arrows pointing to the item we want, not as comparison operators.
Take, for example, &gt;&lt;&gt;. The operator in the middle is &lt;, and confusingly, the items on each side A and B are also arrows. Since the operator tells us to take the left one A, which is &gt;. So, &gt;&lt;&gt; equals &gt;.
Expressions also nest. We can replace the expression with its value. So, for example, (&gt;&lt;&gt;)&lt;&lt; equals &gt;&lt;&lt; equals &gt;. And, &gt;(&gt;&lt;&gt;)&lt; equals &gt;&gt;&lt; equals &lt;. For another example, (&gt;&lt;&gt;)(&lt;&lt;&lt;)(&gt;&gt;&lt;) equals &gt;&lt;&lt; equals &gt;.
In the input, you'll be given a well-formed expression consisting of either a trio of arrows like &gt;&lt;&gt; or the result of repeatedly replacing some arrow by a trio of arrows in parens like &gt;&lt;(`&gt;&lt;&gt;`) . You can assume the input won't already be a lone arrow. You may alternately accept the whole inputs encased in parens like (&gt;&lt;&gt;) or (&lt;(&gt;&lt;&gt;)&gt;).
The input is given as a flat string consisting of symbols &lt;&gt;(). You may not take it in a pre-parsed form like a tree.
The shortest code in bytes wins.
Test cases
Generated using this script.
Evaluates to &lt;
&gt;&gt;&lt;
&lt;&lt;(&lt;&gt;&lt;)
(&gt;&gt;&gt;)&gt;&lt;
(&lt;(&lt;&lt;&gt;)(&lt;&lt;&lt;))&lt;&lt;
((&gt;(&gt;&gt;&lt;)&gt;)(&gt;&lt;&gt;)&gt;)&gt;&lt;
(&lt;&lt;(&gt;(&lt;&gt;&gt;)&lt;))((&gt;&lt;&gt;)(&gt;&lt;&lt;)&gt;)(&lt;&lt;&lt;)
((&lt;&lt;&lt;)&lt;&gt;)((&gt;&gt;&lt;)&lt;(&lt;&gt;&lt;))((&gt;&gt;&gt;)&lt;&lt;)
&gt;(&gt;((&gt;&lt;&gt;)&lt;&gt;)(&lt;&gt;&gt;))((&gt;&gt;&lt;)((&gt;&lt;&gt;)&lt;&lt;)&lt;)
((&gt;&lt;&lt;)(&gt;&lt;&lt;)(&lt;&lt;&gt;))(&lt;(&gt;&gt;&lt;)(&gt;&gt;&lt;))(&lt;&lt;(&lt;&lt;&gt;))
(&lt;(&gt;&lt;&lt;)(&gt;(&gt;&gt;&gt;)&gt;))((&gt;&gt;&gt;)&gt;&gt;)((&lt;&gt;(&gt;&gt;&lt;))&lt;&lt;)

Evaluates to &gt;
&lt;&gt;&gt;
((&lt;&lt;&lt;)&gt;(&lt;&lt;&gt;))(&gt;&lt;&lt;)&gt;
((&gt;&gt;&gt;)&lt;&gt;)&lt;((&lt;&lt;&lt;)&gt;&gt;)
&gt;(&gt;&gt;(&lt;&lt;&lt;))(&gt;((&lt;&gt;&gt;)&lt;&lt;)&lt;)
((&gt;&lt;&gt;)(&lt;&lt;&gt;)&gt;)(&lt;&lt;(&lt;&lt;&lt;))(&lt;(&gt;&gt;&gt;)&lt;)
(&gt;&lt;((&gt;&lt;&gt;)&gt;&lt;))(&gt;(&gt;&gt;(&gt;&gt;&gt;))(&lt;&gt;&lt;))(&gt;&gt;&gt;)
(((&gt;&gt;&lt;)&lt;&gt;)(&gt;&lt;&gt;)(&gt;&lt;&gt;))(&lt;&lt;(&lt;&gt;&gt;))(&lt;&lt;&gt;)
((&gt;&lt;&gt;)&lt;(&lt;&lt;(&lt;&lt;&gt;)))((&lt;(&lt;&lt;&gt;)&lt;)(&lt;&gt;&lt;)&gt;)(&gt;&gt;&gt;)
(&lt;&lt;(&lt;&gt;&lt;))(((&lt;&gt;&gt;)&gt;&lt;)(&gt;&lt;&lt;)(&gt;&lt;&gt;))(&lt;(&gt;&lt;&gt;)&gt;)
((&gt;&gt;&gt;)&lt;&lt;)(&lt;(&lt;&gt;&lt;)&lt;)((&lt;&lt;(&lt;&lt;&lt;))&gt;(&gt;(&gt;&lt;&gt;)&lt;))
JavaScript (Node.js), 50 bytes

f=a=&gt;a[1]?f(a.replace(/\((.&gt;)?(.)(&lt;.)?\)/,'$2')):a

Try it online!
Repeat apply regex replace until only 1 char left. The regex /\((.&gt;)?(.)(&lt;.)?\)/ get the calculate result as 2nd capturing group.

Save 1 byte, thanks to Arnauld