// Path: src/main/java/com/github/tonivade/resp/protocol/SafeString.java
// public static SafeString safeString(String str) {
//   return new SafeString(UTF_8.encode(checkNonNull(str)));
// }
// 
// 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);
//   }
// }


import static com.github.tonivade.resp.protocol.SafeString.safeString;
import java.util.Collection;
import java.util.stream.Stream;
import com.github.tonivade.purefun.data.ImmutableList;
import com.github.tonivade.purefun.data.Sequence;
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;
/*
 * Copyright (c) 2016-2022, Antonio Gabriel Muñoz Conejo <antoniogmc at gmail dot com>
 * Distributed under the terms of the MIT License
 */
package com.github.tonivade.resp.protocol;




public interface RedisToken {
  RedisToken NULL_STRING = string((SafeString) null);
  RedisToken RESPONSE_OK = status("OK");

  RedisTokenType getType();

  <T> T accept(RedisTokenVisitor<T> visitor);

  static RedisToken nullString() {
    return NULL_STRING;
  }

  static RedisToken responseOk() {
    return RESPONSE_OK;
  }

  static RedisToken string(SafeString str) {
    return new StringRedisToken(str);
  }

  static RedisToken string(String str) {
// Path: src/main/java/com/github/tonivade/resp/protocol/SafeString.java
// public static SafeString safeString(String str) {
//   return new SafeString(UTF_8.encode(checkNonNull(str)));
// }
// 
// 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/RedisToken.java
import static com.github.tonivade.resp.protocol.SafeString.safeString;
import java.util.Collection;
import java.util.stream.Stream;
import com.github.tonivade.purefun.data.ImmutableList;
import com.github.tonivade.purefun.data.Sequence;
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;

/*
 * Copyright (c) 2016-2022, Antonio Gabriel Muñoz Conejo <antoniogmc at gmail dot com>
 * Distributed under the terms of the MIT License
 */
package com.github.tonivade.resp.protocol;




public interface RedisToken {
  RedisToken NULL_STRING = string((SafeString) null);
  RedisToken RESPONSE_OK = status("OK");

  RedisTokenType getType();

  <T> T accept(RedisTokenVisitor<T> visitor);

  static RedisToken nullString() {
    return NULL_STRING;
  }

  static RedisToken responseOk() {
    return RESPONSE_OK;
  }

  static RedisToken string(SafeString str) {
    return new StringRedisToken(str);
  }

  static RedisToken string(String str) {
    return new StringRedisToken(safeString(str));