sealed class Either { const Either(); factory Either.left(L l) => Left(l); factory Either.right(R r) => Right(r); T fold(T Function(L) left, T Function(R) right) => switch (this) { Left(:final value) => left(value), Right(:final value) => right(value), }; bool isLeft() => switch (this) { Left() => true, Right() => false, }; bool isRight() => !isLeft(); } class Left extends Either { final L _l; const Left(this._l); L get value => _l; } class Right extends Either { final R _r; const Right(this._r); R get value => _r; }