{-# LANGUAGE CPP #-}
#ifdef TEMPLATE_HASKELL
{-# LANGUAGE TemplateHaskell #-}
#endif
module Happstack.Server.Internal.SocketTH(supportsIPv6) where
#ifdef TEMPLATE_HASKELL
import Language.Haskell.TH
#endif
import Network.Socket(SockAddr(..))
supportsIPv6 :: Bool
#ifdef TEMPLATE_HASKELL
supportsIPv6 = $(let c = ["Network.Socket.SockAddrInet6", "Network.Socket.Internal.SockAddrInet6"] ; d = ''SockAddr
isInet6 :: Con -> Bool
isInet6 (NormalC n _) = show n `elem` c
isInet6 _ = False
in
do info <- reify d
case info of
#if MIN_VERSION_template_haskell(2,11,0)
TyConI (DataD _ _ _ _ cs _) ->
#else
TyConI (DataD _ _ _ cs _) ->
#endif
if any isInet6 cs
then [| True |]
else [| False |]
_ -> error "supportsIPv6: SockAddr is no longer a TyConI ?!?! Giving up."
)
#else
supportsIPv6 = False
#endif