11defmodule PolishValidators.Regon do
2- import String , only: [ split: 3 , to_integer: 1 , length: 1 ]
3- import Enum , only: [ zip: 1 , reduce: 3 , map: 2 ]
2+ import String , only: [ length: 1 ]
3+ import Enum , only: [ zip: 1 , reduce: 3 ]
44 import List , only: [ last: 1 ]
55 import Kernel , except: [ length: 1 ]
6+ import PolishValidators.Common
67
78 @ weights9 [ 8 , 9 , 2 , 3 , 4 , 5 , 6 , 7 ]
89 @ weights14 [ 2 , 4 , 8 , 5 , 0 , 9 , 7 , 3 , 6 , 1 , 2 , 4 , 8 ]
@@ -32,17 +33,16 @@ defmodule PolishValidators.Regon do
3233 { :error, "Invalid length" }
3334
3435 """
35-
3636 def validate ( regon ) do
37- regon_length = validate_length ( regon )
37+ regon_length = validate_length ( regon , [ 9 , 14 ] )
3838
3939 case regon_length do
4040 { :ok , regon } ->
4141 regon_integers_list = to_integers_list ( regon )
4242 [ regon_integers_list , weights ( regon ) ]
4343 |> zip
4444 |> calculate_checksum
45- |> validate_checksum ( regon_integers_list )
45+ |> validate_checksum ( last ( regon_integers_list ) )
4646 _ -> regon_length
4747 end
4848 end
@@ -54,32 +54,12 @@ defmodule PolishValidators.Regon do
5454 end
5555 end
5656
57- defp validate_length ( regon ) do
58- case length ( regon ) do
59- n when n in [ 9 , 14 ] -> { :ok , regon }
60- _ -> { :error , "Invalid length" }
61- end
62- end
63-
64- defp to_integers_list ( regon ) do
65- to_string ( regon )
66- |> split ( "" , trim: true )
67- |> map ( & ( to_integer ( & 1 ) ) )
68- end
69-
7057 defp calculate_checksum ( regon ) do
7158 reduce ( regon , 0 , & reduce_checksum / 2 )
59+ |> rem ( 11 )
7260 end
7361
7462 defp reduce_checksum ( regon , acc ) do
7563 acc + elem ( regon , 0 ) * elem ( regon , 1 )
7664 end
77-
78- defp validate_checksum ( checksum , regon_integers_list ) do
79- if rem ( checksum , 11 ) == last ( regon_integers_list ) do
80- { :ok , "Valid" }
81- else
82- { :error , "Wrong checksum" }
83- end
84- end
8565end
0 commit comments