{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE TypeOperators #-} module Chiasma.Codec.Query where import Data.Char (isUpper, toLower) import qualified Data.Text as Text (concatMap, singleton) import GHC.Generics (C1, D1, S1, Selector, selName, (:*:)) class TmuxDataQuery f where query' :: [Text] instance TmuxDataQuery f => (TmuxDataQuery (D1 c f)) where query' :: [Text] query' = TmuxDataQuery f => [Text] forall k (f :: k). TmuxDataQuery f => [Text] query' @f instance TmuxDataQuery f => (TmuxDataQuery (C1 c f)) where query' :: [Text] query' = TmuxDataQuery f => [Text] forall k (f :: k). TmuxDataQuery f => [Text] query' @f instance (TmuxDataQuery f, TmuxDataQuery g) => TmuxDataQuery (f :*: g) where query' :: [Text] query' = TmuxDataQuery f => [Text] forall k (f :: k). TmuxDataQuery f => [Text] query' @f [Text] -> [Text] -> [Text] forall a. Semigroup a => a -> a -> a <> TmuxDataQuery g => [Text] forall k (f :: k). TmuxDataQuery f => [Text] query' @g trans :: Char -> Text trans :: Char -> Text trans Char a | Char -> Bool isUpper Char a = String -> Text forall a. ToText a => a -> Text toText @String [Char Item String '_', Char -> Char toLower Char a] trans Char a = Char -> Text Text.singleton Char a snakeCase :: Text -> Text snakeCase :: Text -> Text snakeCase = (Char -> Text) -> Text -> Text Text.concatMap Char -> Text trans formatQuery :: Text -> Text formatQuery :: Text -> Text formatQuery Text q = Text "#{" Text -> Text -> Text forall a. Semigroup a => a -> a -> a <> Text -> Text snakeCase Text q Text -> Text -> Text forall a. Semigroup a => a -> a -> a <> Text "}" instance Selector s => (TmuxDataQuery (S1 s f)) where query' :: [Text] query' = [Text -> Text formatQuery (String -> Text forall a. ToText a => a -> Text toText String query)] where query :: String query = Any s f Any -> String forall k (s :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *) (f :: k1 -> *) (a :: k1). Selector s => t s f a -> String selName (forall k (t :: Meta -> (k -> *) -> k -> *) (p :: k). t s f p forall a. HasCallStack => a undefined :: t s f p)