mcpi-0.0.0.1: src/Network/MineCraft/Pi/Client.hs
--------------------------------------------------------------------------------
-- |
-- Module : Client
-- License : Public Domain
--
-- Maintainer : Douglas Burke
-- Stability : experimental
-- Portability : Haskell 98
--
-- The main interface for connecting to the Raspberry-PI version
-- of MineCraft. The 'Network.MineCraft.Pi.Client.Internal' module
-- provides lower-level access in case this module in insufficient.
--
-- There are two types of calls to MineCraft: "command" and "query".
-- Commands change the state of the server and do not return anything,
-- queries return information from the server, and presumably does not
-- change the server state. This terminology may change.
--
-- I am not sure the use of the @FromMineCraft@ and @ToMineCraft@
-- type classes is justified, given that the API has a very limited
-- set of types.
--
--------------------------------------------------------------------------------
module Network.MineCraft.Pi.Client
( MCPI
, runMCPI
-- * Conversion routines
, FromMineCraft(..)
, ToMineCraft(..)
-- * Utility routine
, eRead
) where
import Data.List (intercalate)
import Data.List.Split (splitOn)
import Data.Maybe (fromMaybe, listToMaybe)
import Network.MineCraft.Pi.Client.Internal
-- | Convert the return value from MineCraft into
-- a Haskell type.
class FromMineCraft a where
fromMC :: String -> a
-- | Send a value to MineCraft.
class ToMineCraft a where
toMC :: a -> String
-- Isn't this in base somewhere by now?
maybeRead :: Read a => String -> Maybe a
maybeRead = fmap fst . listToMaybe . reads
-- | Convert a value, but error out if it can not be
-- converted.
eRead :: (Read a) => String -> a
eRead s = fromMaybe (error ("*Conversion error* " ++ s)) $ maybeRead s
instance FromMineCraft Int where
fromMC = eRead
instance ToMineCraft Int where
toMC = show
instance FromMineCraft Float where
fromMC = eRead
instance ToMineCraft Float where
toMC = show
instance FromMineCraft a => FromMineCraft [a] where
fromMC = map fromMC . splitOn ","
instance ToMineCraft a => ToMineCraft [a] where
toMC = intercalate "," . map toMC
instance (FromMineCraft a, FromMineCraft b) => FromMineCraft (a, b) where
fromMC s = case splitOn "," s of
(a:b:[]) -> (fromMC a, fromMC b)
_ -> error $ "*Expected 2 values* " ++ s
instance (ToMineCraft a, ToMineCraft b) => ToMineCraft (a, b) where
toMC (a,b) = toMC a ++ "," ++ toMC b