protected function generatePinqTypeData($traversableType, $orderedTraversableType, $joiningOnTraversableType, $joiningToTraversableType, $mutable = false)
{
$pinqTypes = [];
$traversableTypeId = TypeId::getObject($traversableType);
$orderedTraversableTypeId = TypeId::getObject($orderedTraversableType);
$joiningOnTraversableTypeId = TypeId::getObject($joiningOnTraversableType);
$joiningToTraversableTypeId = TypeId::getObject($joiningToTraversableType);
$commonMethods = ['asArray' => INativeType::TYPE_ARRAY, 'asTraversable' => TypeId::getObject(Pinq\ITraversable::ITRAVERSABLE_TYPE), 'asCollection' => TypeId::getObject(Pinq\ICollection::ICOLLECTION_TYPE), 'isSource' => INativeType::TYPE_BOOL, 'getSource' => $traversableTypeId, 'iterate' => INativeType::TYPE_NULL, 'getIterator' => TypeId::getObject('Traversable'), 'getTrueIterator' => TypeId::getObject('Traversable'), 'getIteratorScheme' => TypeId::getObject(IIteratorScheme::IITERATOR_SCHEME_TYPE), 'first' => INativeType::TYPE_MIXED, 'last' => INativeType::TYPE_MIXED, 'count' => INativeType::TYPE_INT, 'isEmpty' => INativeType::TYPE_BOOL, 'aggregate' => INativeType::TYPE_MIXED, 'maximum' => INativeType::TYPE_MIXED, 'minimum' => INativeType::TYPE_MIXED, 'sum' => INativeType::TYPE_MIXED, 'average' => INativeType::TYPE_MIXED, 'all' => INativeType::TYPE_BOOL, 'any' => INativeType::TYPE_BOOL, 'implode' => INativeType::TYPE_STRING, 'contains' => INativeType::TYPE_BOOL, 'where' => $traversableTypeId, 'orderBy' => $orderedTraversableTypeId, 'orderByAscending' => $orderedTraversableTypeId, 'orderByDescending' => $orderedTraversableTypeId, 'skip' => $traversableTypeId, 'take' => $traversableTypeId, 'slice' => $traversableTypeId, 'indexBy' => $traversableTypeId, 'keys' => $traversableTypeId, 'reindex' => $traversableTypeId, 'groupBy' => $traversableTypeId, 'join' => $joiningOnTraversableTypeId, 'groupJoin' => $joiningOnTraversableTypeId, 'select' => $traversableTypeId, 'selectMany' => $traversableTypeId, 'unique' => $traversableTypeId, 'append' => $traversableTypeId, 'whereIn' => $traversableTypeId, 'except' => $traversableTypeId, 'union' => $traversableTypeId, 'intersect' => $traversableTypeId, 'difference' => $traversableTypeId];
if ($mutable) {
$commonMethods += ['apply' => INativeType::TYPE_NULL, 'addRange' => INativeType::TYPE_NULL, 'remove' => INativeType::TYPE_NULL, 'removeRange' => INativeType::TYPE_NULL, 'removeWhere' => INativeType::TYPE_NULL, 'clear' => INativeType::TYPE_NULL];
}
$pinqTypes[$traversableType] = ['methods' => $commonMethods];
$pinqTypes[$orderedTraversableType] = ['methods' => ['thenBy' => $orderedTraversableTypeId, 'thenByAscending' => $orderedTraversableTypeId, 'thenByDescending' => $orderedTraversableTypeId] + $commonMethods];
$joiningMethods = ['withDefault' => $joiningToTraversableTypeId, 'to' => $traversableTypeId];
if ($mutable) {
$joiningMethods += ['apply' => INativeType::TYPE_NULL];
}
$pinqTypes[$joiningToTraversableType] = ['methods' => $joiningMethods];
$pinqTypes[$joiningOnTraversableType] = ['methods' => ['on' => $joiningToTraversableTypeId, 'onEquality' => $joiningToTraversableTypeId] + $joiningMethods];
return $pinqTypes;
}