packages feed

postgresql-syntax-0.5.0.0: library-internal/PostgresqlSyntax/Ast/ArrayExpr.hs

module PostgresqlSyntax.Ast.ArrayExpr where

import PostgresqlSyntax.Ast.ArrayExprList
import PostgresqlSyntax.Ast.ExprList
import qualified PostgresqlSyntax.Helpers.Parsers as Parsers
import qualified PostgresqlSyntax.Helpers.TextBuilders as TextBuilders
import PostgresqlSyntax.IsAst
import PostgresqlSyntax.Prelude
import qualified Test.QuickCheck as Qc

-- |
-- ==== References
-- @
-- array_expr:
--   | '[' expr_list ']'
--   | '[' array_expr_list ']'
--   | '[' ']'
-- @
data ArrayExpr
  = ExprListArrayExpr ExprList
  | ArrayExprListArrayExpr ArrayExprList
  | EmptyArrayExpr
  deriving (Show, Generic, Eq, Ord, Data)

instance IsAst ArrayExpr where
  toTextBuilder settings =
    TextBuilders.renderInBrackets . \case
      ExprListArrayExpr a -> toTextBuilder settings a
      ArrayExprListArrayExpr a -> toTextBuilder settings a
      EmptyArrayExpr -> mempty
  parser settings =
    Parsers.inBrackets $
      asum
        [ ArrayExprListArrayExpr <$> parser settings,
          ExprListArrayExpr <$> parser settings,
          pure EmptyArrayExpr
        ]

instance Qc.Arbitrary ArrayExpr where
  shrink = Qc.genericShrink
  arbitrary =
    Qc.sized $ \n ->
      if n <= 1
        then pure EmptyArrayExpr
        else
          Qc.oneof
            [ ExprListArrayExpr <$> Qc.arbitrary,
              ArrayExprListArrayExpr <$> Qc.arbitrary,
              pure EmptyArrayExpr
            ]