يتم إعطاؤك مقتطف رمز يقوم باستيراد وتصدير قوائم الانتظار المختلفة. مهمتك هي تنفيذ ثلاث فئات مختلفة لقائمة الانتظار - `StateOrderQueue`، و`TopOrderQueue`، و`TrivialQueue`. يتم تمثيل كل فئة قائمة انتظار كوحدة منفصلة ويجب تنفيذها وفقًا للمواصفات التالية:

1. `StateOrderQueue`: يجب أن تتبع قائمة الانتظار هذه مبدأ FIFO (أولاً يدخل أولاً يخرج أولاً). ويجب أن يحافظ على الترتيب الذي تتم به إضافة العناصر ويوفر الطرق التالية:
   - `new()`: إنشاء كائن `StateOrderQueue` فارغ جديد.
   - `push(&mut self, item: T)`: إدراج العنصر المحدد في الجزء الخلفي من قائمة الانتظار.
   - `pop(&mut self) -> الخيار<T>`: يزيل العنصر ويعيده من مقدمة قائمة الانتظار. يتم إرجاع "لا شيء" إذا كانت قائمة الانتظار فارغة.

2. `TopOrderQueue`: يجب أن تتبع قائمة الانتظار هذه مبدأ LIFO (الأخير يدخل أولاً). ويجب أن يحافظ على الترتيب الذي تتم به إضافة العناصر ويوفر الطرق التالية:
   - `new()`: إنشاء كائن `TopOrderQueue` فارغ جديد.
   - `push(&mut self, item: T)`: إدراج العنصر المحدد في أعلى قائمة الانتظار.
   - `pop(&mut self) -> الخيار<T>`: يزيل العنصر ويعيده من أعلى قائمة الانتظار. يتم إرجاع "لا شيء" إذا كانت قائمة الانتظار فارغة.

3. "TrivialQueue": يجب أن تقوم قائمة الانتظار هذه بتخزين عنصر واحد فقط في كل مرة. وينبغي أن توفر الأساليب التالية:
   - `new()`: إنشاء كائن `TrivialQueue` فارغ جديد.
   - `push(&mut self, item: T)`: إدراج العنصر المحدد. إذا كانت قائمة الانتظار تحتوي بالفعل على عنصر ما، فيجب استبداله بالعنصر الجديد.
   - `pop(&mut self) -> الخيار<T>`: يزيل العنصر من قائمة الانتظار ويعيده. يتم إرجاع "لا شيء" إذا كانت قائمة الانتظار فارغة.

مهمتك هي تنفيذ فئات قوائم الانتظار الثلاثة هذه (`StateOrderQueue`، و`TopOrderQueue`، و`TrivialQueue`) بالطرق الخاصة بكل منها.
{"evolved_from": null, "kind": "synthetic", "source": "argilla/DistiCoder-dpo-binarized"}