public static function connectionFromArraySlice(array $data, array $args, $sliceStart, $arrayLength)
{
$after = isset($args['after']) ? $args['after'] : null;
$before = isset($args['before']) ? $args['before'] : null;
$first = isset($args['first']) ? $args['first'] : null;
$last = isset($args['last']) ? $args['last'] : null;
$sliceEnd = $sliceStart + count($data);
$beforeOffset = ArrayConnection::cursorToOffsetWithDefault($before, $arrayLength);
$afterOffset = ArrayConnection::cursorToOffsetWithDefault($after, -1);
$startOffset = max($sliceStart - 1, $afterOffset, -1) + 1;
$endOffset = min($sliceEnd, $beforeOffset, $arrayLength);
if ($first) {
$endOffset = min($endOffset, $startOffset + $first);
}
if ($last) {
$startOffset = max($startOffset, $endOffset - $last);
}
$arraySliceStart = max($startOffset - $sliceStart, 0);
$arraySliceEnd = count($data) - ($sliceEnd - $endOffset) - $arraySliceStart;
$slice = array_slice($data, $arraySliceStart, $arraySliceEnd, true);
$edges = array_map(['self', 'edgeForObjectWithIndex'], $slice, array_keys($slice));
$firstEdge = array_key_exists(0, $edges) ? $edges[0] : null;
$lastEdge = count($edges) > 0 ? $edges[count($edges) - 1] : null;
$lowerBound = $after ? $afterOffset + 1 : 0;
$upperBound = $before ? $beforeOffset : $arrayLength;
return ['edges' => $edges, 'pageInfo' => ['startCursor' => $firstEdge ? $firstEdge['cursor'] : null, 'endCursor' => $lastEdge ? $lastEdge['cursor'] : null, 'hasPreviousPage' => $last ? $startOffset > $lowerBound : false, 'hasNextPage' => $first ? $endOffset < $upperBound : false]];
}