Spaces:
Sleeping
Sleeping
| 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() | |