  Pressed by the difficulty of writing asynchronous, event-driven code,
mainstream languages have recently been building in support for a variety of
advanced control-flow features. Meanwhile, experimental language designs have
suggested effect handlers as a unifying solution to programmer-defined control
effects, subsuming exceptions, generators, and async--await. Despite these
trends, complex control flow---in particular, control flow exhibiting a
bidirectional pattern---remains challenging to manage.
  We introduce bidirectional algebraic effects, a new programming abstraction
that supports bidirectional control transfer in a more natural way. Handlers of
bidirectional effects can raise further effects to transfer control back to the
site where the initiating effect was raised, and can use themselves to handle
their own effects. We present applications of this expressive power, which
falls out naturally as we push toward the unification of effectful programming
with object-oriented programming. We pin down the mechanism and the unification
formally using a core language that generalizes to effect operations and effect
handlers.
  The usual propagation semantics of control effects such as exceptions
conflicts with modular reasoning in the presence of effect polymorphism---it
breaks parametricity. Bidirectionality exacerbates the problem. Hence, we set
out to show the core language, which builds on the existing tunneling semantics
for algebraic effects, is not only type-safe (no effects go unhandled), but
also abstraction-safe (no effects are accidentally handled). We devise a
step-indexed logical-relations model, and construct its parametricity and
soundness proofs. These core results are fully mechanized in Coq. Preliminary
experiments show that as a first-class language feature, bidirectional handlers
can be implemented efficiently.
