 public func seq<T, U, StreamToken>(
   _ left: @autoclosure @escaping () -> HeterogeneousParser<StreamToken, T>,
   _ right: @autoclosure @escaping () -> HeterogeneousParser<StreamToken, U>
-) -> ([StreamToken]) -> ((T, U), [StreamToken])? {
+) -> HeterogeneousParser<StreamToken, (T, U)> {
   return { source in
     return left()(source).flatMap { leftResult in
       return right()(leftResult.1).map { rightResult in

public func until<T: Equatable>(_ value: T) -> HeterogeneousParser<T, [T]> {
  return rep1(not(value))
}


public func placeholder<T, StreamToken>(_ source: [StreamToken]) -> (T, [StreamToken])? { return .none }

  }
}

public func |<T, StreamToken>(
  _ left: @autoclosure @escaping () -> HeterogeneousParser<StreamToken, T>,
  _ right: @autoclosure @escaping () -> HeterogeneousParser<StreamToken, T>
  ) -> HeterogeneousParser<StreamToken, T> {
  return or(left, right)
}

// Generate parser which matches 0 or more of `parser` argument
// Always succeeds.
