aboutsummaryrefslogtreecommitdiffhomepage
path: root/samples/rosetta/validate_isin.bruijn
diff options
context:
space:
mode:
Diffstat (limited to 'samples/rosetta/validate_isin.bruijn')
-rw-r--r--samples/rosetta/validate_isin.bruijn30
1 files changed, 30 insertions, 0 deletions
diff --git a/samples/rosetta/validate_isin.bruijn b/samples/rosetta/validate_isin.bruijn
new file mode 100644
index 0000000..7608ed5
--- /dev/null
+++ b/samples/rosetta/validate_isin.bruijn
@@ -0,0 +1,30 @@
+:import luhn_test_of_credit_card_numbers .
+
+:import std/Number/Conversion .
+:import std/Combinator .
+:import std/String .
+:import std/Char .
+:import std/Logic .
+:import std/Number .
+
+# verifies ISIN format
+format? [len ⋀? country ⋀? security ⋀? checksum]
+ len (length 0) =? (+12)
+ country all? uppercase? (take (+2) 0)
+ security all? (φ or? uppercase? numeric?) (take (+9) (drop (+2) 0))
+ checksum numeric? _0
+
+# performs luhn test
+checksum? (map (from-base36 → number→string)) → concat → string→number → luhn
+ from-base36 binary→ternary → [(0 - (0 ≥? (+65) ((+65) - (+10)) (+48)))]
+
+# performs format and checksum test
+validate φ and? format? checksum?
+
+:test (validate "US0378331005") (true)
+:test (validate "US0373831005") (false)
+:test (validate "U50378331005") (false)
+:test (validate "US03378331005") (false)
+:test (validate "AU0000XVGZA3") (true)
+:test (validate "AU0000VXGZA3") (true)
+:test (validate "FR0000988040") (true)