import gradio as gr MAX_QUEUE = 10 def _normalize_name(name: str) -> str: return (name or "").strip() def _parse_age(age_text: str): age_text = (age_text or "").strip() if not age_text: return None, "Please enter an age." try: age = int(age_text) except ValueError: return None, "Age must be a whole number." if age < 0 or age > 130: return None, "Please enter a realistic age (0–130)." return age, None def _sorted_queue(queue): # Oldest first; ties broken by entry order (seq) return sorted(queue, key=lambda x: (-x["age"], x["seq"])) def _render(queue): if not queue: return "Queue is empty." q_sorted = _sorted_queue(queue) lines = ["### Smart Queue (Oldest First)"] for idx, item in enumerate(q_sorted, start=1): lines.append(f"**#{idx}** — {item['name']} (Age {item['age']})") lines.append("") lines.append(f"Slots used: **{len(queue)}/{MAX_QUEUE}**") lines.append("Rule: **Oldest first**; if ages tie, **earlier signup first**.") return "\n\n".join(lines) def add_to_queue(name, age_text, queue_state, seq_state): queue_state = queue_state or [] seq_state = int(seq_state or 1) if len(queue_state) >= MAX_QUEUE: return queue_state, seq_state, _render(queue_state), f"❌ Queue is full (max {MAX_QUEUE}). Please reset or serve next.", gr.update(), gr.update() name = _normalize_name(name) if not name: return queue_state, seq_state, _render(queue_state), "❌ Please enter a name.", gr.update(), gr.update() age, err = _parse_age(age_text) if err: return queue_state, seq_state, _render(queue_state), f"❌ {err}", gr.update(), gr.update() queue_state.append({"name": name, "age": age, "seq": seq_state}) seq_state += 1 # After adding, show their *current* position in the sorted queue q_sorted = _sorted_queue(queue_state) 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) msg = f"✅ Added **{name}** (Age {age}). Current queue position: **#{position}** (oldest-first ordering)." return queue_state, seq_state, _render(queue_state), msg, gr.update(value=""), gr.update(value="") def serve_next(queue_state): queue_state = queue_state or [] if not queue_state: return queue_state, _render(queue_state), "Queue is empty. Nothing to serve." q_sorted = _sorted_queue(queue_state) next_person = q_sorted[0] # Remove by unique seq queue_state = [p for p in queue_state if p["seq"] != next_person["seq"]] msg = f"➡️ Served: **{next_person['name']}** (Age {next_person['age']})." return queue_state, _render(queue_state), msg def reset_queue(): queue_state = [] seq_state = 1 return queue_state, seq_state, _render(queue_state), "🔄 Queue reset. You can add up to 10 people.", gr.update(value=""), gr.update(value="") with gr.Blocks(title="Smart Queue (Oldest First)") as demo: gr.Markdown( "# 👥 Smart Queue (Oldest First)\n" "Enter **name** and **age**. The queue is ordered by **oldest first**.\n" "If ages are the same, the earlier signup comes first.\n" "**Maximum 10 people**." ) queue_state = gr.State([]) seq_state = gr.State(1) # internal counter to preserve signup order with gr.Row(): name_in = gr.Textbox(label="Name", placeholder="e.g., Anna") age_in = gr.Textbox(label="Age", placeholder="e.g., 29") with gr.Row(): add_btn = gr.Button("Join Queue", variant="primary") serve_btn = gr.Button("Serve Next") reset_btn = gr.Button("Reset Queue") status = gr.Markdown("Ready.") queue_view = gr.Markdown(_render([])) add_btn.click( add_to_queue, inputs=[name_in, age_in, queue_state, seq_state], outputs=[queue_state, seq_state, queue_view, status, name_in, age_in], ) # Enter key on either field submits name_in.submit( add_to_queue, inputs=[name_in, age_in, queue_state, seq_state], outputs=[queue_state, seq_state, queue_view, status, name_in, age_in], ) age_in.submit( add_to_queue, inputs=[name_in, age_in, queue_state, seq_state], outputs=[queue_state, seq_state, queue_view, status, name_in, age_in], ) serve_btn.click( serve_next, inputs=[queue_state], outputs=[queue_state, queue_view, status], ) reset_btn.click( reset_queue, inputs=[], outputs=[queue_state, seq_state, queue_view, status, name_in, age_in], ) if __name__ == "__main__": demo.launch()