@@ -32,6 +32,7 @@ module Data.CreditCard
3232 , _DiscoverCard
3333 , _DinersClub
3434 , _JCB
35+ , _UnionPay
3536 , CreditCardError(..)
3637 , _UnknownCardNumber
3738 , _InvalidCardNumber
@@ -62,7 +63,6 @@ import Data.Ix
6263import Data.List as L
6364import Data.List.NonEmpty (NonEmpty)
6465import qualified Data.List.NonEmpty as NE
65−import Data.Maybe (fromMaybe)
6666import Data.OpenApi as OpenApi
6767 ( ToSchema(..), SchemaOptions(..), defaultSchemaOptions
6868 , genericDeclareNamedSchema)
@@ -316,6 +316,7 @@ data CreditCardType
316316 | DiscoverCard
317317 | DinersClub
318318 | JCB
319+ | UnionPay
319320 deriving (Eq, Show)
320321
321322makePrisms ''CreditCardType
@@ -353,11 +354,13 @@ guessCreditCardType n
353354 | isDinersClub = Just DinersClub
354355 | isJCB = Just JCB
355356 | isVisa = Just Visa -- NOTE: starts with just 4? realy?
357+ | isUnionPay = Just UnionPay
356358 | otherwise = Nothing
357359 where
358360 isVisa = (4 == firstDigits 1) && (digitsLength `elem` [13,16,19])
359361 isMasterCard = (inRange (51, 55) (firstDigits 2)) && (digitsLength == 16)
360362 isAmEx = (firstDigits 2 `elem` [34, 37]) && (digitsLength == 15)
363+ isUnionPay = (firstDigits 2 `elem` [60, 62]) && (digitsLength `elem` [16,17,18,19])
361364 isDiscoverCard =
362365 (firstDigits 4 == 6011 || inRange (644, 649) (firstDigits 3)
363366 || inRange (622126, 622925) (firstDigits 6) || firstDigits 2 == 65)