summary refs log tree commit diff stats
path: root/raku
diff options
context:
space:
mode:
Diffstat (limited to 'raku')
-rw-r--r--raku/luhn/Luhn.rakumod25
1 files changed, 17 insertions, 8 deletions
diff --git a/raku/luhn/Luhn.rakumod b/raku/luhn/Luhn.rakumod
index 8efafc0..2bdaf16 100644
--- a/raku/luhn/Luhn.rakumod
+++ b/raku/luhn/Luhn.rakumod
@@ -1,11 +1,20 @@
 unit module Luhn;
 
-sub is-luhn-valid($input is copy --> Bool) is export {
-    return False if $input.comb.grep(/\d|\s/).join ne $input;
-    $input = $input.comb.grep(/\d/)>>.Int;
-    return False if $input.elems < 2;
-
-    ([+] gather for $input.reverse.kv -> $k, $v {
-         take $k !%% 2 ?? ($_ > 9 ?? $_ - 9 !! $_) !! $v with $v * 2;
-     }) %% 10;
+sub is-luhn-valid(Str $input --> Bool) is export {
+    with $input.comb(/\d|\s/) -> @num-spc {
+        return False if @num-spc.elems !== $input.chars;
+
+        my Int @numbers = @num-spc.comb(/\d/)>>.Int;
+        return False if @numbers.elems < 2;
+
+        ([+] gather for @numbers.reverse.kv -> $k, $v {
+             take $k !%% 2 ?? subtract-if-greater($v * 2, 9) !! $v;
+         }) %% 10
+    }
+}
+
+#| subtract-if-greater will subtract $to-sub from $num if $num is
+#| greater than $to-sub.
+sub subtract-if-greater(Int $num, Int $to-sub --> Int) {
+    $num > $to-sub ?? $num - $to-sub !! $num
 }