{-# LANGUAGE UndecidableInstances #-}

-- | Provides types to be used for querying the global IP addresses.
--
-- @since 0.1
module Pythia.Services.GlobalIp.Types
  ( -- * Configuration
    GlobalIpv4Config,
    GlobalIpv6Config,
    GlobalIpBothConfig,
    GlobalIpConfig (..),
    GlobalIpApp (..),

    -- ** Extra URL sources
    UrlSource (..),

    -- * Optics
    _GlobalIpAppDig,
    _GlobalIpAppCurl,
  )
where

import Pythia.Prelude
import Pythia.Services.Types.Network (IpType (Ipv4, Ipv6))

-- $setup
-- >>> import Pythia.Prelude
-- >>> import Pythia.Services.Types.Network (IpType (..))

-- | This type determines what program we use to lookup the ip address.
--
-- @since 0.1
type GlobalIpApp :: Type
data GlobalIpApp
  = -- | Uses curl to lookup the ip addresses.
    --
    -- @since 0.1
    GlobalIpAppCurl
  | -- | Uses the dig command to perform a DNS lookup. This is generally the
    -- fastest and most reliable.
    --
    -- @since 0.1
    GlobalIpAppDig
  deriving stock
    ( -- | @since 0.1
      GlobalIpApp
GlobalIpApp -> GlobalIpApp -> Bounded GlobalIpApp
forall a. a -> a -> Bounded a
$cminBound :: GlobalIpApp
minBound :: GlobalIpApp
$cmaxBound :: GlobalIpApp
maxBound :: GlobalIpApp
Bounded,
      -- | @since 0.1
      Int -> GlobalIpApp
GlobalIpApp -> Int
GlobalIpApp -> [GlobalIpApp]
GlobalIpApp -> GlobalIpApp
GlobalIpApp -> GlobalIpApp -> [GlobalIpApp]
GlobalIpApp -> GlobalIpApp -> GlobalIpApp -> [GlobalIpApp]
(GlobalIpApp -> GlobalIpApp)
-> (GlobalIpApp -> GlobalIpApp)
-> (Int -> GlobalIpApp)
-> (GlobalIpApp -> Int)
-> (GlobalIpApp -> [GlobalIpApp])
-> (GlobalIpApp -> GlobalIpApp -> [GlobalIpApp])
-> (GlobalIpApp -> GlobalIpApp -> [GlobalIpApp])
-> (GlobalIpApp -> GlobalIpApp -> GlobalIpApp -> [GlobalIpApp])
-> Enum GlobalIpApp
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: GlobalIpApp -> GlobalIpApp
succ :: GlobalIpApp -> GlobalIpApp
$cpred :: GlobalIpApp -> GlobalIpApp
pred :: GlobalIpApp -> GlobalIpApp
$ctoEnum :: Int -> GlobalIpApp
toEnum :: Int -> GlobalIpApp
$cfromEnum :: GlobalIpApp -> Int
fromEnum :: GlobalIpApp -> Int
$cenumFrom :: GlobalIpApp -> [GlobalIpApp]
enumFrom :: GlobalIpApp -> [GlobalIpApp]
$cenumFromThen :: GlobalIpApp -> GlobalIpApp -> [GlobalIpApp]
enumFromThen :: GlobalIpApp -> GlobalIpApp -> [GlobalIpApp]
$cenumFromTo :: GlobalIpApp -> GlobalIpApp -> [GlobalIpApp]
enumFromTo :: GlobalIpApp -> GlobalIpApp -> [GlobalIpApp]
$cenumFromThenTo :: GlobalIpApp -> GlobalIpApp -> GlobalIpApp -> [GlobalIpApp]
enumFromThenTo :: GlobalIpApp -> GlobalIpApp -> GlobalIpApp -> [GlobalIpApp]
Enum,
      -- | @since 0.1
      GlobalIpApp -> GlobalIpApp -> Bool
(GlobalIpApp -> GlobalIpApp -> Bool)
-> (GlobalIpApp -> GlobalIpApp -> Bool) -> Eq GlobalIpApp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GlobalIpApp -> GlobalIpApp -> Bool
== :: GlobalIpApp -> GlobalIpApp -> Bool
$c/= :: GlobalIpApp -> GlobalIpApp -> Bool
/= :: GlobalIpApp -> GlobalIpApp -> Bool
Eq,
      -- | @since 0.1
      (forall x. GlobalIpApp -> Rep GlobalIpApp x)
-> (forall x. Rep GlobalIpApp x -> GlobalIpApp)
-> Generic GlobalIpApp
forall x. Rep GlobalIpApp x -> GlobalIpApp
forall x. GlobalIpApp -> Rep GlobalIpApp x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. GlobalIpApp -> Rep GlobalIpApp x
from :: forall x. GlobalIpApp -> Rep GlobalIpApp x
$cto :: forall x. Rep GlobalIpApp x -> GlobalIpApp
to :: forall x. Rep GlobalIpApp x -> GlobalIpApp
Generic,
      -- | @since 0.1
      Eq GlobalIpApp
Eq GlobalIpApp =>
(GlobalIpApp -> GlobalIpApp -> Ordering)
-> (GlobalIpApp -> GlobalIpApp -> Bool)
-> (GlobalIpApp -> GlobalIpApp -> Bool)
-> (GlobalIpApp -> GlobalIpApp -> Bool)
-> (GlobalIpApp -> GlobalIpApp -> Bool)
-> (GlobalIpApp -> GlobalIpApp -> GlobalIpApp)
-> (GlobalIpApp -> GlobalIpApp -> GlobalIpApp)
-> Ord GlobalIpApp
GlobalIpApp -> GlobalIpApp -> Bool
GlobalIpApp -> GlobalIpApp -> Ordering
GlobalIpApp -> GlobalIpApp -> GlobalIpApp
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: GlobalIpApp -> GlobalIpApp -> Ordering
compare :: GlobalIpApp -> GlobalIpApp -> Ordering
$c< :: GlobalIpApp -> GlobalIpApp -> Bool
< :: GlobalIpApp -> GlobalIpApp -> Bool
$c<= :: GlobalIpApp -> GlobalIpApp -> Bool
<= :: GlobalIpApp -> GlobalIpApp -> Bool
$c> :: GlobalIpApp -> GlobalIpApp -> Bool
> :: GlobalIpApp -> GlobalIpApp -> Bool
$c>= :: GlobalIpApp -> GlobalIpApp -> Bool
>= :: GlobalIpApp -> GlobalIpApp -> Bool
$cmax :: GlobalIpApp -> GlobalIpApp -> GlobalIpApp
max :: GlobalIpApp -> GlobalIpApp -> GlobalIpApp
$cmin :: GlobalIpApp -> GlobalIpApp -> GlobalIpApp
min :: GlobalIpApp -> GlobalIpApp -> GlobalIpApp
Ord,
      -- | @since 0.1
      Int -> GlobalIpApp -> ShowS
[GlobalIpApp] -> ShowS
GlobalIpApp -> [Char]
(Int -> GlobalIpApp -> ShowS)
-> (GlobalIpApp -> [Char])
-> ([GlobalIpApp] -> ShowS)
-> Show GlobalIpApp
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GlobalIpApp -> ShowS
showsPrec :: Int -> GlobalIpApp -> ShowS
$cshow :: GlobalIpApp -> [Char]
show :: GlobalIpApp -> [Char]
$cshowList :: [GlobalIpApp] -> ShowS
showList :: [GlobalIpApp] -> ShowS
Show
    )
  deriving anyclass
    ( -- | @since 0.1
      GlobalIpApp -> ()
(GlobalIpApp -> ()) -> NFData GlobalIpApp
forall a. (a -> ()) -> NFData a
$crnf :: GlobalIpApp -> ()
rnf :: GlobalIpApp -> ()
NFData
    )

-- | @since 0.1
_GlobalIpAppCurl :: Prism' GlobalIpApp ()
_GlobalIpAppCurl :: Prism' GlobalIpApp ()
_GlobalIpAppCurl =
  (() -> GlobalIpApp)
-> (GlobalIpApp -> Either GlobalIpApp ()) -> Prism' GlobalIpApp ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
    (GlobalIpApp -> () -> GlobalIpApp
forall a b. a -> b -> a
const GlobalIpApp
GlobalIpAppCurl)
    ( \GlobalIpApp
x -> case GlobalIpApp
x of
        GlobalIpApp
GlobalIpAppCurl -> () -> Either GlobalIpApp ()
forall a b. b -> Either a b
Right ()
        GlobalIpApp
_ -> GlobalIpApp -> Either GlobalIpApp ()
forall a b. a -> Either a b
Left GlobalIpApp
x
    )
{-# INLINE _GlobalIpAppCurl #-}

-- | @since 0.1
_GlobalIpAppDig :: Prism' GlobalIpApp ()
_GlobalIpAppDig :: Prism' GlobalIpApp ()
_GlobalIpAppDig =
  (() -> GlobalIpApp)
-> (GlobalIpApp -> Either GlobalIpApp ()) -> Prism' GlobalIpApp ()
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
    (GlobalIpApp -> () -> GlobalIpApp
forall a b. a -> b -> a
const GlobalIpApp
GlobalIpAppDig)
    ( \GlobalIpApp
x -> case GlobalIpApp
x of
        GlobalIpApp
GlobalIpAppDig -> () -> Either GlobalIpApp ()
forall a b. b -> Either a b
Right ()
        GlobalIpApp
_ -> GlobalIpApp -> Either GlobalIpApp ()
forall a b. a -> Either a b
Left GlobalIpApp
x
    )
{-# INLINE _GlobalIpAppDig #-}

-- | Additional URL source for retrieving IP information. The intended app
-- should not be included (i.e. curl or dig), but any desired flags should
-- be.
--
-- ==== __Examples__
--
-- @
-- (dig): "@resolver1.opendns.com myip.opendns.com"
-- (dig): -4 TXT o-o.myaddr.l.google.com @ns1.google.com
-- (curl): "http://whatismyip.akamai.com/"
-- ...
-- @
--
-- @since 0.1
type UrlSource :: IpType -> Type
newtype UrlSource a = MkUrlSource {forall (a :: IpType). UrlSource a -> Text
unUrlSource :: Text}
  deriving stock
    ( -- | @since 0.1
      UrlSource a -> UrlSource a -> Bool
(UrlSource a -> UrlSource a -> Bool)
-> (UrlSource a -> UrlSource a -> Bool) -> Eq (UrlSource a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (a :: IpType). UrlSource a -> UrlSource a -> Bool
$c== :: forall (a :: IpType). UrlSource a -> UrlSource a -> Bool
== :: UrlSource a -> UrlSource a -> Bool
$c/= :: forall (a :: IpType). UrlSource a -> UrlSource a -> Bool
/= :: UrlSource a -> UrlSource a -> Bool
Eq,
      -- | @since 0.1
      (forall x. UrlSource a -> Rep (UrlSource a) x)
-> (forall x. Rep (UrlSource a) x -> UrlSource a)
-> Generic (UrlSource a)
forall x. Rep (UrlSource a) x -> UrlSource a
forall x. UrlSource a -> Rep (UrlSource a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (a :: IpType) x. Rep (UrlSource a) x -> UrlSource a
forall (a :: IpType) x. UrlSource a -> Rep (UrlSource a) x
$cfrom :: forall (a :: IpType) x. UrlSource a -> Rep (UrlSource a) x
from :: forall x. UrlSource a -> Rep (UrlSource a) x
$cto :: forall (a :: IpType) x. Rep (UrlSource a) x -> UrlSource a
to :: forall x. Rep (UrlSource a) x -> UrlSource a
Generic,
      -- | @since 0.1
      Eq (UrlSource a)
Eq (UrlSource a) =>
(UrlSource a -> UrlSource a -> Ordering)
-> (UrlSource a -> UrlSource a -> Bool)
-> (UrlSource a -> UrlSource a -> Bool)
-> (UrlSource a -> UrlSource a -> Bool)
-> (UrlSource a -> UrlSource a -> Bool)
-> (UrlSource a -> UrlSource a -> UrlSource a)
-> (UrlSource a -> UrlSource a -> UrlSource a)
-> Ord (UrlSource a)
UrlSource a -> UrlSource a -> Bool
UrlSource a -> UrlSource a -> Ordering
UrlSource a -> UrlSource a -> UrlSource a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall (a :: IpType). Eq (UrlSource a)
forall (a :: IpType). UrlSource a -> UrlSource a -> Bool
forall (a :: IpType). UrlSource a -> UrlSource a -> Ordering
forall (a :: IpType). UrlSource a -> UrlSource a -> UrlSource a
$ccompare :: forall (a :: IpType). UrlSource a -> UrlSource a -> Ordering
compare :: UrlSource a -> UrlSource a -> Ordering
$c< :: forall (a :: IpType). UrlSource a -> UrlSource a -> Bool
< :: UrlSource a -> UrlSource a -> Bool
$c<= :: forall (a :: IpType). UrlSource a -> UrlSource a -> Bool
<= :: UrlSource a -> UrlSource a -> Bool
$c> :: forall (a :: IpType). UrlSource a -> UrlSource a -> Bool
> :: UrlSource a -> UrlSource a -> Bool
$c>= :: forall (a :: IpType). UrlSource a -> UrlSource a -> Bool
>= :: UrlSource a -> UrlSource a -> Bool
$cmax :: forall (a :: IpType). UrlSource a -> UrlSource a -> UrlSource a
max :: UrlSource a -> UrlSource a -> UrlSource a
$cmin :: forall (a :: IpType). UrlSource a -> UrlSource a -> UrlSource a
min :: UrlSource a -> UrlSource a -> UrlSource a
Ord,
      -- | @since 0.1
      Int -> UrlSource a -> ShowS
[UrlSource a] -> ShowS
UrlSource a -> [Char]
(Int -> UrlSource a -> ShowS)
-> (UrlSource a -> [Char])
-> ([UrlSource a] -> ShowS)
-> Show (UrlSource a)
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
forall (a :: IpType). Int -> UrlSource a -> ShowS
forall (a :: IpType). [UrlSource a] -> ShowS
forall (a :: IpType). UrlSource a -> [Char]
$cshowsPrec :: forall (a :: IpType). Int -> UrlSource a -> ShowS
showsPrec :: Int -> UrlSource a -> ShowS
$cshow :: forall (a :: IpType). UrlSource a -> [Char]
show :: UrlSource a -> [Char]
$cshowList :: forall (a :: IpType). [UrlSource a] -> ShowS
showList :: [UrlSource a] -> ShowS
Show
    )
  deriving newtype
    ( -- | @since 0.1
      [Char] -> UrlSource a
([Char] -> UrlSource a) -> IsString (UrlSource a)
forall a. ([Char] -> a) -> IsString a
forall (a :: IpType). [Char] -> UrlSource a
$cfromString :: forall (a :: IpType). [Char] -> UrlSource a
fromString :: [Char] -> UrlSource a
IsString
    )
  deriving anyclass
    ( -- | @since 0.1
      UrlSource a -> ()
(UrlSource a -> ()) -> NFData (UrlSource a)
forall a. (a -> ()) -> NFData a
forall (a :: IpType). UrlSource a -> ()
$crnf :: forall (a :: IpType). UrlSource a -> ()
rnf :: UrlSource a -> ()
NFData
    )

-- | @since 0.1
instance
  (k ~ An_Iso, a ~ Text, b ~ Text) =>
  LabelOptic "unUrlSource" k (UrlSource p) (UrlSource p) a b
  where
  labelOptic :: Optic k NoIx (UrlSource p) (UrlSource p) a b
labelOptic = (UrlSource p -> a)
-> (b -> UrlSource p) -> Iso (UrlSource p) (UrlSource p) a b
forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso (\(MkUrlSource Text
s) -> a
Text
s) b -> UrlSource p
Text -> UrlSource p
forall (a :: IpType). Text -> UrlSource a
MkUrlSource
  {-# INLINE labelOptic #-}

-- | Complete configuration for querying global IP addresses.
--
-- @since 0.1
type GlobalIpConfig :: Type -> Type
data GlobalIpConfig a = MkGlobalIpConfig
  { -- | Determines how we want to query.
    --
    -- @since 0.1
    forall a. GlobalIpConfig a -> GlobalIpApp
app :: GlobalIpApp,
    -- | Extra lookup sources. This will be either a single @['UrlSource' a]@
    -- or a pair @(['UrlSource' 'Ipv4'], ['UrlSource' 'Ipv6'])@, depending on
    -- which address we want to retrieve.
    --
    -- @since 0.1
    forall a. GlobalIpConfig a -> a
sources :: a
  }
  deriving stock
    ( -- | @since 0.1
      GlobalIpConfig a -> GlobalIpConfig a -> Bool
(GlobalIpConfig a -> GlobalIpConfig a -> Bool)
-> (GlobalIpConfig a -> GlobalIpConfig a -> Bool)
-> Eq (GlobalIpConfig a)
forall a. Eq a => GlobalIpConfig a -> GlobalIpConfig a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => GlobalIpConfig a -> GlobalIpConfig a -> Bool
== :: GlobalIpConfig a -> GlobalIpConfig a -> Bool
$c/= :: forall a. Eq a => GlobalIpConfig a -> GlobalIpConfig a -> Bool
/= :: GlobalIpConfig a -> GlobalIpConfig a -> Bool
Eq,
      -- | @since 0.1
      (forall x. GlobalIpConfig a -> Rep (GlobalIpConfig a) x)
-> (forall x. Rep (GlobalIpConfig a) x -> GlobalIpConfig a)
-> Generic (GlobalIpConfig a)
forall x. Rep (GlobalIpConfig a) x -> GlobalIpConfig a
forall x. GlobalIpConfig a -> Rep (GlobalIpConfig a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (GlobalIpConfig a) x -> GlobalIpConfig a
forall a x. GlobalIpConfig a -> Rep (GlobalIpConfig a) x
$cfrom :: forall a x. GlobalIpConfig a -> Rep (GlobalIpConfig a) x
from :: forall x. GlobalIpConfig a -> Rep (GlobalIpConfig a) x
$cto :: forall a x. Rep (GlobalIpConfig a) x -> GlobalIpConfig a
to :: forall x. Rep (GlobalIpConfig a) x -> GlobalIpConfig a
Generic,
      -- | @since 0.1
      Int -> GlobalIpConfig a -> ShowS
[GlobalIpConfig a] -> ShowS
GlobalIpConfig a -> [Char]
(Int -> GlobalIpConfig a -> ShowS)
-> (GlobalIpConfig a -> [Char])
-> ([GlobalIpConfig a] -> ShowS)
-> Show (GlobalIpConfig a)
forall a. Show a => Int -> GlobalIpConfig a -> ShowS
forall a. Show a => [GlobalIpConfig a] -> ShowS
forall a. Show a => GlobalIpConfig a -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> GlobalIpConfig a -> ShowS
showsPrec :: Int -> GlobalIpConfig a -> ShowS
$cshow :: forall a. Show a => GlobalIpConfig a -> [Char]
show :: GlobalIpConfig a -> [Char]
$cshowList :: forall a. Show a => [GlobalIpConfig a] -> ShowS
showList :: [GlobalIpConfig a] -> ShowS
Show
    )
  deriving anyclass
    ( -- | @since 0.1
      GlobalIpConfig a -> ()
(GlobalIpConfig a -> ()) -> NFData (GlobalIpConfig a)
forall a. NFData a => GlobalIpConfig a -> ()
forall a. (a -> ()) -> NFData a
$crnf :: forall a. NFData a => GlobalIpConfig a -> ()
rnf :: GlobalIpConfig a -> ()
NFData
    )

-- | @since 0.1
instance
  (k ~ A_Lens, a ~ GlobalIpApp, b ~ GlobalIpApp) =>
  LabelOptic "app" k (GlobalIpConfig s) (GlobalIpConfig s) a b
  where
  labelOptic :: Optic k NoIx (GlobalIpConfig s) (GlobalIpConfig s) a b
labelOptic = LensVL (GlobalIpConfig s) (GlobalIpConfig s) a b
-> Lens (GlobalIpConfig s) (GlobalIpConfig s) a b
forall s t a b. LensVL s t a b -> Lens s t a b
lensVL (LensVL (GlobalIpConfig s) (GlobalIpConfig s) a b
 -> Lens (GlobalIpConfig s) (GlobalIpConfig s) a b)
-> LensVL (GlobalIpConfig s) (GlobalIpConfig s) a b
-> Lens (GlobalIpConfig s) (GlobalIpConfig s) a b
forall a b. (a -> b) -> a -> b
$ \a -> f b
f (MkGlobalIpConfig GlobalIpApp
_app s
_sources) ->
    (GlobalIpApp -> GlobalIpConfig s)
-> f GlobalIpApp -> f (GlobalIpConfig s)
forall a b. (a -> b) -> f a -> f b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (GlobalIpApp -> s -> GlobalIpConfig s
forall a. GlobalIpApp -> a -> GlobalIpConfig a
`MkGlobalIpConfig` s
_sources) (a -> f b
f a
GlobalIpApp
_app)
  {-# INLINE labelOptic #-}

-- | @since 0.1
instance
  (k ~ A_Lens, a ~ s, b ~ s) =>
  LabelOptic "sources" k (GlobalIpConfig s) (GlobalIpConfig s) a b
  where
  labelOptic :: Optic k NoIx (GlobalIpConfig s) (GlobalIpConfig s) a b
labelOptic = LensVL (GlobalIpConfig s) (GlobalIpConfig s) a b
-> Lens (GlobalIpConfig s) (GlobalIpConfig s) a b
forall s t a b. LensVL s t a b -> Lens s t a b
lensVL (LensVL (GlobalIpConfig s) (GlobalIpConfig s) a b
 -> Lens (GlobalIpConfig s) (GlobalIpConfig s) a b)
-> LensVL (GlobalIpConfig s) (GlobalIpConfig s) a b
-> Lens (GlobalIpConfig s) (GlobalIpConfig s) a b
forall a b. (a -> b) -> a -> b
$ \a -> f b
f (MkGlobalIpConfig GlobalIpApp
_app s
_sources) ->
    (s -> GlobalIpConfig s) -> f s -> f (GlobalIpConfig s)
forall a b. (a -> b) -> f a -> f b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (GlobalIpApp -> s -> GlobalIpConfig s
forall a. GlobalIpApp -> a -> GlobalIpConfig a
MkGlobalIpConfig GlobalIpApp
_app) (a -> f b
f a
s
_sources)
  {-# INLINE labelOptic #-}

-- | Type alias for 'Ipv4' 'GlobalIpConfig'.
--
-- @since 0.1.0.0
type GlobalIpv4Config :: Type
type GlobalIpv4Config = GlobalIpConfig [UrlSource Ipv4]

-- | Type alias for 'Ipv6' 'GlobalIpConfig'.
--
-- @since 0.1.0.0
type GlobalIpv6Config :: Type
type GlobalIpv6Config = GlobalIpConfig [UrlSource Ipv6]

-- | Type alias for 'Ipv4' and 'Ipv6' 'GlobalIpConfig'.
--
-- @since 0.1.0.0
type GlobalIpBothConfig :: Type
type GlobalIpBothConfig = GlobalIpConfig ([UrlSource Ipv4], [UrlSource Ipv6])