{-# OPTIONS_GHC -fno-cse #-}


{-| Obtain a MAC address for the host system, on *NIX and Windows.
 -}


module System.Info.MAC
  ( mac
  , macs
  , nic
  , nics
  , refresh
  ) where

import Data.MAC
import System.Info.MAC.Fetch

import Data.IORef
import System.IO
import System.IO.Unsafe
import Data.Maybe
import Control.Applicative


{-| Fetch MAC address, using a cached value if it is available.
 -}
mac                         ::  IO (Maybe MAC)
mac                          =  listToMaybe <$> macs


{-| Fetch MAC addresses, using a cached value if it is available.
 -}
macs                        ::  IO [MAC]
macs                         =  map snd <$> nics


{-| Fetch a name-MAC pair, using a cached value if it is available.
 -}
nic                         ::  IO (Maybe (String, MAC))
nic                          =  listToMaybe <$> nics


{-| Fetch name-MAC pairs, using a cached value if it is available.
 -}
nics                        ::  IO [(String, MAC)]
nics                         =  do
  val                       <-  readIORef fetched
  case val of [ ]           ->  refresh
              _:_           ->  return val


{-| Explicitly re-run the MAC reading operation.
 -}
refresh                     ::  IO [(String, MAC)]
refresh                      =  do
  res                       <-  fetchNICs
  writeIORef fetched res
  return res


{-# NOINLINE fetched #-}
fetched                      =  unsafePerformIO $ newIORef []