    {-# LANGUAGE DeriveLift #-}
    module Data.Aeson.JSONPath.Types.Query
      ( Query (..)
      , QueryType (..)
      , QueryState (..)
      )
      where

    import Data.Aeson  (Value)
    import Data.Vector (Vector)

    import Data.Aeson.JSONPath.Types.Segment (QuerySegment (..))
    import Language.Haskell.TH.Syntax        (Lift)

    import Prelude

    -- |
    data QueryState = QueryState
      { QueryState -> Value
    rootVal      :: Value
      , QueryState -> Value
    curVal       :: Value
      , QueryState -> Query -> QueryState -> Vector Value
    executeQuery :: Query -> QueryState -> Vector Value
      }

    -- |
    data QueryType
      = Root
      | Current
      deriving (QueryType -> QueryType -> Bool
    (QueryType -> QueryType -> Bool)
    -> (QueryType -> QueryType -> Bool) -> Eq QueryType
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: QueryType -> QueryType -> Bool
    == :: QueryType -> QueryType -> Bool
    $c/= :: QueryType -> QueryType -> Bool
    /= :: QueryType -> QueryType -> Bool
    Eq, Int -> QueryType -> ShowS
    [QueryType] -> ShowS
    QueryType -> String
    (Int -> QueryType -> ShowS)
    -> (QueryType -> String)
    -> ([QueryType] -> ShowS)
    -> Show QueryType
    forall a.
    (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
    $cshowsPrec :: Int -> QueryType -> ShowS
    showsPrec :: Int -> QueryType -> ShowS
    $cshow :: QueryType -> String
    show :: QueryType -> String
    $cshowList :: [QueryType] -> ShowS
    showList :: [QueryType] -> ShowS
    Show, (forall (m :: * -> *). Quote m => QueryType -> m Exp)
    -> (forall (m :: * -> *). Quote m => QueryType -> Code m QueryType)
    -> Lift QueryType
    forall t.
    (forall (m :: * -> *). Quote m => t -> m Exp)
    -> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
    forall (m :: * -> *). Quote m => QueryType -> m Exp
    forall (m :: * -> *). Quote m => QueryType -> Code m QueryType
    $clift :: forall (m :: * -> *). Quote m => QueryType -> m Exp
    lift :: forall (m :: * -> *). Quote m => QueryType -> m Exp
    $cliftTyped :: forall (m :: * -> *). Quote m => QueryType -> Code m QueryType
    liftTyped :: forall (m :: * -> *). Quote m => QueryType -> Code m QueryType
    Lift)

    -- |
    data Query = Query
      { Query -> QueryType
    queryType     :: QueryType
      , Query -> [QuerySegment Query]
    querySegments :: [QuerySegment Query]
      } deriving (Query -> Query -> Bool
    (Query -> Query -> Bool) -> (Query -> Query -> Bool) -> Eq Query
    forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
    $c== :: Query -> Query -> Bool
    == :: Query -> Query -> Bool
    $c/= :: Query -> Query -> Bool
    /= :: Query -> Query -> Bool
    Eq, Int -> Query -> ShowS
    [Query] -> ShowS
    Query -> String
    (Int -> Query -> ShowS)
    -> (Query -> String) -> ([Query] -> ShowS) -> Show Query
    forall a.
    (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
    $cshowsPrec :: Int -> Query -> ShowS
    showsPrec :: Int -> Query -> ShowS
    $cshow :: Query -> String
    show :: Query -> String
    $cshowList :: [Query] -> ShowS
    showList :: [Query] -> ShowS
    Show, (forall (m :: * -> *). Quote m => Query -> m Exp)
    -> (forall (m :: * -> *). Quote m => Query -> Code m Query)
    -> Lift Query
    forall t.
    (forall (m :: * -> *). Quote m => t -> m Exp)
    -> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
    forall (m :: * -> *). Quote m => Query -> m Exp
    forall (m :: * -> *). Quote m => Query -> Code m Query
    $clift :: forall (m :: * -> *). Quote m => Query -> m Exp
    lift :: forall (m :: * -> *). Quote m => Query -> m Exp
    $cliftTyped :: forall (m :: * -> *). Quote m => Query -> Code m Query
    liftTyped :: forall (m :: * -> *). Quote m => Query -> Code m Query
    Lift)