@@ -42,23 +42,8 @@ defmodule Junk do
4242 base_digits = junk ( Integer , opts )
4343 |> Integer . digits
4444 |> ( fn digits -> [ 8 , 0 , 8 , 4 , 0 ] ++ [ Enum . random ( 1 .. 2 ) ] ++ digits end ) . ( )
45-
46- # starting from the right, doubles digits
47- # splits into 2 digits where needed
48- # sums, and adds 24 (for the 80840 of the longer form npi)
49- check_sum = base_digits
50- |> Enum . reverse
51- |> Junk . map_every ( 2 , fn ( n ) -> Integer . digits ( n * 2 ) end )
52- |> List . flatten
53- |> Enum . sum
54-
55- # calcs the check digit
56- check_digit = case Kernel . rem ( check_sum , 10 ) do
57- 0 -> 0
58- n -> 10 - n
59- end
60-
61- ( base_digits ++ [ check_digit ] ) |> Integer . undigits
45+ |> Integer . undigits
46+ |> Junk . luhn
6247 end
6348
6449 def junk ( :npi , opts ) do
@@ -79,6 +64,23 @@ defmodule Junk do
7964 end
8065 end
8166
67+ def luhn ( number ) do
68+ base_digits = Integer . digits ( number )
69+ check_sum = base_digits
70+ |> Enum . reverse
71+ |> Junk . map_every ( 2 , fn ( n ) -> Integer . digits ( n * 2 ) end )
72+ |> List . flatten
73+ |> Enum . sum
74+
75+ # calcs the check digit
76+ check_digit = case Kernel . rem ( check_sum , 10 ) do
77+ 0 -> 0
78+ n -> 10 - n
79+ end
80+
81+ ( base_digits ++ [ check_digit ] ) |> Integer . undigits
82+ end
83+
8284 def map_every ( enumerable , nth , mapper ) do
8385 { res , _acc } = Enum . map_reduce ( enumerable , 0 , fn ( x , i ) -> if ( rem ( i , nth ) == 0 ) do
8486 { mapper . ( x ) , i + 1 }
0 commit comments