import time import gradio as gr MAX_QUEUE_SIZE = 3 def get_sorted_queue(queue_state): if queue_state is None: return [] # Sort by age descending; if ages equal, keep original order by queue number return sorted(queue_state, key=lambda p: (-p["Age"], p["Queue No."])) def add_to_queue(name, age, queue_state): if queue_state is None: queue_state = [] if not name: return ( "Please enter your name.", queue_state, get_sorted_queue(queue_state), -1, "Waiting for people to join the queue." ) try: age = int(age) if age <= 0: raise ValueError except Exception: return ( "Please enter a valid positive age.", queue_state, get_sorted_queue(queue_state), -1, "Waiting for people to join the queue." ) if len(queue_state) >= MAX_QUEUE_SIZE: return ( "Queue is full. Only 3 people are allowed.", queue_state, get_sorted_queue(queue_state), -1, "Queue is full. No more people can join." ) queue_number = len(queue_state) + 1 person = { "Queue No.": queue_number, "Name": name, "Age": age } queue_state.append(person) message = f"Welcome, {name}! Your queue number is {queue_number}." display_queue = get_sorted_queue(queue_state) return ( message, queue_state, display_queue, -1, "Queue updated. Press 'Start / Next' to call the next person." ) def reset_queue(): return ( "Queue has been reset.", [], [], -1, "Waiting for people to join the queue." ) def serve_next(queue_state, service_index): if not queue_state: return ( "No one in the queue yet.", -1, [], "Waiting for people to join the queue." ) display_queue = get_sorted_queue(queue_state) if service_index is None or service_index < 0: idx = 0 else: idx = service_index + 1 if idx >= len(display_queue): return ( "All people have been served.", service_index, display_queue, "Queue completed." ) person = display_queue[idx] # Simulate a 10-second service time time.sleep(10) now_serving_msg = ( f"Now serving: Queue No. {person['Queue No.']} - " f"{person['Name']} (Age {person['Age']})" ) status_msg = "Next person has been called." return ( now_serving_msg, idx, display_queue, status_msg ) with gr.Blocks() as demo: gr.Markdown("# Smart Queue System (Older First)") gr.Markdown( "Enter your name and age. Up to 3 people can join the queue. " "Older people are served first. Each turn takes about 10 seconds." ) queue_state = gr.State([]) service_index = gr.State(-1) with gr.Row(): name_input = gr.Textbox(label="Name") age_input = gr.Number(label="Age", precision=0) with gr.Row(): submit_btn = gr.Button("Join Queue") reset_btn = gr.Button("Reset Queue") next_btn = gr.Button("Start / Next") status_output = gr.Textbox(label="Status", interactive=False) now_serving_output = gr.Textbox(label="Now Serving", interactive=False) queue_table = gr.Dataframe( headers=["Queue No.", "Name", "Age"], label="Current Queue (sorted, older first)", datatype=["number", "str", "number"], wrap=True ) submit_btn.click( fn=add_to_queue, inputs=[name_input, age_input, queue_state], outputs=[ status_output, queue_state, queue_table, service_index, now_serving_output ] ) reset_btn.click( fn=reset_queue, inputs=None, outputs=[ status_output, queue_state, queue_table, service_index, now_serving_output ] ) next_btn.click( fn=serve_next, inputs=[queue_state, service_index], outputs=[ now_serving_output, service_index, queue_table, status_output ] ) if __name__ == "__main__": demo.launch()