public function rows(array $options = []) {
        if (!isset($options['min_y']) || !isset($options['max_y'])) {
            if (!($keys = array_keys($this->chars))) {
                return [];
            }
        }

        $min = isset($options['min_y']) ? $options['min_y'] : min($keys);
        $max = isset($options['max_y']) ? $options['max_y'] : max($keys);

        if (!isset($options['min_x']) || !isset($options['max_x'])) {
            $flattened = array();
            foreach ($this->chars as $key => $char) {
                $flattened = array_merge($flattened, array_keys($char));
            }
        }

        $options['min_x'] = isset($options['min_x']) ? $options['min_x'] : min($flattened);
        $options['max_x'] = isset($options['max_x']) ? $options['max_x'] : max($flattened);

        return array_map(function ($i) use ($options) {
            return $this->row($i, $options);
        }, range($min, $max));
    }