content: module Data.Schematic.Helpers where
  
  import Data.Schematic.Schema
  import GHC.TypeLits
  
  
  type UUIDRegex =
    'TRegex "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
  
  type IsUUID = '[UUIDRegex]
  
  -- [ "1985-04-12T23:20:50.52Z"
  -- , "1996-12-19T16:39:57-08:00"
  -- , "1990-12-31T23:59:60Z"
  -- , "1990-12-31T15:59:60-08:00"
  -- , "1937-01-01T12:00:27.87+00:20"
  -- ]
  
  -- components
  type ISO8601Date = "[1-9][0-9]{3}-(0[1-9]|1[0-2])-([0-2][0-9]|3[0-1])"
  
  type ISO8601Time = "([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]"
  
  type ISO8601DateTime =
    AppendSymbol
      ISO8601Date
      (AppendSymbol "(T" (AppendSymbol ISO8601Time ")?"))
  
  type ISO8601UTC = "(Z|\\+00:00)"
  
  type ISO8601DateTimeUTC =
    AppendSymbol ISO8601Date (AppendSymbol "T" (AppendSymbol ISO8601Time ISO8601UTC))
  
  type ISO8601TZ = "\\+[0-1][0-9]:[0-6][0-9]"
  
  type ISO8601DateTimeZoned =
    AppendSymbol ISO8601Date (AppendSymbol "T" (AppendSymbol ISO8601Time ISO8601TZ))
  
  -- regexes
  type ISO8601DateRegex = 'TRegex ISO8601Date
  
  type ISO8601TimeRegex = 'TRegex ISO8601Time
  
  type ISO8601DateTimeRegex = 'TRegex ISO8601DateTime
  
  type ISO8601DateTimeRegexUTC = 'TRegex ISO8601DateTimeUTC
  
  type ISO8601DateTimeRegexZoned = 'TRegex ISO8601DateTimeZoned
  
  -- constraints
  type IsDate = '[ISO8601DateRegex]
  
  type IsTime = '[ISO8601TimeRegex]
  
  type IsDateTime = '[ISO8601DateTimeRegex]
  
  type IsZonedDateTime = '[ISO8601DateTimeRegexZoned]
  
  type IsUTCDateTime = '[ISO8601DateTimeRegexUTC]
  