packages feed

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