def pool.take.go

bend-kit-http@0.38.2.0 · http.bend:3656

import bend-kit-http@0.38.2.0/http.bend as Http
import Base

3656# Each idle socket takes two steps: the peek, then the close and the next take. Each read of HTTP/2 frames takes one more.
3657def pool.take.go(n: Nat, +key: String, pt: Pool & Took) -> IO(Pool & Maybe<&1, Conn>):
3658  match n pt:
3659    case _ Tuple{p, TookNone{}}:
3660      IO.pure(Pool & Maybe<&1, Conn>, (p, None{}))
3661    case _ Tuple{p, TookSeen{True{}, c}}:
3662      IO.pure(Pool & Maybe<&1, Conn>, (p, Some{c}))
3663    case 0n Tuple{p, TookRaw{c}}:
3664      do IO<Pool & Maybe<&1, Conn>>:
3665        conn.close(c)
3666        return (p, None{})
3667    case 0n Tuple{p, TookSeen{False{}, c}}:
3668      do IO<Pool & Maybe<&1, Conn>>:
3669        conn.close(c)
3670        return (p, None{})
3671    case 1n+k Tuple{p, TookRaw{c}}:
3672      do IO<Pool & Maybe<&1, Conn>>:
3673        t : Took <- conn.idle(c)
3674        pool.take.go(k, key, (p, t))
3675    case 1n+k Tuple{p, TookSeen{False{}, c}}:
3676      do IO<Pool & Maybe<&1, Conn>>:
3677        conn.close(c)
3678        pool.take.go(k, key, took.of(pool.take(p, key)))

Uses (17)

Used by (1)