// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class ArrayRedisToken extends AbstractRedisToken<Sequence<RedisToken>> {
// 
//   ArrayRedisToken(Sequence<RedisToken> value) {
//     super(RedisTokenType.ARRAY, checkNonNull(value).asArray());
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.array(this);
//   }
// 
//   public int size() {
//     return getValue().size();
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class ErrorRedisToken extends AbstractRedisToken<String> {
// 
//   ErrorRedisToken(String value) {
//     super(RedisTokenType.ERROR, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.error(this);
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class IntegerRedisToken extends AbstractRedisToken<Integer> {
// 
//   IntegerRedisToken(Integer value) {
//     super(RedisTokenType.INTEGER, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.integer(this);
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class StatusRedisToken extends AbstractRedisToken<String> {
// 
//   StatusRedisToken(String value) {
//     super(RedisTokenType.STATUS, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.status(this);
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class StringRedisToken extends AbstractRedisToken<SafeString> {
// 
//   StringRedisToken(SafeString value) {
//     super(RedisTokenType.STRING, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.string(this);
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class UnknownRedisToken extends AbstractRedisToken<SafeString> {
// 
//   UnknownRedisToken(SafeString value) {
//     super(RedisTokenType.UNKNOWN, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.unknown(this);
//   }
// }


import static com.github.tonivade.purefun.Precondition.checkNonNull;
import static java.util.Objects.nonNull;
import java.util.function.Function;
import com.github.tonivade.resp.protocol.AbstractRedisToken.ArrayRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.ErrorRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.IntegerRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.StatusRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.StringRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.UnknownRedisToken;

  @Override
  public T string(StringRedisToken token) {
    return onString.apply(token);
  }

  @Override
  public T error(ErrorRedisToken token) {
    return onError.apply(token);
  }

  @Override
  public T unknown(UnknownRedisToken token) {
    return onUnknown.apply(token);
  }

  @Override
  public T integer(IntegerRedisToken token) {
    return onInteger.apply(token);
  }

  public static class Builder<T> {
    private Function<ArrayRedisToken, T> onArray;
    private Function<StatusRedisToken, T> onStatus;
    private Function<StringRedisToken, T> onString;
    private Function<ErrorRedisToken, T> onError;
    private Function<IntegerRedisToken, T> onInteger;
    private Function<UnknownRedisToken, T> onUnknown;

    public Builder<T> onArray(Function<ArrayRedisToken, T> onArray) {
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class ArrayRedisToken extends AbstractRedisToken<Sequence<RedisToken>> {
// 
//   ArrayRedisToken(Sequence<RedisToken> value) {
//     super(RedisTokenType.ARRAY, checkNonNull(value).asArray());
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.array(this);
//   }
// 
//   public int size() {
//     return getValue().size();
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class ErrorRedisToken extends AbstractRedisToken<String> {
// 
//   ErrorRedisToken(String value) {
//     super(RedisTokenType.ERROR, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.error(this);
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class IntegerRedisToken extends AbstractRedisToken<Integer> {
// 
//   IntegerRedisToken(Integer value) {
//     super(RedisTokenType.INTEGER, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.integer(this);
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class StatusRedisToken extends AbstractRedisToken<String> {
// 
//   StatusRedisToken(String value) {
//     super(RedisTokenType.STATUS, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.status(this);
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class StringRedisToken extends AbstractRedisToken<SafeString> {
// 
//   StringRedisToken(SafeString value) {
//     super(RedisTokenType.STRING, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.string(this);
//   }
// }
// 
// Path: src/main/java/com/github/tonivade/resp/protocol/AbstractRedisToken.java
// public static final class UnknownRedisToken extends AbstractRedisToken<SafeString> {
// 
//   UnknownRedisToken(SafeString value) {
//     super(RedisTokenType.UNKNOWN, value);
//   }
// 
//   @Override
//   public <T> T accept(RedisTokenVisitor<T> visitor) {
//     return visitor.unknown(this);
//   }
// }


// Path: src/main/java/com/github/tonivade/resp/protocol/LambdaRedisTokenVisitor.java
import static com.github.tonivade.purefun.Precondition.checkNonNull;
import static java.util.Objects.nonNull;
import java.util.function.Function;
import com.github.tonivade.resp.protocol.AbstractRedisToken.ArrayRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.ErrorRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.IntegerRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.StatusRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.StringRedisToken;
import com.github.tonivade.resp.protocol.AbstractRedisToken.UnknownRedisToken;


  @Override
  public T string(StringRedisToken token) {
    return onString.apply(token);
  }

  @Override
  public T error(ErrorRedisToken token) {
    return onError.apply(token);
  }

  @Override
  public T unknown(UnknownRedisToken token) {
    return onUnknown.apply(token);
  }

  @Override
  public T integer(IntegerRedisToken token) {
    return onInteger.apply(token);
  }

  public static class Builder<T> {
    private Function<ArrayRedisToken, T> onArray;
    private Function<StatusRedisToken, T> onStatus;
    private Function<StringRedisToken, T> onString;
    private Function<ErrorRedisToken, T> onError;
    private Function<IntegerRedisToken, T> onInteger;
    private Function<UnknownRedisToken, T> onUnknown;

    public Builder<T> onArray(Function<ArrayRedisToken, T> onArray) {
      this.onArray = checkNonNull(onArray);