module Network.DO.IP.Commands where
import Control.Comonad.Trans.Cofree
import Control.Monad.Trans.Free
import Data.IP
import Network.DO.Pairing
import Network.DO.Types
import Prelude as P
data IPCommands a = ListFloatingIPs ([FloatingIP] -> a)
| CreateIP FloatingIPTarget (Result FloatingIP -> a)
| DeleteIP IP (Maybe String -> a)
| ActionIP IP IPAction (Result (ActionResult IPActionType) -> a)
deriving (Functor)
type IPCommandsT = FreeT IPCommands
listFloatingIPs :: IPCommands [FloatingIP]
listFloatingIPs = ListFloatingIPs P.id
createFloatingIP :: FloatingIPTarget -> IPCommands (Result FloatingIP)
createFloatingIP target = CreateIP target P.id
deleteFloatingIP :: IP -> IPCommands (Maybe String)
deleteFloatingIP ip = DeleteIP ip P.id
floatingIPAction :: IP -> IPAction -> IPCommands (Result (ActionResult IPActionType))
floatingIPAction ip action = ActionIP ip action P.id
data CoIPCommands m k =
CoIPCommands { listFloatingIPsH :: (m [FloatingIP], k)
, createFloatingIPH :: FloatingIPTarget -> (m (Result FloatingIP), k)
, deleteIPH :: IP -> (m (Maybe String), k)
, actionIPH :: IP -> IPAction -> (m (Result (ActionResult IPActionType)), k)
} deriving Functor
type CoIPCommandsT m = CofreeT (CoIPCommands m)
instance (Monad m) => PairingM (CoIPCommands m) IPCommands m where
pairM f (CoIPCommands ks _ _ _) (ListFloatingIPs k) = pairM f ks k
pairM f (CoIPCommands _ tgt _ _) (CreateIP i k) = pairM f (tgt i) k
pairM f (CoIPCommands _ _ del _) (DeleteIP i k) = pairM f (del i) k
pairM f (CoIPCommands _ _ _ act) (ActionIP i a k) = pairM f (act i a) k