from resp import Redis
r = Redis()
try:
    def call(*a):
        v = r.call(*a)
        if isinstance(v, Exception): raise v
        return v
    def encoding(k): return call('OBJECT', 'ENCODING', 'lab08:'+k)
    for key, value in [('n','42'),('s44','x'*44),('s45','x'*45)]:
        call('SET','lab08:'+key,value)
    print('string:',encoding('n'),encoding('s44'),encoding('s45'))
    for key, n, ttl in [('a',40,False),('b',41,False)]:
        args=['SET',key,'x'*n]
        if ttl: args += ['PX',60000]
        call(*args)
        print('string-boundary:',key,n,ttl,call('OBJECT','ENCODING',key))
    call('APPEND','lab08:s44','y')
    print('append:',encoding('s44'))
    call('HSET','lab08:h','name','Ada','age','37')
    print('hash:',encoding('h'))
    call('HSET','lab08:h','bio','x'*65)
    print('hash-long:',encoding('h'))
    for n in [512,513]:
        k='lab08:h'+str(n)
        args=sum(([str(i),'v'] for i in range(n)),[])
        call('HSET',k,*args)
        print('hash-fields:',n,call('OBJECT','ENCODING',k))
    call('RPUSH','lab08:l','a','b','c')
    print('list:',encoding('l'),call('LPOP','lab08:l'),call('LRANGE','lab08:l',0,-1))
    call('RPUSH','lab08:l','x'*9000)
    print('list-long:',encoding('l'))
    call('SADD','lab08:ints',1,2,3)
    call('SADD','lab08:words','red','blue')
    print('sets:',encoding('ints'),encoding('words'))
    call('SADD','lab08:words','x'*65)
    print('set-long:',encoding('words'))
    call('ZADD','lab08:z',10,'b',10,'a',20,'c')
    print('zset:',encoding('z'),call('ZRANGE','lab08:z',0,-1))
    call('ZADD','lab08:z',30,'x'*65)
    print('zset-long:',encoding('z'))
    call('SETBIT','lab08:bits',9,1)
    print('bitmap:',call('TYPE','lab08:bits'),call('STRLEN','lab08:bits'),call('BITCOUNT','lab08:bits'))
    call('PFADD','lab08:hll','a','b','a')
    print('hll:',call('TYPE','lab08:hll'),encoding('hll'),call('PFCOUNT','lab08:hll'))
    call('XADD','lab08:stream','1-0','event','created')
    call('XGROUP','CREATE','lab08:stream','workers','0')
    call('XREADGROUP','GROUP','workers','c1','COUNT',1,'STREAMS','lab08:stream','>')
    print('stream:',encoding('stream'),'pending=',call('XPENDING','lab08:stream','workers')[0])
    print('xack:',call('XACK','lab08:stream','workers','1-0'),'length=',call('XLEN','lab08:stream'))
    call('GEOADD','lab08:geo',13.361389,38.115556,'Palermo',15.087269,37.502669,'Catania')
    print('geo:',call('TYPE','lab08:geo'),encoding('geo'),call('GEOSEARCH','lab08:geo','FROMMEMBER','Palermo','BYRADIUS',200,'km','ASC'))
    call('SET','lab08:tiny','x')
    print('memory: bytes=',call('STRLEN','lab08:tiny'),'usage=',call('MEMORY','USAGE','lab08:tiny'))
finally:
    r.close()
