puppetlabs-stdlib/shuffle.rb
Krzysztof Wilczynski b3dd2207c3 Small re-factor of shuffle function. It is more compact now.
Signed-off-by: Krzysztof Wilczynski <krzysztof.wilczynski@linux.com>
2011-04-29 17:29:14 +01:00

45 lines
1.1 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#
# shuffle.rb
#
module Puppet::Parser::Functions
newfunction(:shuffle, :type => :rvalue, :doc => <<-EOS
EOS
) do |arguments|
raise(Puppet::ParseError, "shuffle(): Wrong number of arguments " +
"given (#{arguments.size} for 1)") if arguments.size < 1
value = arguments[0]
klass = value.class
if not [Array, String].include?(klass)
raise(Puppet::ParseError, 'shuffle(): Requires either an ' +
'array or string to work with')
end
result = value.clone
string_type = value.is_a?(String) ? true : false
# Check whether it makes sense to shuffle ...
return result if result.size <= 1
# We turn any string value into an array to be able to shuffle ...
result = string_type ? result.split('') : result
elements = result.size
# Simple implementation of FisherYates in-place shuffle ...
elements.times do |i|
j = rand(elements - i) + i
result[j], result[i] = result[i], result[j]
end
result = string_type ? result.join : result
return result
end
end
# vim: set ts=2 sw=2 et :