@@ -24,7 +24,7 @@ instance : ToString DecodeError where
2424inductive DecodeResult (α) where
2525 | success (x : α) (k : Decoder)
2626 | error (err : DecodeError) (cur : Decoder)
27- | pending (fn : ByteArray → DecodeResult α)
27+ | pending (fn : Option ByteArray → DecodeResult α)
2828deriving Inhabited
2929
3030@[always_inline]
@@ -60,6 +60,13 @@ def DecodeResult.feed {α} (bytes : ByteArray) : DecodeResult α → DecodeResul
6060 | .error err k => .error err (k.append bytes)
6161 | .pending fn => fn bytes
6262
63+ /-- Immediately terminate the pending state. -/
64+ @[always_inline]
65+ def DecodeResult.terminate {α} : DecodeResult α → DecodeResult α
66+ | .success x k => .success x k
67+ | .error err k => .error err k
68+ | .pending _ => .error .eoi { data := {}, offset := 0 }
69+
6370@[always_inline]
6471instance : Monad Get where
6572 pure x := fun d => DecodeResult.success x d
@@ -191,12 +198,15 @@ Catch any `DecodeError.eoi` and recover to a pending state rather than exit with
191198* ensure that `x` terminates when enough bytes are fed,
192199* or define your own pending function to cache intermediate result as much as possible.
193200 -/
194- @ [specialize, always_inline ]
201+ @[specialize]
195202partial def pending (x : Get α) : Get α := do
196203 try x
197204 catch err =>
198205 match err with
199- | .eoi => fun d => .pending fun bytes => pending x (d.append bytes)
206+ | .eoi => fun d => .pending fun bytes? =>
207+ match bytes? with
208+ | none => DecodeResult.mkEOI d
209+ | some bytes => pending x (d.append bytes)
200210 | e => throw e
201211
202212namespace Primitive
0 commit comments