يتم منحك واجهة تسمى `IScope<T>`. تمتد هذه الواجهة إلى واجهتين أخريين:

1. `ISource<T>`: تمثل هذه الواجهة مصدر بيانات من النوع `T`. لديها الطرق التالية:
   - `T GetNext()`: إرجاع العنصر التالي من النوع `T` من المصدر.

2. `IScopeAware<T>`: تمثل هذه الواجهة كيانًا على علم بنطاقه الحالي. لديها الطريقة التالية:
   - `void SetScope(IScope<T>scope)`: يضبط النطاق الحالي للكيان على النطاق المقدم.

مهمتك هي تنفيذ واجهة `IScope<T>`، التي تجمع بين وظائف الواجهتين `ISource<T>` و`IScopeAware<T>`.

تحتاج إلى توفير التنفيذ للطرق التالية:

1. قم بتنفيذ طريقة `T GetNext()` التي تقوم بإرجاع العنصر التالي من النوع `T` من المصدر. يجب أن يُرجع كل استدعاء لـ `GetNext()` العنصر التالي في التسلسل.

2. قم بتنفيذ طريقة `void SetScope(IScope<T>scope)` التي تحدد النطاق الحالي للكيان على النطاق المقدم.

ملحوظة:
- افترض أن مصدر البيانات الأساسي يحتفظ بحالة داخلية لتتبع العنصر الحالي.
- يمكنك افتراض أن الأسلوب `SetScope` سيتم استدعاؤه دائمًا قبل استدعاء `GetNext`.
{"source": "argilla/DistiCoder-dpo-binarized", "kind": "synthetic", "evolved_from": null}