module Sqel.Data.Selector where

import Sqel.Data.Sql (Sql (Sql), ToSql (toSql), sql)
import Sqel.Text.Quote (dquote)

newtype Selector =
  Selector { Selector -> Sql
unSelector :: Sql }
  deriving stock (Selector -> Selector -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Selector -> Selector -> Bool
$c/= :: Selector -> Selector -> Bool
== :: Selector -> Selector -> Bool
$c== :: Selector -> Selector -> Bool
Eq, Int -> Selector -> ShowS
[Selector] -> ShowS
Selector -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Selector] -> ShowS
$cshowList :: [Selector] -> ShowS
show :: Selector -> String
$cshow :: Selector -> String
showsPrec :: Int -> Selector -> ShowS
$cshowsPrec :: Int -> Selector -> ShowS
Show, forall x. Rep Selector x -> Selector
forall x. Selector -> Rep Selector x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Selector x -> Selector
$cfrom :: forall x. Selector -> Rep Selector x
Generic, Eq Selector
Selector -> Selector -> Bool
Selector -> Selector -> Ordering
Selector -> Selector -> Selector
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Selector -> Selector -> Selector
$cmin :: Selector -> Selector -> Selector
max :: Selector -> Selector -> Selector
$cmax :: Selector -> Selector -> Selector
>= :: Selector -> Selector -> Bool
$c>= :: Selector -> Selector -> Bool
> :: Selector -> Selector -> Bool
$c> :: Selector -> Selector -> Bool
<= :: Selector -> Selector -> Bool
$c<= :: Selector -> Selector -> Bool
< :: Selector -> Selector -> Bool
$c< :: Selector -> Selector -> Bool
compare :: Selector -> Selector -> Ordering
$ccompare :: Selector -> Selector -> Ordering
Ord)
  deriving newtype (String -> Selector
forall a. (String -> a) -> IsString a
fromString :: String -> Selector
$cfromString :: String -> Selector
IsString, NonEmpty Selector -> Selector
Selector -> Selector -> Selector
forall b. Integral b => b -> Selector -> Selector
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: forall b. Integral b => b -> Selector -> Selector
$cstimes :: forall b. Integral b => b -> Selector -> Selector
sconcat :: NonEmpty Selector -> Selector
$csconcat :: NonEmpty Selector -> Selector
<> :: Selector -> Selector -> Selector
$c<> :: Selector -> Selector -> Selector
Semigroup, Semigroup Selector
Selector
[Selector] -> Selector
Selector -> Selector -> Selector
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [Selector] -> Selector
$cmconcat :: [Selector] -> Selector
mappend :: Selector -> Selector -> Selector
$cmappend :: Selector -> Selector -> Selector
mempty :: Selector
$cmempty :: Selector
Monoid)

textSelector :: Text -> Selector
textSelector :: Text -> Selector
textSelector =
  Sql -> Selector
Selector forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Sql
Sql

nameSelector :: Text -> Selector
nameSelector :: Text -> Selector
nameSelector =
  Text -> Selector
textSelector forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Exon a => a -> a
dquote

assign :: Selector -> Sql -> Sql
assign :: Selector -> Sql -> Sql
assign (Selector Sql
name) Sql
value =
  [sql|#{name} = #{value}|]

instance ToSql Selector where
  toSql :: Selector -> Sql
toSql = Selector -> Sql
unSelector