Validate International Securities Identification Number: Difference between revisions

m
No edit summary
Line 1,486:
 
Or, making alternative choices from the standard libraries:
<lang haskell>import DataControl.BifunctorMonad (first(<=<))
import Data.Bifunctor (first)
import Data.List (foldl') -- '
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
Line 1,494 ⟶ 1,496:
validISIN :: String -> Bool
validISIN =
((&&) . isinPattern)
<*> (luhn . (show <=<<) . stringInts))
 
isinPattern :: String -> Bool
Line 1,501 ⟶ 1,503:
12 == length s
&& all (`elem` capitals) l
&& all (`elem` (capitals ++<> digits)) m
&& head r `elem` digits
where
[l, m, r] = bites s [2, 9, 1] s
 
luhn :: String -> Bool
Line 1,513 ⟶ 1,515:
stream f =
concat $
zipWith ($) (cycle f) (stringInts $ reverse x)
($)
(cycle f)
(stringInts $ reverse x)
s1 = sum (stream odds)
s2 =
sum $
sum . stringInts . show . (2 *) <$> stream evens
. (2 *) <$> stream evens
 
charMap :: M.Map Char Int
Line 1,529 ⟶ 1,527:
stringInts = fromMaybe [] . traverse (`M.lookup` charMap)
 
bites :: [Inta] -> [aInt] -> [[a]]
bites ns xs =
(reverse . fst) $
foldr. foldl' -- '
(\x (a, r) x -> first (: a) (splitAt x r))
([], xs)
(reverse ns)
 
capitals, digits :: String
9,655

edits