أنت تعمل على تطبيق JavaScript يستخدم وظيفة "createSelector" من مكتبة Redux. يتم استخدام الوظيفة لإنشاء محددات محفوظة، وهي فعالة وتعمل على تحسين عملية الوصول إلى البيانات من حالة التطبيق.

فيما يلي الأشكال الثلاثة لوظيفة `createSelector` التي تحتاج إلى فهمها:

1.`createSelector(selector: InjectableSelector<State, S1>[]، جهاز العرض: (s1: S1) => النتيجة): MemoizedSelector<State, Result>`
يأخذ هذا الإصدار من الوظيفة مجموعة من المحددات ووظيفة جهاز العرض. يقوم بإرجاع محدد محفوظ يأخذ الحالة الحالية كمدخل ويطبق وظيفة جهاز العرض على القيم المحددة. ثم يتم إرجاع القيمة الناتجة من المحدد.

2.`createSelector(selector: [InjectableSelector<State, S1>, InjectableSelector<State, S2>]، جهاز العرض: (s1: S1, s2: S2) => النتيجة): MemoizedSelector<State, Result>`
هنا، تقبل الوظيفة مصفوفة من محددين ووظيفة جهاز عرض تأخذ القيم المحددة من كلا المحددين وتنتج النتيجة النهائية.

3. createSelector<State, Props, S1, S2, Result>(المحددات: [InjectableSelectorWithProps<State, Props, S1>, InjectableSelectorWithProps<State, Props, S2>], جهاز العرض: (s1: S1, s2: S2,props : Props) => النتيجة): MemoizedSelectorWithProps<State, Props, Result>`
يسمح هذا الإصدار للمحددات بقبول الدعائم الإضافية كمدخلات. يتطلب الأمر مجموعة من محددين مع الدعائم ووظيفة جهاز العرض التي تأخذ القيم والدعائم المحددة لإنتاج النتيجة النهائية.

مهمتك هي تنفيذ نسخة مبسطة من وظيفة `createSelector` التي تدعم الأشكال الثلاثة جميعها.

اكتب دالة JavaScript `createCustomSelector(selectorsArr, projectorFunc)` التي تأخذ مصفوفة `selectorsArr` ووظيفة `projectorFunc`. يحتوي `selectorsArr` على محدد واحد أو أكثر، و`projectorFunc` هي الوظيفة التي سيتم تطبيقها على القيم المحددة.

تحتاج إلى إرجاع وظيفة التحديد المحفوظة التي تتصرف وفقًا للاختلافات الموضحة أعلاه. يجب أن يكون المحدد الذي تم إرجاعه قادرًا على التعامل مع المدخلات المختلفة وإنتاج المخرجات المتوقعة بناءً على عدد المحددات ووظيفة جهاز العرض.

**توقيع الوظيفة:** `function createCustomSelector(seletorsArr: Function[], projectorFunc: Function) => Function`

**مدخل**
تأخذ الدالة `createCustomSelector` معلمتين:
- `selectorsArr` (1 <= SelectorsArr.length <= 3): مصفوفة من المحددات، يتم تمثيل كل منها بواسطة دالة تقبل حالة التطبيق وترجع قيمة محددة. يمكن أن يكون عدد المحددات في المصفوفة 1 أو 2 أو 3.
- `projectorFunc`: دالة تأخذ القيم المحددة من المحددات وتنتج النتيجة النهائية.

**انتاج**
يجب أن تقوم الوظيفة بإرجاع وظيفة تحديد محفوظة تأخذ الحالة الحالية كمدخل، وتطبق وظيفة جهاز العرض على القيم المحددة، وترجع النتيجة النهائية.

**ملحوظة**
- يجب على المحدد المحفوظ إعادة حساب النتيجة فقط في حالة تغير حالة الإدخال أو أي من القيم المحددة.
{"evolved_from": null, "kind": "synthetic", "source": "argilla/DistiCoder-dpo-binarized"}