packages feed

ip-1.7.8: test/IPv4Text2.hs

module IPv4Text2 where

import Data.Bits (shiftR, (.&.))
import Data.Text (Text)
import qualified Data.Text.Lazy as LText
import qualified Data.Text.Lazy.Builder as TBuilder
import Data.Text.Lazy.Builder.Int (decimal)
import Net.Types (IPv4 (..))

-----------------------------------------
-- Text Builder implementation. This ends
-- up performing worse than the naive
-- implementation.
-----------------------------------------
encode :: IPv4 -> Text
encode = LText.toStrict . TBuilder.toLazyText . toDotDecimalBuilder

toDotDecimalBuilder :: IPv4 -> TBuilder.Builder
toDotDecimalBuilder (IPv4 w) =
  decimal (255 .&. shiftR w 24)
    <> dot
    <> decimal (255 .&. shiftR w 16)
    <> dot
    <> decimal (255 .&. shiftR w 8)
    <> dot
    <> decimal (255 .&. w)
 where
  dot = TBuilder.singleton '.'
{-# INLINE toDotDecimalBuilder #-}