# If seq is not installed, then define a function that invokes __fish_fallback_seq
# test -x in /usr/bin/seq because that's where it usually is and
# that's substantially cheaper than the type function

if begin ; not test -x /usr/bin/seq ; and not type -f seq > /dev/null; end
	# No seq command
	function seq --description "Print sequences of numbers"
		__fish_fallback_seq $argv
	end

	function __fish_fallback_seq --description "Fallback implementation of the seq command"
	
		set -l from 1
		set -l step 1
		set -l to 1
		
		switch (count $argv)
			case 1
				set to $argv[1]
		
			case 2
				set from $argv[1]
				set to $argv[2]
		
			case 3
				set from $argv[1]
				set step $argv[2]
				set to $argv[3]
		
			case '*'
				printf (_ "%s: Expected 1, 2 or 3 arguments, got %d\n") seq (count $argv)
				exit 1
		
		end
		
		for i in $from $step $to
			if not echo $i | grep -E '^-?[0-9]*([0-9]*|\.[0-9]+)$' >/dev/null
				printf (_ "%s: '%s' is not a number\n") seq $i
				exit 1
			end
		end
		
		if [ $step -ge 0 ]
			echo "for( i=$from; i<=$to ; i+=$step ) i;" | bc
		else
			echo "for( i=$from; i>=$to ; i+=$step ) i;" | bc
		end
	end
end
