 	)
 }
 
-internal class Box<T> {
-	let value : T
-	internal init(_ x : T) { self.value = x }
-}
-
-internal enum Either<L, R> {
-	case Left(Box<L>)
-	case Right(Box<R>)
+internal indirect enum Either<L, R> {
+	case Left(L)
+	case Right(R)
 }
 
 internal struct Arguments {

									, numTryShrinks: st.numTryShrinks
									, numTotTryShrinks: st.numTotTryShrinks
									, shouldAbort: abort)
			return .Right(Box(nstate))
			// Discard
		case .MatchResult(.None, let expect, _, _, let labels, _, _, let abort):
			let nstate = CheckerState(name: st.name

	while true {
		switch runATest(state)(f: f) {
		case let .Left(fail):
			switch (fail.0, doneTesting(fail.1)(f: f)) {
			case (.Success(_, _, _), _):
				return fail.0
			case let (_, .NoExpectedFailure(numTests, labels, output)):
				return .NoExpectedFailure(numTests: numTests, labels: labels, output: output)
			default:
				return fail.0
			}
		case let .Right(lsta):
			if lsta.numSuccessTests >= lsta.maxSuccessTests || lsta.shouldAbort {
				return doneTesting(lsta)(f: f)
			}
