module Opaleye.Internal.Tag where

import Control.Monad.Trans.State.Strict ( get, modify', State )

-- | Tag is for use as a source of unique IDs in QueryArr
newtype Tag = UnsafeTag Int deriving (ReadPrec [Tag]
ReadPrec Tag
Int -> ReadS Tag
ReadS [Tag]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Tag]
$creadListPrec :: ReadPrec [Tag]
readPrec :: ReadPrec Tag
$creadPrec :: ReadPrec Tag
readList :: ReadS [Tag]
$creadList :: ReadS [Tag]
readsPrec :: Int -> ReadS Tag
$creadsPrec :: Int -> ReadS Tag
Read, Int -> Tag -> ShowS
[Tag] -> ShowS
Tag -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Tag] -> ShowS
$cshowList :: [Tag] -> ShowS
show :: Tag -> String
$cshow :: Tag -> String
showsPrec :: Int -> Tag -> ShowS
$cshowsPrec :: Int -> Tag -> ShowS
Show)

start :: Tag
start :: Tag
start = Int -> Tag
UnsafeTag Int
1

next :: Tag -> Tag
next :: Tag -> Tag
next = Int -> Tag
UnsafeTag forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Num a => a -> a -> a
+Int
1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tag -> Int
unsafeUnTag

unsafeUnTag :: Tag -> Int
unsafeUnTag :: Tag -> Int
unsafeUnTag (UnsafeTag Int
i) = Int
i

tagWith :: Tag -> String -> String
tagWith :: Tag -> ShowS
tagWith Tag
t String
s = String
s forall a. [a] -> [a] -> [a]
++ String
"_" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (Tag -> Int
unsafeUnTag Tag
t)

fresh :: State Tag Tag
fresh :: State Tag Tag
fresh = do
  Tag
t <- forall (m :: * -> *) s. Monad m => StateT s m s
get
  forall (m :: * -> *) s. Monad m => (s -> s) -> StateT s m ()
modify' Tag -> Tag
next
  forall (f :: * -> *) a. Applicative f => a -> f a
pure Tag
t