summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/default.gembox3
-rw-r--r--mrbgems/mruby-compar-ext/mrbgem.rake5
-rw-r--r--mrbgems/mruby-compar-ext/mrblib/compar.rb31
3 files changed, 39 insertions, 0 deletions
diff --git a/mrbgems/default.gembox b/mrbgems/default.gembox
index 64f05de10..65584681d 100644
--- a/mrbgems/default.gembox
+++ b/mrbgems/default.gembox
@@ -14,6 +14,9 @@ MRuby::GemBox.new do |conf|
# Use standard Struct class
conf.gem :core => "mruby-struct"
+ # Use Comparable module extension
+ conf.gem :core => "mruby-compar-ext"
+
# Use Enumerable module extension
conf.gem :core => "mruby-enum-ext"
diff --git a/mrbgems/mruby-compar-ext/mrbgem.rake b/mrbgems/mruby-compar-ext/mrbgem.rake
new file mode 100644
index 000000000..dcf584339
--- /dev/null
+++ b/mrbgems/mruby-compar-ext/mrbgem.rake
@@ -0,0 +1,5 @@
+MRuby::Gem::Specification.new('mruby-compar-ext') do |spec|
+ spec.license = 'MIT'
+ spec.author = 'mruby developers'
+ spec.summary = 'Enumerable module extension'
+end
diff --git a/mrbgems/mruby-compar-ext/mrblib/compar.rb b/mrbgems/mruby-compar-ext/mrblib/compar.rb
new file mode 100644
index 000000000..d66f816ef
--- /dev/null
+++ b/mrbgems/mruby-compar-ext/mrblib/compar.rb
@@ -0,0 +1,31 @@
+module Comparable
+ ##
+ # Returns <i>min</i> if <i>obj</i> <code><=></code> <i>min</i> is less
+ # than zero, <i>max</i> if <i>obj</i> <code><=></code> <i>max</i> is
+ # greater than zero and <i>obj</i> otherwise.
+ #
+ # 12.clamp(0, 100) #=> 12
+ # 523.clamp(0, 100) #=> 100
+ # -3.123.clamp(0, 100) #=> 0
+ #
+ # 'd'.clamp('a', 'f') #=> 'd'
+ # 'z'.clamp('a', 'f') #=> 'f'
+ #
+ def clamp(min, max)
+ if (min <=> max) > 0
+ raise ArgumentError, "min argument must be smaller than max argument"
+ end
+ c = self <=> min
+ if c == 0
+ return self
+ elsif c < 0
+ return min
+ end
+ c = self <=> max
+ if c > 0
+ return max
+ else
+ return self
+ end
+ end
+end