{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE AllowAmbiguousTypes #-} module Chiasma.Codec( TmuxCodec(..), TmuxQuery(..), ) where import GHC.Generics (Generic, Rep, to) import Chiasma.Codec.Decode (TmuxDataDecode(..), TmuxDecodeError(TooManyFields)) import Chiasma.Codec.Query (TmuxDataQuery(..)) newtype TmuxQuery = TmuxQuery { unQ :: String } deriving (Eq, Show) genDecode :: (Generic a, TmuxDataDecode (Rep a)) => [String] -> Either TmuxDecodeError a genDecode fields = do (rest, result) <- decode' fields case rest of [] -> return $ to result a -> Left $ TooManyFields a class TmuxCodec a where decode :: [String] -> Either TmuxDecodeError a default decode :: (Generic a, TmuxDataDecode (Rep a)) => [String] -> Either TmuxDecodeError a decode = genDecode query :: TmuxQuery default query :: (Generic a, TmuxDataQuery (Rep a)) => TmuxQuery query = TmuxQuery $ unwords $ query' @(Rep a)