packages feed

chiasma-0.2.0.0: lib/Chiasma/Codec/Query.hs

{-# 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' = query' @f

instance TmuxDataQuery f => (TmuxDataQuery (C1 c f)) where
  query' = query' @f

instance (TmuxDataQuery f, TmuxDataQuery g) => TmuxDataQuery (f :*: g) where
  query' = query' @f <> query' @g

trans :: Char -> Text
trans a | isUpper a = toText @String ['_', toLower a]
trans a = Text.singleton a

snakeCase :: Text -> Text
snakeCase =
  Text.concatMap trans

formatQuery :: Text -> Text
formatQuery q = "#{" <> snakeCase q <> "}"

instance Selector s => (TmuxDataQuery (S1 s f)) where
  query' =
    [formatQuery (toText query)]
    where
      query = selName (undefined :: t s f p)