def event.loop

bend-kit-llm@0.13.0.1 · llm.bend:545

import bend-kit-llm@0.13.0.1/llm.bend as Llm
import Base
import bend-kit-llm@0.13.0.1/sse.bend as Sse
import bend-kit-http@0.38.1.1/http.bend as Http
import bend-kit-bytes@0.3.3.0/bytes.bend as Bytes

545# f: pieces left to read before the stream counts as stalled.
546def event.loop(f: Nat, st: Rn) -> IO(Http.Stream & Sse.Reader & Result<&1, &1, Err, Maybe<&1, Sse.Message>>):
547  match f:
548    case 0n:
549      match st:
550        case RnNext{h, r}:
551          (rd, n) = r
552          IO.pure(Http.Stream & Sse.Reader & Result<&1, &1, Err, Maybe<&1, Sse.Message>>, (h, rd, Fail{ErrReply{"too many pieces without an event"}}))
553        case RnOut{h, rd, r}:
554          IO.pure(Http.Stream & Sse.Reader & Result<&1, &1, Err, Maybe<&1, Sse.Message>>, (h, rd, r))
555    case 1n+g:
556      match st:
557        case RnNext{h, r}:
558          (rd, n) = r
559          match n:
560            case Sse.Got{e}:
561              IO.pure(Http.Stream & Sse.Reader & Result<&1, &1, Err, Maybe<&1, Sse.Message>>, (h, rd, Done{Some{e}}))
562            case Sse.Want{}:
563              do IO<Http.Stream & Sse.Reader & Result<&1, &1, Err, Maybe<&1, Sse.Message>>>:
564                x : Http.Stream & Result<&1, &1, Http.Err, Maybe<&1, Bytes.Bytes>> <- Http.stream.read(h)
565                event.loop(g, event.read(rd, x))
566        case RnOut{h, rd, r}:
567          IO.pure(Http.Stream & Sse.Reader & Result<&1, &1, Err, Maybe<&1, Sse.Message>>, (h, rd, r))

Uses (18)

Used by (1)