futures only read from value channel once then cache the result