  Data types and codata types are, as the names suggest, often seen as duals of
each other. However, most programming languages do not support both of them in
their full generality, or if they do, they are still seen as distinct
constructs with separately defined type-checking, compilation, etc. Rendel et
al. were the first to propose variants of two standard program transformations,
de- and refunctionalization, as a test to gauge and improve the symmetry
between data and codata types. However, in previous works, codata and data were
still seen as separately defined language constructs, with de- and
refunctionalization being defined as similar but separate algorithms. These
works also glossed over interactions between the aforementioned transformations
and evaluation order, which leads to a loss of desirable $\eta$ expansion
equalities. We argue that the failure of complete symmetry is due to the
inherent asymmetry of natural deduction as the logical foundation of the
language design. Natural deduction is asymmetric in that its focus is on
producers (proofs) of types, whereas consumers (contexts, continuations,
refutations) have a second-class status. Inspired by existing
sequent-calculus-based language designs, we present the first language design
that is fully symmetric in that the issues of polarity (data type vs codata
types) and evaluation order (call-by-value vs call-by-name) are untangled and
become independent attributes of a single form of type declaration. Both
attributes, polarity and evaluation order, can be changed independently by one
algorithm each. In particular, defunctionalization and refunctionalization are
now one algorithm. Evaluation order can be defined and changed individually for
each type, independently from polarity. By allowing only certain combinations
of evaluation order and polarity, the aforementioned $\eta$ laws can be
restored.
