From 9aadb5dcb6a1c26049742d1eb3241fb275246b7c Mon Sep 17 00:00:00 2001 From: dimgigov Date: Fri, 8 May 2026 20:57:27 +0300 Subject: [PATCH] Fix: channels now support drain-after-close (close! marks closed, ! rejects on closed) --- src/eval.nim | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/eval.nim b/src/eval.nim index 16d89f9..7f5ffec 100644 --- a/src/eval.nim +++ b/src/eval.nim @@ -10,6 +10,7 @@ type Channel* = ref object buf: Deque[CljVal] capacity: int # 0 = unbuffered + closed*: bool var channelRegistry* = initTable[string, Channel]() var channelCounter*: int64 = 0 @@ -1074,7 +1075,7 @@ proc evalList(items: seq[CljVal], env: Env): EvalResult = channelCounter += 1 let id = "chan_" & $channelCounter let cap = if args.len > 0 and args[0].kind == ckInt: args[0].intVal.int else: 0 - let ch = Channel(buf: initDeque[CljVal](), capacity: cap) + let ch = Channel(buf: initDeque[CljVal](), capacity: cap, closed: false) channelRegistry[id] = ch return EvalResult(ok: true, value: cljString(id)) @@ -1083,6 +1084,8 @@ proc evalList(items: seq[CljVal], env: Env): EvalResult = if args[0].kind != ckString or not channelRegistry.hasKey(args[0].strVal): return EvalResult(ok: false, error: "put!/ 0 and ch.buf.len >= ch.capacity: return EvalResult(ok: false, error: "Channel buffer full") ch.buf.addLast(args[1]) @@ -1094,6 +1097,8 @@ proc evalList(items: seq[CljVal], env: Env): EvalResult = return EvalResult(ok: false, error: "take!/