// Path: src/main/java/jresp/protocol/Ary.java
// public class Ary implements RespType {
//     private List<RespType> payload;
// 
//     public Ary(List<RespType> payload) {
//         this.payload = payload;
//     }
// 
//     public Ary(RespType... payload) {
//         this.payload = Arrays.asList(payload);
//     }
// 
//     public String toString() {
//         return String.format("%s[%s]", getClass().getName(), payload);
//     }
// 
//     @Override
//     public void writeBytes(Deque<ByteBuffer> out) {
//         byte[] header = Resp.longToByteArray(payload.size());
//         int size = 1 + header.length + 2;
//         ByteBuffer o = Resp.buffer(out, size);
//         o.put((byte)'*');
//         o.put(header);
//         o.put(Resp.CRLF);
//         payload.stream().forEach(x -> x.writeBytes(out));
//     }
// 
//     public List<RespType> raw() {
//         return payload;
//     }
// 
//     @Override
//     public Object unwrap() {
//         return payload.stream().map(RespType::unwrap).collect(Collectors.toList());
//     }
// 
//     @Override
//     public int hashCode() {
//         return payload.hashCode();
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (o instanceof Ary) {
//             Ary a = (Ary)o;
//             return payload.equals(a.payload);
//         } else {
//             return false;
//         }
//     }
// }
// 
// Path: src/main/java/jresp/protocol/BulkStr.java
// public class BulkStr implements RespType {
//     private static final Map<String, BulkStr> cache = Collections.synchronizedMap(new HashMap<>());
// 
//     private byte[] payload;
// 
//     public BulkStr(String s) {
//         try {
//             payload = s.getBytes("UTF-8");
//         } catch (UnsupportedEncodingException e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
//     public BulkStr(byte[] s) {
//         payload = s;
//     }
// 
//     public BulkStr() {
//         this.payload = null;
//     }
// 
//     public static BulkStr get(String str) {
//         BulkStr val = cache.get(str);
//         if (val == null) {
//             val = new BulkStr(str);
//             cache.put(str, val);
//         }
//         return val;
//     }
// 
//     public String toString() {
//         return String.format("%s[%s]", getClass().getName(), Arrays.toString(payload));
//     }
// 
//     @Override
//     public void writeBytes(Deque<ByteBuffer> out) {
//         int size = 1;
//         byte[] header;
//         if (payload == null) {
//             header = Resp.longToByteArray(-1);
//         } else {
//             header = Resp.longToByteArray(payload.length);
//             size += 2 + payload.length;
//         }
//         size += 2 + header.length;
// 
//         ByteBuffer o = Resp.buffer(out, size);
//         o.put((byte)'$');
//         o.put(header);
//         if (payload != null) {
//             o.put(Resp.CRLF);
//             o.put(payload);
//         }
//         o.put(Resp.CRLF);
//     }
// 
//     public byte[] raw() {
//         return payload;
//     }
// 
//     @Override
//     public Object unwrap() {
//         if (payload == null) {
//             return null;
//         }
//         try {
//             return new String(payload, "UTF-8");
//         } catch (UnsupportedEncodingException e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
//     @Override
//     public int hashCode() {
//         return Arrays.hashCode(payload);
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (o instanceof BulkStr) {
//             BulkStr bs = (BulkStr)o;
//             return Arrays.equals(payload, bs.payload);
//         } else {
//             return false;
//         }
//     }
// }
// 
// Path: src/main/java/jresp/protocol/RespType.java
// public interface RespType {
//     /**
//      * Write the RESP form to the ByteBuf
//      */
//     void writeBytes(Deque<ByteBuffer> out);
// 
//     /**
//      * Return the high-level Java equivalent.
//      */
//     Object unwrap();
// }


import jresp.protocol.Ary;
import jresp.protocol.BulkStr;
import jresp.protocol.RespType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
        elements.add(new BulkStr(name));
        elements.addAll(Arrays.asList(options));

        return new Ary(elements);
    }

    protected static RespType ping() {
        return command("PING");
    }

    protected static RespType flushDB() {
        return command("FLUSHDB");
    }

    protected static RespType get(String key) {
        return command("GET", new BulkStr(key));
    }

    protected static RespType set(String key, String value) {
        return command("SET", new BulkStr(key), new BulkStr(value));
    }

    protected static RespType sadd(String key, String value) {
        return command("SADD", new BulkStr(key), new BulkStr(value));
    }

    protected static RespType smembers(String key) {
        return command("SMEMBERS", new BulkStr(key));
    }

// Path: src/main/java/jresp/protocol/Ary.java
// public class Ary implements RespType {
//     private List<RespType> payload;
// 
//     public Ary(List<RespType> payload) {
//         this.payload = payload;
//     }
// 
//     public Ary(RespType... payload) {
//         this.payload = Arrays.asList(payload);
//     }
// 
//     public String toString() {
//         return String.format("%s[%s]", getClass().getName(), payload);
//     }
// 
//     @Override
//     public void writeBytes(Deque<ByteBuffer> out) {
//         byte[] header = Resp.longToByteArray(payload.size());
//         int size = 1 + header.length + 2;
//         ByteBuffer o = Resp.buffer(out, size);
//         o.put((byte)'*');
//         o.put(header);
//         o.put(Resp.CRLF);
//         payload.stream().forEach(x -> x.writeBytes(out));
//     }
// 
//     public List<RespType> raw() {
//         return payload;
//     }
// 
//     @Override
//     public Object unwrap() {
//         return payload.stream().map(RespType::unwrap).collect(Collectors.toList());
//     }
// 
//     @Override
//     public int hashCode() {
//         return payload.hashCode();
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (o instanceof Ary) {
//             Ary a = (Ary)o;
//             return payload.equals(a.payload);
//         } else {
//             return false;
//         }
//     }
// }
// 
// Path: src/main/java/jresp/protocol/BulkStr.java
// public class BulkStr implements RespType {
//     private static final Map<String, BulkStr> cache = Collections.synchronizedMap(new HashMap<>());
// 
//     private byte[] payload;
// 
//     public BulkStr(String s) {
//         try {
//             payload = s.getBytes("UTF-8");
//         } catch (UnsupportedEncodingException e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
//     public BulkStr(byte[] s) {
//         payload = s;
//     }
// 
//     public BulkStr() {
//         this.payload = null;
//     }
// 
//     public static BulkStr get(String str) {
//         BulkStr val = cache.get(str);
//         if (val == null) {
//             val = new BulkStr(str);
//             cache.put(str, val);
//         }
//         return val;
//     }
// 
//     public String toString() {
//         return String.format("%s[%s]", getClass().getName(), Arrays.toString(payload));
//     }
// 
//     @Override
//     public void writeBytes(Deque<ByteBuffer> out) {
//         int size = 1;
//         byte[] header;
//         if (payload == null) {
//             header = Resp.longToByteArray(-1);
//         } else {
//             header = Resp.longToByteArray(payload.length);
//             size += 2 + payload.length;
//         }
//         size += 2 + header.length;
// 
//         ByteBuffer o = Resp.buffer(out, size);
//         o.put((byte)'$');
//         o.put(header);
//         if (payload != null) {
//             o.put(Resp.CRLF);
//             o.put(payload);
//         }
//         o.put(Resp.CRLF);
//     }
// 
//     public byte[] raw() {
//         return payload;
//     }
// 
//     @Override
//     public Object unwrap() {
//         if (payload == null) {
//             return null;
//         }
//         try {
//             return new String(payload, "UTF-8");
//         } catch (UnsupportedEncodingException e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
//     @Override
//     public int hashCode() {
//         return Arrays.hashCode(payload);
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (o instanceof BulkStr) {
//             BulkStr bs = (BulkStr)o;
//             return Arrays.equals(payload, bs.payload);
//         } else {
//             return false;
//         }
//     }
// }
// 
// Path: src/main/java/jresp/protocol/RespType.java
// public interface RespType {
//     /**
//      * Write the RESP form to the ByteBuf
//      */
//     void writeBytes(Deque<ByteBuffer> out);
// 
//     /**
//      * Return the high-level Java equivalent.
//      */
//     Object unwrap();
// }


// Path: src/test/java/jresp/JRESPTest.java
import jresp.protocol.Ary;
import jresp.protocol.BulkStr;
import jresp.protocol.RespType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

        elements.add(new BulkStr(name));
        elements.addAll(Arrays.asList(options));

        return new Ary(elements);
    }

    protected static RespType ping() {
        return command("PING");
    }

    protected static RespType flushDB() {
        return command("FLUSHDB");
    }

    protected static RespType get(String key) {
        return command("GET", new BulkStr(key));
    }

    protected static RespType set(String key, String value) {
        return command("SET", new BulkStr(key), new BulkStr(value));
    }

    protected static RespType sadd(String key, String value) {
        return command("SADD", new BulkStr(key), new BulkStr(value));
    }

    protected static RespType smembers(String key) {
        return command("SMEMBERS", new BulkStr(key));
    }

    protected static RespType hgetall(String key) {