second-transfer-0.10.0.1: hs-src/SecondTransfer/Sessions/HashableSockAddr.hs
{-# LANGUAGE FlexibleContexts, Rank2Types, TemplateHaskell, OverloadedStrings, GADTs, DeriveGeneric #-}
module SecondTransfer.Sessions.HashableSockAddr (
HashableSockAddr
, hashableSockAddrFromNSSockAddr
) where
import GHC.Generics (Generic)
import Data.Hashable
import Data.Word
import Network.Socket (SockAddr(..))
-- | Since SockAddr is not hashable, we need our own. TODO: IPv6.
newtype HashableSockAddr = HashableSockAddr (Word8, Word8, Word8, Word8)
deriving (Eq, Show, Generic)
instance Hashable HashableSockAddr
hashableSockAddrFromNSSockAddr :: SockAddr -> Maybe HashableSockAddr
hashableSockAddrFromNSSockAddr (SockAddrInet _port_number haddr) =
Just . HashableSockAddr $ (
fromIntegral $ haddr `div` 16777216,
fromIntegral $ haddr `div` 65536 `mod` 256,
fromIntegral $ haddr `div` 256 `mod` 256,
fromIntegral $ haddr `mod` 256
)
hashableSockAddrFromNSSockAddr _ = Nothing