git.iko.soy/typeable/libphonenumber
on main help sign in
140 lines 4.5 kB history raw
1{-# LANGUAGE CPP #-}
2#if __GLASGOW_HASKELL__ >= 902
3{-# LANGUAGE FieldSelectors #-}
4#else
5{-# OPTIONS_GHC -Wno-name-shadowing #-}
6#endif
7-- | Data fields of t'PhoneNumber' objects.
8module Data.PhoneNumber.Number
9 ( PhoneNumber
10 , pattern PhoneNumber
11 , extension
12 , rawInput
13 , preferredDomesticCarrierCode
14 , nationalNumber
15 , countryCode
16 , italianLeadingZero
17 , countryCodeSource
18 , numberOfLeadingZeros
19 , CountryCode(..)
20 , CountryCodeSource(..)
21 ) where
23import Data.ByteString (ByteString)
24import Data.PhoneNumber.Internal.Number
25 ( CPhoneNumber(CPhoneNumber), PhoneNumber, CountryCodeSource, toCPhoneNumber
26 , fromCPhoneNumber
27 )
28import qualified Data.PhoneNumber.Internal.Number as I
30-- | A country calling code (International Subscriber Dialing code, ISD code),
31-- e.g. @34@ for Spain.
32--
33-- Contrary to the name, doesn't always correspond to a unique country (e.g.
34-- @7@ could be either Russia or Kazakhstan), or a country at all, and instead a
35-- non-geographical entity (e.g. @800@ is a Universal International Freephone
36-- Service dialing code).
37newtype CountryCode = CountryCode Int
38 deriving newtype (Eq, Ord, Show, Num)
40-- | Record pattern synonym for accessing data fields of the underlying C++
41-- object. It can be used for record construction, record update, and record
42-- pattern match. See t'PhoneNumber'.
43pattern PhoneNumber
44 :: Maybe ByteString
45 -> Maybe ByteString
46 -> Maybe ByteString
47 -> Word
48 -> CountryCode
49 -> Maybe Bool
50 -> Maybe CountryCodeSource
51 -> Maybe Int
52 -> PhoneNumber
53pattern PhoneNumber
54 { extension
55 , rawInput
56 , preferredDomesticCarrierCode
57 , nationalNumber
58 , countryCode
59 , italianLeadingZero
60 , countryCodeSource
61 , numberOfLeadingZeros
62 }
63 <- (toCPhoneNumber -> CPhoneNumber
64 { I.nationalNumber = fromIntegral -> nationalNumber
65 , I.countryCode = fromIntegral -> CountryCode -> countryCode
66 , I.numberOfLeadingZeros = fmap fromIntegral -> numberOfLeadingZeros
67 , .. })
68 where
69 PhoneNumber extension rawInput preferredDomesticCarrierCode
70 (fromIntegral -> nationalNumber)
71 (CountryCode (fromIntegral -> countryCode)) italianLeadingZero
72 countryCodeSource (fmap fromIntegral -> numberOfLeadingZeros)
73 = fromCPhoneNumber $ CPhoneNumber{..}
75{-# COMPLETE PhoneNumber #-}
77-- | E.g.:
78--
79-- @
80-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' 'Nothing' "+1 800-234-5678 ext. 1234"
81-- = 'Right' v'PhoneNumber' { 'extension' = 'Just' "1234", .. }
82-- @
83extension :: PhoneNumber -> Maybe ByteString
85-- | E.g.:
86--
87-- @
88-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.KeepRawInput' 'Nothing' " + 1(2-3~4*5.6 "
89-- = 'Right' v'PhoneNumber' { 'rawInput' = 'Just' " + 1(2-3~4*5.6 ", .. }
90-- @
91rawInput :: PhoneNumber -> Maybe ByteString
93-- | E.g.:
94--
95-- @
96-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.KeepRawInput' ('Just' \"BR\") "0 41 (21) 2345-6789"
97-- = 'Right' v'PhoneNumber' { 'preferredDomesticCarrierCode' = 'Just' "41", .. }
98-- @
99preferredDomesticCarrierCode :: PhoneNumber -> Maybe ByteString
101-- | You probably want to use 'Data.PhoneNumber.Util.nationalSignificantNumber'
102-- instead. E.g.:
103--
104-- @
105-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' 'Nothing' "+800 0001 2345"
106-- = 'Right' v'PhoneNumber' { 'nationalNumber' = 12345, 'numberOfLeadingZeros' = Just 3, .. }
107-- @
108nationalNumber :: PhoneNumber -> Word
110-- | E.g.:
111--
112-- @
113-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' ('Just' \"US\") "800-234-5678"
114-- = 'Right' v'PhoneNumber' { 'countryCode' = 1, .. }
115-- @
116countryCode :: PhoneNumber -> CountryCode
118-- | E.g.:
119--
120-- @
121-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' 'Nothing' "+39 06 1234 5678"
122-- = 'Right' v'PhoneNumber' { 'italianLeadingZero' = 'Just' 'True', .. }
123-- @
124italianLeadingZero :: PhoneNumber -> Maybe Bool
126-- | E.g.:
127--
128-- @
129-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.KeepRawInput' ('Just' \"US\") "011 800 1234 5678"
130-- = 'Right' v'PhoneNumber' { 'countryCodeSource' = 'Just' 'FromNumberWithIdd', .. }
131-- @
132countryCodeSource :: PhoneNumber -> Maybe CountryCodeSource
134-- | E.g.:
135--
136-- @
137-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' 'Nothing' "+800 0001 2345"
138-- = 'Right' v'PhoneNumber' { 'numberOfLeadingZeros' = Just 3, 'nationalNumber' = 12345, .. }
139-- @
140numberOfLeadingZeros :: PhoneNumber -> Maybe Int