module Net.ClientInterface where

import Data.Word(Word16)
import qualified Net.IPv4 as IP
import qualified Net.ARP_Protocol as ARP
import qualified Net.UDP_Client as UC
import qualified Net.TCP_Client as TC

data Config = DHCP
	    | Fixed { Config -> Addr
myIP,Config -> Addr
routerIP,Config -> Addr
netmask::IP.Addr }
	      deriving (Int -> Config -> ShowS
[Config] -> ShowS
Config -> String
(Int -> Config -> ShowS)
-> (Config -> String) -> ([Config] -> ShowS) -> Show Config
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Config -> ShowS
showsPrec :: Int -> Config -> ShowS
$cshow :: Config -> String
show :: Config -> String
$cshowList :: [Config] -> ShowS
showList :: [Config] -> ShowS
Show)

fixed :: Addr -> Addr -> Config
fixed Addr
myIP Addr
routerIP = Addr -> Addr -> Addr -> Config
Fixed Addr
myIP Addr
routerIP (Addr -> Addr
IP.defaultNetmask Addr
myIP)

data Net m
  = Net {
      forall (m :: * -> *). Net m -> Addr -> Word16 -> Word16 -> m ()
ping :: IP.Addr -> Word16 -> Word16 -> m (),
      forall (m :: * -> *). Net m -> m CacheDump
dump :: m ARP.CacheDump,
      forall (m :: * -> *). Net m -> Interface m
udp  :: UC.Interface m,
      forall (m :: * -> *). Net m -> Interface m
tcp  :: TC.Interface m
    }