{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE AllowAmbiguousTypes #-} module Chiasma.Codec.Query( TmuxDataQuery(..), ) where import GHC.Generics ((:*:), D1, C1, S1, Selector, selName) import GHC.Unicode (isUpper, toLower) class TmuxDataQuery f where query' :: [String] instance (TmuxDataQuery f, TmuxDataQuery g) => TmuxDataQuery (f :*: g) where query' = query' @f ++ query' @g instance TmuxDataQuery f => (TmuxDataQuery (D1 c f)) where query' = query' @f instance TmuxDataQuery f => (TmuxDataQuery (C1 c f)) where query' = query' @f trans :: Char -> String trans a | isUpper a = ['_', toLower a] trans a = [a] snakeCase :: String -> String snakeCase = (>>= trans) formatQuery :: String -> String formatQuery q = "#{" ++ snakeCase q ++ "}" instance Selector s => (TmuxDataQuery (S1 s f)) where query' = [formatQuery query] where query = selName (undefined :: t s f p)