module Plotserver.Types where import Data.List (intercalate) import Data.List.Split (splitOn) import Data.Traversable -- TODO what if there isn't any password? data PlotConfig = PlotConfig { server :: String, username :: String, password :: String } deriving (Eq, Show) data PlotData = PlotData [PlotDataRow] type PlotDataRow = (String, [Int]) instance Show PlotData where show (PlotData rows) = intercalate "\n" $ map showRow rows where showRow :: (String, [Int]) -> String showRow (key, values) = key ++ ", " ++ showValues values showValues :: [Int] -> String showValues values = intercalate ", " (map show values) instance Read PlotData where readsPrec _ s = case dataRows of Just dataRows' -> [(PlotData dataRows', "")] Nothing -> [] where rows = filter (not.null) $ splitOn "\n" s dataRows = traverse createDataRow rows :: Maybe [PlotDataRow] createDataRow row = createDataTuple $ splitOn "," row :: Maybe PlotDataRow createDataTuple [] = Nothing createDataTuple (key:sValues) = Just (key, map read sValues) :: Maybe PlotDataRow -- just for the readibility