public function types()
{
$traversableInterfaceGroups = [Pinq\ITraversable::ITRAVERSABLE_TYPE => ['ordered' => Interfaces\IOrderedTraversable::IORDERED_TRAVERSABLE_TYPE, 'joining-on' => Interfaces\IJoiningOnTraversable::IJOINING_ON_TRAVERSABLE_TYPE, 'joining-to' => Interfaces\IJoiningToTraversable::IJOINING_TO_TRAVERSABLE_TYPE], Pinq\ICollection::ICOLLECTION_TYPE => ['mutable' => true, 'ordered' => Interfaces\IOrderedCollection::IORDERED_COLLECTION_TYPE, 'joining-on' => Interfaces\IJoiningOnCollection::IJOINING_ON_COLLECTION_TYPE, 'joining-to' => Interfaces\IJoiningToCollection::IJOINING_TO_COLLECTION_TYPE], Pinq\IQueryable::IQUERYABLE_TYPE => ['ordered' => Interfaces\IOrderedQueryable::IORDERED_QUERYABLE_TYPE, 'joining-on' => Interfaces\IJoiningOnQueryable::IJOINING_ON_QUERYABLE_TYPE, 'joining-to' => Interfaces\IJoiningToQueryable::IJOINING_TO_QUERYABLE_TYPE], Pinq\IRepository::IREPOSITORY_TYPE => ['mutable' => true, 'ordered' => Interfaces\IOrderedRepository::IORDERED_REPOSITORY_TYPE, 'joining-on' => Interfaces\IJoiningOnRepository::IJOINING_ON_REPOSITORY_TYPE, 'joining-to' => Interfaces\IJoiningToRepository::IJOINING_TO_REPOSITORY_TYPE]];
$pinqTypes = [];
foreach ($traversableInterfaceGroups as $traversableInterface => $traversableGroup) {
$pinqTypes += $this->generatePinqTypeData($traversableInterface, $traversableGroup['ordered'], $traversableGroup['joining-on'], $traversableGroup['joining-to'], !empty($traversableGroup['mutable']));
}
return $pinqTypes;
}