CoolFace
Apppublic

chewsuming/Queuesystem

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
app.py135 linesDownload Raw Back to root
1import gradio as gr2 3MAX_QUEUE = 104 5def _normalize_name(name: str) -> str:6    return (name or "").strip()7 8def _parse_age(age_text: str):9    age_text = (age_text or "").strip()10    if not age_text:11        return None, "Please enter an age."12    try:13        age = int(age_text)14    except ValueError:15        return None, "Age must be a whole number."16    if age < 0 or age > 130:17        return None, "Please enter a realistic age (0–130)."18    return age, None19 20def _sorted_queue(queue):21    # Oldest first; ties broken by entry order (seq)22    return sorted(queue, key=lambda x: (-x["age"], x["seq"]))23 24def _render(queue):25    if not queue:26        return "Queue is empty."27    q_sorted = _sorted_queue(queue)28 29    lines = ["### Smart Queue (Oldest First)"]30    for idx, item in enumerate(q_sorted, start=1):31        lines.append(f"**#{idx}** — {item['name']} (Age {item['age']})")32    lines.append("")33    lines.append(f"Slots used: **{len(queue)}/{MAX_QUEUE}**")34    lines.append("Rule: **Oldest first**; if ages tie, **earlier signup first**.")35    return "\n\n".join(lines)36 37def add_to_queue(name, age_text, queue_state, seq_state):38    queue_state = queue_state or []39    seq_state = int(seq_state or 1)40 41    if len(queue_state) >= MAX_QUEUE:42        return queue_state, seq_state, _render(queue_state), f"❌ Queue is full (max {MAX_QUEUE}). Please reset or serve next.", gr.update(), gr.update()43 44    name = _normalize_name(name)45    if not name:46        return queue_state, seq_state, _render(queue_state), "❌ Please enter a name.", gr.update(), gr.update()47 48    age, err = _parse_age(age_text)49    if err:50        return queue_state, seq_state, _render(queue_state), f"❌ {err}", gr.update(), gr.update()51 52    queue_state.append({"name": name, "age": age, "seq": seq_state})53    seq_state += 154 55    # After adding, show their *current* position in the sorted queue56    q_sorted = _sorted_queue(queue_state)57    position = next(i for i, p in enumerate(q_sorted, start=1) if p["name"] == name and p["age"] == age and p["seq"] == seq_state - 1)58 59    msg = f"✅ Added **{name}** (Age {age}). Current queue position: **#{position}** (oldest-first ordering)."60    return queue_state, seq_state, _render(queue_state), msg, gr.update(value=""), gr.update(value="")61 62def serve_next(queue_state):63    queue_state = queue_state or []64    if not queue_state:65        return queue_state, _render(queue_state), "Queue is empty. Nothing to serve."66 67    q_sorted = _sorted_queue(queue_state)68    next_person = q_sorted[0]69 70    # Remove by unique seq71    queue_state = [p for p in queue_state if p["seq"] != next_person["seq"]]72    msg = f"➡️ Served: **{next_person['name']}** (Age {next_person['age']})."73    return queue_state, _render(queue_state), msg74 75def reset_queue():76    queue_state = []77    seq_state = 178    return queue_state, seq_state, _render(queue_state), "🔄 Queue reset. You can add up to 10 people.", gr.update(value=""), gr.update(value="")79 80with gr.Blocks(title="Smart Queue (Oldest First)") as demo:81    gr.Markdown(82        "# 👥 Smart Queue (Oldest First)\n"83        "Enter **name** and **age**. The queue is ordered by **oldest first**.\n"84        "If ages are the same, the earlier signup comes first.\n"85        "**Maximum 10 people**."86    )87 88    queue_state = gr.State([])89    seq_state = gr.State(1)  # internal counter to preserve signup order90 91    with gr.Row():92        name_in = gr.Textbox(label="Name", placeholder="e.g., Anna")93        age_in = gr.Textbox(label="Age", placeholder="e.g., 29")94 95    with gr.Row():96        add_btn = gr.Button("Join Queue", variant="primary")97        serve_btn = gr.Button("Serve Next")98        reset_btn = gr.Button("Reset Queue")99 100    status = gr.Markdown("Ready.")101    queue_view = gr.Markdown(_render([]))102 103    add_btn.click(104        add_to_queue,105        inputs=[name_in, age_in, queue_state, seq_state],106        outputs=[queue_state, seq_state, queue_view, status, name_in, age_in],107    )108 109    # Enter key on either field submits110    name_in.submit(111        add_to_queue,112        inputs=[name_in, age_in, queue_state, seq_state],113        outputs=[queue_state, seq_state, queue_view, status, name_in, age_in],114    )115    age_in.submit(116        add_to_queue,117        inputs=[name_in, age_in, queue_state, seq_state],118        outputs=[queue_state, seq_state, queue_view, status, name_in, age_in],119    )120 121    serve_btn.click(122        serve_next,123        inputs=[queue_state],124        outputs=[queue_state, queue_view, status],125    )126 127    reset_btn.click(128        reset_queue,129        inputs=[],130        outputs=[queue_state, seq_state, queue_view, status, name_in, age_in],131    )132 133if __name__ == "__main__":134    demo.launch()135