packages feed

sdl3-bindgen-sys-0.0.0.1: src/SDL3/Sys/Bindgen/Time.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}

-- | SDL realtime clock and date\/time routines.
--
--     There are two data types that are used in this category: SDL_Time, which represents the nanoseconds since a specific moment (an \"epoch\"), and 'SDL_DateTime', which breaks time down into human-understandable components: years, months, days, hours, etc.
--
--     Much of the functionality is involved in converting those two types to other useful forms. A structure holding a calendar date and time broken down into its components.
--
--     @since 3.2.0
module SDL3.Sys.Bindgen.Time (
  SDL3.Sys.Bindgen.Time.SDL_DateTime (..),
  SDL3.Sys.Bindgen.Time.SDL_DateFormat (..),
  pattern SDL3.Sys.Bindgen.Time.SDL_DATE_FORMAT_YYYYMMDD,
  pattern SDL3.Sys.Bindgen.Time.SDL_DATE_FORMAT_DDMMYYYY,
  pattern SDL3.Sys.Bindgen.Time.SDL_DATE_FORMAT_MMDDYYYY,
  SDL3.Sys.Bindgen.Time.SDL_TimeFormat (..),
  pattern SDL3.Sys.Bindgen.Time.SDL_TIME_FORMAT_24HR,
  pattern SDL3.Sys.Bindgen.Time.SDL_TIME_FORMAT_12HR,
)
where

import HsBindgen.Runtime.CEnum qualified as CEnum
import HsBindgen.Runtime.HasCField qualified as HasCField
import HsBindgen.Runtime.Marshal qualified as Marshal
import HsBindgen.Runtime.Support qualified as BG
import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField

-- | [C declaration]: @struct SDL_DateTime@, defined at @SDL3\/SDL_time.h 54:16@
data SDL_DateTime = SDL_DateTime
  { year :: BG.CInt
  -- ^ Year
  --
  --          [C declaration]: @year@, defined at @SDL3\/SDL_time.h 56:9@
  , month :: BG.CInt
  -- ^ Month [01-12]
  --
  --          [C declaration]: @month@, defined at @SDL3\/SDL_time.h 57:9@
  , day :: BG.CInt
  -- ^ Day of the month [01-31]
  --
  --          [C declaration]: @day@, defined at @SDL3\/SDL_time.h 58:9@
  , hour :: BG.CInt
  -- ^ Hour [0-23]
  --
  --          [C declaration]: @hour@, defined at @SDL3\/SDL_time.h 59:9@
  , minute :: BG.CInt
  -- ^ Minute [0-59]
  --
  --          [C declaration]: @minute@, defined at @SDL3\/SDL_time.h 60:9@
  , second :: BG.CInt
  -- ^ Seconds [0-60]
  --
  --          [C declaration]: @second@, defined at @SDL3\/SDL_time.h 61:9@
  , nanosecond :: BG.CInt
  -- ^ Nanoseconds [0-999999999]
  --
  --          [C declaration]: @nanosecond@, defined at @SDL3\/SDL_time.h 62:9@
  , day_of_week :: BG.CInt
  -- ^ Day of the week [0-6] (0 being Sunday)
  --
  --          [C declaration]: @day_of_week@, defined at @SDL3\/SDL_time.h 63:9@
  , utc_offset :: BG.CInt
  -- ^ Seconds east of UTC
  --
  --          [C declaration]: @utc_offset@, defined at @SDL3\/SDL_time.h 64:9@
  }
  deriving stock (BG.Generic, Eq, Show)

instance Marshal.StaticSize SDL_DateTime where
  staticSizeOf = \_ -> (36 :: Int)

  staticAlignment = \_ -> (4 :: Int)

instance Marshal.ReadRaw SDL_DateTime where
  readRaw =
    \ptr0 ->
      pure SDL_DateTime
        <*> HasCField.readRaw (BG.Proxy @"year") ptr0
        <*> HasCField.readRaw (BG.Proxy @"month") ptr0
        <*> HasCField.readRaw (BG.Proxy @"day") ptr0
        <*> HasCField.readRaw (BG.Proxy @"hour") ptr0
        <*> HasCField.readRaw (BG.Proxy @"minute") ptr0
        <*> HasCField.readRaw (BG.Proxy @"second") ptr0
        <*> HasCField.readRaw (BG.Proxy @"nanosecond") ptr0
        <*> HasCField.readRaw (BG.Proxy @"day_of_week") ptr0
        <*> HasCField.readRaw (BG.Proxy @"utc_offset") ptr0

instance Marshal.WriteRaw SDL_DateTime where
  writeRaw =
    \ptr0 ->
      \s1 ->
        case s1 of
          SDL_DateTime
            year2
            month3
            day4
            hour5
            minute6
            second7
            nanosecond8
            day_of_week9
            utc_offset10 ->
              HasCField.writeRaw (BG.Proxy @"year") ptr0 year2
                >> HasCField.writeRaw (BG.Proxy @"month") ptr0 month3
                >> HasCField.writeRaw (BG.Proxy @"day") ptr0 day4
                >> HasCField.writeRaw (BG.Proxy @"hour") ptr0 hour5
                >> HasCField.writeRaw (BG.Proxy @"minute") ptr0 minute6
                >> HasCField.writeRaw (BG.Proxy @"second") ptr0 second7
                >> HasCField.writeRaw (BG.Proxy @"nanosecond") ptr0 nanosecond8
                >> HasCField.writeRaw (BG.Proxy @"day_of_week") ptr0 day_of_week9
                >> HasCField.writeRaw (BG.Proxy @"utc_offset") ptr0 utc_offset10

deriving via Marshal.EquivStorable SDL_DateTime instance BG.Storable SDL_DateTime

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "year" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { year = y1
            , month = BG.getField @"month" x0
            , day = BG.getField @"day" x0
            , hour = BG.getField @"hour" x0
            , minute = BG.getField @"minute" x0
            , second = BG.getField @"second" x0
            , nanosecond = BG.getField @"nanosecond" x0
            , day_of_week = BG.getField @"day_of_week" x0
            , utc_offset = BG.getField @"utc_offset" x0
            }
      , BG.getField @"year" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "year" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"year")

instance HasCField.HasCField SDL_DateTime "year" where
  type CFieldType SDL_DateTime "year" = BG.CInt

  offset# = \_ -> \_ -> 0

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "month" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { month = y1
            , year = BG.getField @"year" x0
            , day = BG.getField @"day" x0
            , hour = BG.getField @"hour" x0
            , minute = BG.getField @"minute" x0
            , second = BG.getField @"second" x0
            , nanosecond = BG.getField @"nanosecond" x0
            , day_of_week = BG.getField @"day_of_week" x0
            , utc_offset = BG.getField @"utc_offset" x0
            }
      , BG.getField @"month" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "month" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"month")

instance HasCField.HasCField SDL_DateTime "month" where
  type CFieldType SDL_DateTime "month" = BG.CInt

  offset# = \_ -> \_ -> 4

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "day" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { day = y1
            , year = BG.getField @"year" x0
            , month = BG.getField @"month" x0
            , hour = BG.getField @"hour" x0
            , minute = BG.getField @"minute" x0
            , second = BG.getField @"second" x0
            , nanosecond = BG.getField @"nanosecond" x0
            , day_of_week = BG.getField @"day_of_week" x0
            , utc_offset = BG.getField @"utc_offset" x0
            }
      , BG.getField @"day" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "day" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"day")

instance HasCField.HasCField SDL_DateTime "day" where
  type CFieldType SDL_DateTime "day" = BG.CInt

  offset# = \_ -> \_ -> 8

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "hour" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { hour = y1
            , year = BG.getField @"year" x0
            , month = BG.getField @"month" x0
            , day = BG.getField @"day" x0
            , minute = BG.getField @"minute" x0
            , second = BG.getField @"second" x0
            , nanosecond = BG.getField @"nanosecond" x0
            , day_of_week = BG.getField @"day_of_week" x0
            , utc_offset = BG.getField @"utc_offset" x0
            }
      , BG.getField @"hour" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "hour" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"hour")

instance HasCField.HasCField SDL_DateTime "hour" where
  type CFieldType SDL_DateTime "hour" = BG.CInt

  offset# = \_ -> \_ -> 12

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "minute" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { minute = y1
            , year = BG.getField @"year" x0
            , month = BG.getField @"month" x0
            , day = BG.getField @"day" x0
            , hour = BG.getField @"hour" x0
            , second = BG.getField @"second" x0
            , nanosecond = BG.getField @"nanosecond" x0
            , day_of_week = BG.getField @"day_of_week" x0
            , utc_offset = BG.getField @"utc_offset" x0
            }
      , BG.getField @"minute" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "minute" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"minute")

instance HasCField.HasCField SDL_DateTime "minute" where
  type CFieldType SDL_DateTime "minute" = BG.CInt

  offset# = \_ -> \_ -> 16

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "second" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { second = y1
            , year = BG.getField @"year" x0
            , month = BG.getField @"month" x0
            , day = BG.getField @"day" x0
            , hour = BG.getField @"hour" x0
            , minute = BG.getField @"minute" x0
            , nanosecond = BG.getField @"nanosecond" x0
            , day_of_week = BG.getField @"day_of_week" x0
            , utc_offset = BG.getField @"utc_offset" x0
            }
      , BG.getField @"second" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "second" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"second")

instance HasCField.HasCField SDL_DateTime "second" where
  type CFieldType SDL_DateTime "second" = BG.CInt

  offset# = \_ -> \_ -> 20

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "nanosecond" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { nanosecond = y1
            , year = BG.getField @"year" x0
            , month = BG.getField @"month" x0
            , day = BG.getField @"day" x0
            , hour = BG.getField @"hour" x0
            , minute = BG.getField @"minute" x0
            , second = BG.getField @"second" x0
            , day_of_week = BG.getField @"day_of_week" x0
            , utc_offset = BG.getField @"utc_offset" x0
            }
      , BG.getField @"nanosecond" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "nanosecond" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"nanosecond")

instance HasCField.HasCField SDL_DateTime "nanosecond" where
  type CFieldType SDL_DateTime "nanosecond" = BG.CInt

  offset# = \_ -> \_ -> 24

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "day_of_week" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { day_of_week = y1
            , year = BG.getField @"year" x0
            , month = BG.getField @"month" x0
            , day = BG.getField @"day" x0
            , hour = BG.getField @"hour" x0
            , minute = BG.getField @"minute" x0
            , second = BG.getField @"second" x0
            , nanosecond = BG.getField @"nanosecond" x0
            , utc_offset = BG.getField @"utc_offset" x0
            }
      , BG.getField @"day_of_week" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "day_of_week" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField =
    HasCField.fromPtr (BG.Proxy @"day_of_week")

instance HasCField.HasCField SDL_DateTime "day_of_week" where
  type CFieldType SDL_DateTime "day_of_week" = BG.CInt

  offset# = \_ -> \_ -> 28

instance
  (ty ~ BG.CInt)
  => BG.CompatHasField.HasField "utc_offset" SDL_DateTime ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateTime
            { utc_offset = y1
            , year = BG.getField @"year" x0
            , month = BG.getField @"month" x0
            , day = BG.getField @"day" x0
            , hour = BG.getField @"hour" x0
            , minute = BG.getField @"minute" x0
            , second = BG.getField @"second" x0
            , nanosecond = BG.getField @"nanosecond" x0
            , day_of_week = BG.getField @"day_of_week" x0
            }
      , BG.getField @"utc_offset" x0
      )

instance
  (ty ~ BG.CInt)
  => BG.HasField "utc_offset" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"utc_offset")

instance HasCField.HasCField SDL_DateTime "utc_offset" where
  type CFieldType SDL_DateTime "utc_offset" = BG.CInt

  offset# = \_ -> \_ -> 32

-- | The preferred date format of the current system locale.
--
--     @since 3.2.0
--
--     [See also]: 'sDL_GetDateTimeLocalePreferences'
--
--     [C declaration]: @enum SDL_DateFormat@, defined at @SDL3\/SDL_time.h 74:14@
newtype SDL_DateFormat = SDL_DateFormat
  { unwrap :: BG.CUInt
  }
  deriving stock (BG.Generic, Eq, Ord)
  deriving newtype (BG.HasFFIType)

instance Marshal.StaticSize SDL_DateFormat where
  staticSizeOf = \_ -> (4 :: Int)

  staticAlignment = \_ -> (4 :: Int)

instance Marshal.ReadRaw SDL_DateFormat where
  readRaw =
    \ptr0 ->
      pure SDL_DateFormat
        <*> Marshal.readRawByteOff ptr0 (0 :: Int)

instance Marshal.WriteRaw SDL_DateFormat where
  writeRaw =
    \ptr0 ->
      \s1 ->
        case s1 of
          SDL_DateFormat unwrap2 ->
            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2

deriving via Marshal.EquivStorable SDL_DateFormat instance BG.Storable SDL_DateFormat

deriving via BG.CUInt instance BG.Prim SDL_DateFormat

instance CEnum.CEnum SDL_DateFormat where
  type CEnumZ SDL_DateFormat = BG.CUInt

  toCEnum = SDL_DateFormat

  fromCEnum = BG.getField @"unwrap"

  declaredValues =
    \_ ->
      CEnum.declaredValuesFromList
        [ (0, BG.singleton "SDL_DATE_FORMAT_YYYYMMDD")
        , (1, BG.singleton "SDL_DATE_FORMAT_DDMMYYYY")
        , (2, BG.singleton "SDL_DATE_FORMAT_MMDDYYYY")
        ]

  showsUndeclared =
    CEnum.showsWrappedUndeclared "SDL_DateFormat"

  readPrecUndeclared =
    CEnum.readPrecWrappedUndeclared "SDL_DateFormat"

  isDeclared = CEnum.seqIsDeclared

  mkDeclared = CEnum.seqMkDeclared

instance CEnum.SequentialCEnum SDL_DateFormat where
  minDeclaredValue = SDL_DATE_FORMAT_YYYYMMDD

  maxDeclaredValue = SDL_DATE_FORMAT_MMDDYYYY

instance Show SDL_DateFormat where
  showsPrec = CEnum.shows

instance Read SDL_DateFormat where
  readPrec = CEnum.readPrec

  readList = BG.readListDefault

  readListPrec = BG.readListPrecDefault

instance
  (ty ~ BG.CUInt)
  => BG.CompatHasField.HasField "unwrap" SDL_DateFormat ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_DateFormat{unwrap = y1}
      , BG.getField @"unwrap" x0
      )

instance
  (ty ~ BG.CUInt)
  => BG.HasField "unwrap" (BG.Ptr SDL_DateFormat) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"unwrap")

instance HasCField.HasCField SDL_DateFormat "unwrap" where
  type CFieldType SDL_DateFormat "unwrap" = BG.CUInt

  offset# = \_ -> \_ -> 0

-- | Year\/Month\/Day
--
--     [C declaration]: @SDL_DATE_FORMAT_YYYYMMDD@, defined at @SDL3\/SDL_time.h 76:5@
pattern SDL_DATE_FORMAT_YYYYMMDD :: SDL_DateFormat
pattern SDL_DATE_FORMAT_YYYYMMDD = SDL_DateFormat 0

-- | Day\/Month\/Year
--
--     [C declaration]: @SDL_DATE_FORMAT_DDMMYYYY@, defined at @SDL3\/SDL_time.h 77:5@
pattern SDL_DATE_FORMAT_DDMMYYYY :: SDL_DateFormat
pattern SDL_DATE_FORMAT_DDMMYYYY = SDL_DateFormat 1

-- | Month\/Day\/Year
--
--     [C declaration]: @SDL_DATE_FORMAT_MMDDYYYY@, defined at @SDL3\/SDL_time.h 78:5@
pattern SDL_DATE_FORMAT_MMDDYYYY :: SDL_DateFormat
pattern SDL_DATE_FORMAT_MMDDYYYY = SDL_DateFormat 2

-- | The preferred time format of the current system locale.
--
--     @since 3.2.0
--
--     [See also]: 'sDL_GetDateTimeLocalePreferences'
--
--     [C declaration]: @enum SDL_TimeFormat@, defined at @SDL3\/SDL_time.h 88:14@
newtype SDL_TimeFormat = SDL_TimeFormat
  { unwrap :: BG.CUInt
  }
  deriving stock (BG.Generic, Eq, Ord)
  deriving newtype (BG.HasFFIType)

instance Marshal.StaticSize SDL_TimeFormat where
  staticSizeOf = \_ -> (4 :: Int)

  staticAlignment = \_ -> (4 :: Int)

instance Marshal.ReadRaw SDL_TimeFormat where
  readRaw =
    \ptr0 ->
      pure SDL_TimeFormat
        <*> Marshal.readRawByteOff ptr0 (0 :: Int)

instance Marshal.WriteRaw SDL_TimeFormat where
  writeRaw =
    \ptr0 ->
      \s1 ->
        case s1 of
          SDL_TimeFormat unwrap2 ->
            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2

deriving via Marshal.EquivStorable SDL_TimeFormat instance BG.Storable SDL_TimeFormat

deriving via BG.CUInt instance BG.Prim SDL_TimeFormat

instance CEnum.CEnum SDL_TimeFormat where
  type CEnumZ SDL_TimeFormat = BG.CUInt

  toCEnum = SDL_TimeFormat

  fromCEnum = BG.getField @"unwrap"

  declaredValues =
    \_ ->
      CEnum.declaredValuesFromList
        [ (0, BG.singleton "SDL_TIME_FORMAT_24HR")
        , (1, BG.singleton "SDL_TIME_FORMAT_12HR")
        ]

  showsUndeclared =
    CEnum.showsWrappedUndeclared "SDL_TimeFormat"

  readPrecUndeclared =
    CEnum.readPrecWrappedUndeclared "SDL_TimeFormat"

  isDeclared = CEnum.seqIsDeclared

  mkDeclared = CEnum.seqMkDeclared

instance CEnum.SequentialCEnum SDL_TimeFormat where
  minDeclaredValue = SDL_TIME_FORMAT_24HR

  maxDeclaredValue = SDL_TIME_FORMAT_12HR

instance Show SDL_TimeFormat where
  showsPrec = CEnum.shows

instance Read SDL_TimeFormat where
  readPrec = CEnum.readPrec

  readList = BG.readListDefault

  readListPrec = BG.readListPrecDefault

instance
  (ty ~ BG.CUInt)
  => BG.CompatHasField.HasField "unwrap" SDL_TimeFormat ty
  where
  hasField =
    \x0 ->
      ( \y1 ->
          SDL_TimeFormat{unwrap = y1}
      , BG.getField @"unwrap" x0
      )

instance
  (ty ~ BG.CUInt)
  => BG.HasField "unwrap" (BG.Ptr SDL_TimeFormat) (BG.Ptr ty)
  where
  getField = HasCField.fromPtr (BG.Proxy @"unwrap")

instance HasCField.HasCField SDL_TimeFormat "unwrap" where
  type CFieldType SDL_TimeFormat "unwrap" = BG.CUInt

  offset# = \_ -> \_ -> 0

-- | 24 hour time
--
--     [C declaration]: @SDL_TIME_FORMAT_24HR@, defined at @SDL3\/SDL_time.h 90:5@
pattern SDL_TIME_FORMAT_24HR :: SDL_TimeFormat
pattern SDL_TIME_FORMAT_24HR = SDL_TimeFormat 0

-- | 12 hour time
--
--     [C declaration]: @SDL_TIME_FORMAT_12HR@, defined at @SDL3\/SDL_time.h 91:5@
pattern SDL_TIME_FORMAT_12HR :: SDL_TimeFormat
pattern SDL_TIME_FORMAT_12HR = SDL_TimeFormat 1