@Internal
	public static <L, R> Left<L, R> obtainLeft(Either<L, R> input, TypeSerializer<L> leftSerializer) {
		if (input.isLeft()) {
			return (Left<L, R>) input;
		} else {
			Right<L, R> right = (Right<L, R>) input;
			if (right.left == null) {
				right.left = Left.of(leftSerializer.createInstance());
				right.left.right = right;
			}
			return right.left;
		}
	}
@ Internal public static < L , R > Left < L , R > obtainLeft ( Either < L , R > input , TypeSerializer < L > leftSerializer ) { if ( input . isLeft ( ) ) { return ( Left < L , R > ) input ; } else { Right < L , R > right = ( Right < L , R > ) input ; if ( right . left == null ) { right . left = Left . of ( leftSerializer . createInstance ( ) ) ; right . left . right = right ; } return right . left ; } }
Utility function for {@link EitherSerializer} to support object reuse.

To support object reuse both subclasses of Either contain a reference to
an instance of the other type. This method provides access to and
initializes the cross-reference.

@param input container for Left or Right value
@param leftSerializer for creating an instance of the left type
@param <L>
the type of Left
@param <R>
the type of Right
@return input if Left type else input's Left reference