packages feed

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

module PostgresqlSyntax.Ast.Fconst where

import qualified PostgresqlSyntax.Extras.TextBuilder as TextBuilder
import qualified PostgresqlSyntax.Helpers.Parsers as Parsers
import PostgresqlSyntax.IsAst
import PostgresqlSyntax.Prelude
import qualified Test.QuickCheck as Qc

-- |
-- ==== References
-- @
-- FCONST
-- @
newtype Fconst = Fconst Double
  deriving (Show, Generic, Eq, Ord, Data)

instance IsAst Fconst where
  toTextBuilder _settings (Fconst a) = TextBuilder.doubleDec a
  parser _settings = Fconst <$> Parsers.float

instance Qc.Arbitrary Fconst where
  shrink = Qc.genericShrink

  -- Parsed via 'Parsers.float' (unsigned — the sign, when present, is a
  -- separate unary @AExpr@\/@BExpr@ operator applied outside this type), so
  -- it must never be negative, mirroring
  -- 'PostgresqlSyntax.Ast.IntervalSecond'\'s own @nonNegative@.
  arbitrary =
    Fconst . abs
      <$> (Qc.arbitrary `Qc.suchThat` (\a -> fromIntegral (round a :: Int) /= a))