:- module(constructors, [
      user:('==>')/2
   ]).

% string
string('NaN') ==> data('string', ['NaN']).

% boolean
boolean('1') ==> data('boolean', [true]).
boolean('true') ==> data('boolean', [true]).
boolean('0') ==> data('boolean', [false]).
boolean('false') ==> data('boolean', [false]).
boolean('arbitrary') ==> data('boolean', [true]).

% decimal
decimal('+1.234') ==> data('decimal', [1.234]).
decimal('.234') ==> data('decimal', [0.234]).
decimal('test') ==> false.

% float
float('-3.1415') ==> data('float', [-3.1415]).
float('-0') ==> data('float', [0]).
float('-3E2') ==> data('float', [-300.0]).
float('4268.22752E11') ==> data('float', [426822752000000.0]).
float('-INF') ==> data('float', [-inf]).
float('NaN') ==> data('float', [nan]).
float('NAN') ==> false.

% double
double('-3.1415') ==> data('double', [-3.1415]).
double('-0') ==> data('double', [0]).
double('-3E2') ==> data('double', [-300.0]).
double('4268.22752E11') ==> data('double', [426822752000000.0]).
double('-INF') ==> data('double', [-inf]).
double('NaN') ==> data('double', [nan]).
double('NAN') ==> false.

% duration
duration('P2Y6M5DT12H35M30S') ==> data('duration', [+, 2, 6, 5, 12, 35, 30]).
duration('P2M') ==> data('duration', [+, 0, 2, 0, 0, 0, 0]).
duration('-PT01M30.5S') ==> data('duration', [+, 0, 0, 0, 0, 1, 30.5]).
duration('-P0Y') ==> data('duration', [+, 0, 0, 0, 0, 0, 0]).
duration('P2Y13M40DT30H65M92S') ==> data('duration', [+, 3, 2, 10, 7, 6, 32]).

% dateTime
dateTime('-0032-04-12T13:20:00') ==> data('dateTime', [-32, 4, 12, 13, 20, 0, 0]).
dateTime('-0032-04-12T13:20:00Z') ==> data('dateTime', [-32, 4, 12, 13, 20, 0, 0]).
dateTime('-12345-04-12T13:20:00-14:00') ==> data('dateTime', [-12345, 4, 12, 13, 20, 0, -840]).
dateTime('-1234-04-12T13:20:00+14:00') ==> data('dateTime', [-1234, 4, 12, 13, 20, 0, 840]).
dateTime('0000-01-01T00:00:00') ==> data('dateTime', [0, 1, 1, 0, 0, 0, 0]).
dateTime('2004-04-12T13:20:00Z') ==> data('dateTime', [2004, 4, 12, 13, 20, 0, 0]).
dateTime('2004-04-12T13:20:00-05:00') ==> data('dateTime', [2004, 4, 12, 13, 20, 0, -300]).
dateTime('2004-04-12T13:20:00+11:59') ==> data('dateTime', [2004, 4, 12, 13, 20, 0, 719]).
dateTime('2004-04-12', '13:20:00') ==> data('dateTime', [2004, 4, 12, 13, 20, 0, 0]).
dateTime('2004-04-12+01:30', '13:20:00+01:30') ==> data('dateTime', [2004, 4, 12, 13, 20, 0, 90]).
dateTime('2004-04-12+01:30', '13:20:00') ==> data('dateTime', [2004, 4, 12, 13, 20, 0, 90]).
dateTime('2004-04-12', '13:20:00+01:30') ==> data('dateTime', [2004, 4, 12, 13, 20, 0, 90]).
dateTime('2004-04-12-01:30', '13:20:00+01:30').

% time
time('13:20:30.5555') ==> data('time', [0, 0, 0, 13, 20, 30.5555, 0]).
time('07:39:00Z') ==> data('time', [0, 0, 0, 7, 39, 0, 0]).
time('13:20:00-05:20') ==> data('time', [0, 0, 0, 13, 20, 0, -320]).
time('13:20:00+10:45') ==> data('time', [0, 0, 0, 13, 20, 0, 645]).

% date
date('-0032-01-01') ==> data('date', [-32, 1, 1, 0, 0, 0, 0]).
date('-0032-04-12Z') ==> data('date', [-32, 4, 12, 0, 0, 0, 0]).
date('-0032-04-12-12:11') ==> data('date', [-32, 4, 12, 0, 0, 0, -731]).
date('-0032-04-12+06:39') ==> data('date', [-32, 4, 12, 0, 0, 0, 399]).
date('12004-04-12') ==> data('date', [12004, 4, 12, 0, 0, 0, 0]).
date('2004-04-12Z') ==> data('date', [2004, 4, 12, 0, 0, 0, 0]).
date('2004-04-12-13:59') ==> data('date', [2004, 4, 12, 0, 0, 0, -839]).
date('2004-04-12+13:59') ==> data('date', [2004, 4, 12, 0, 0, 0, 839]).

% gYearMonth
gYearMonth('-0032-01') ==> data('gYearMonth', [-32, 1, 0, 0, 0, 0, 0]).
gYearMonth('-0032-04Z') ==> data('gYearMonth', [-32, 4, 0, 0, 0, 0, 0]).
gYearMonth('-0032-04-12:11') ==> data('gYearMonth', [-32, 4, 0, 0, 0, 0, -731]).
gYearMonth('-0032-04+06:39') ==> data('gYearMonth', [-32, 4, 0, 0, 0, 0, 399]).
gYearMonth('12004-04') ==> data('gYearMonth', [12004, 4, 0, 0, 0, 0, 0]).
gYearMonth('2004-04Z') ==> data('gYearMonth', [2004, 4, 0, 0, 0, 0, 0]).
gYearMonth('2004-04-13:59') ==> data('gYearMonth', [2004, 4, 0, 0, 0, 0, -839]).
gYearMonth('2004-04+13:59') ==> data('gYearMonth', [2004, 4, 0, 0, 0, 0, 839]).

% gYear
gYear('-0032') ==> data('gYear', [-32, 0, 0, 0, 0, 0, 0]).
gYear('-0032Z') ==> data('gYear', [-32, 0, 0, 0, 0, 0, 0]).
gYear('-0032-12:11') ==> data('gYear', [-32, 0, 0, 0, 0, 0, -731]).
gYear('-0032+06:39') ==> data('gYear', [-32, 0, 0, 0, 0, 0, 399]).
gYear('12004') ==> data('gYear', [12004, 0, 0, 0, 0, 0, 0]).
gYear('2004Z') ==> data('gYear', [2004, 0, 0, 0, 0, 0, 0]).
gYear('2004-13:59') ==> data('gYear', [2004, 0, 0, 0, 0, 0, -839]).
gYear('2004+13:59') ==> data('gYear', [2004, 0, 0, 0, 0, 0, 839]).

% gMonthDay
gMonthDay('--01-01') ==> data('gMonthDay', [0, 1, 1, 0, 0, 0, 0]).
gMonthDay('--04-12Z') ==> data('gMonthDay', [0, 4, 12, 0, 0, 0, 0]).
gMonthDay('--04-12-12:11') ==> data('gMonthDay', [0, 4, 12, 0, 0, 0, -731]).
gMonthDay('--04-12+06:39') ==> data('gMonthDay', [0, 4, 12, 0, 0, 0, 399]).

% gDay
gDay('---01') ==> data('gDay', [0, 0, 1, 0, 0, 0, 0]).
gDay('---12Z') ==> data('gDay', [0, 0, 12, 0, 0, 0, 0]).
gDay('---12-12:11') ==> data('gDay', [0, 0, 12, 0, 0, 0, -731]).
gDay('---12+06:39') ==> data('gDay', [0, 0, 12, 0, 0, 0, 399]).

% gMonth
gMonth('--01') ==> data('gMonth', [0, 1, 0, 0, 0, 0, 0]).
gMonth('--04Z') ==> data('gMonth', [0, 4, 0, 0, 0, 0, 0]).
gMonth('--04-12:11') ==> data('gMonth', [0, 4, 0, 0, 0, 0, -731]).
gMonth('--04+06:39') ==> data('gMonth', [0, 4, 0, 0, 0, 0, 399]).

% hexBinary
hexBinary('0FB8') ==> data('hexBinary', ['0FB8']).
hexBinary('0fb8') ==> data('hexBinary', ['0FB8']).
hexBinary('') ==> data('hexBinary', ['']).

% base64Binary
base64Binary('0 FB8 0F+9') ==> data('base64Binary', ['0FB80F+9']).
base64Binary('0F+40A==') ==> data('base64Binary', ['0F+40A==']).
base64Binary('') ==> data('base64Binary', ['']).

% anyURI
anyURI('https://john.doe@www.example.com:123/forum/questions/?tag=networking#top') ==> data('anyURI', ['https://john.doe@www.example.com:123/forum/questions/?tag=networking#top']).

% QName
QName('pre:myElement') ==> data('QName', ['pre:myElement']).

% normalizedString
normalizedString('   Separated by 3 spaces.') ==> data('normalizedString', ['   Separated by 3 spaces.']).

% token
token('This is a string!') ==> data('token', ['This is a string!']).

% language
language('en-US') ==> data('language', ['en-US']).

% NMTOKEN
NMTOKEN('123_456') ==> data('NMTOKEN', ['123_456']).
NMTOKEN('   additional_spaces_around   ') ==> data('NMTOKEN', ['additional_spaces_around']).

% NCName
NCName('_my-element') ==> data('NCName', ['_my-element']).

% Name
Name('_my:element') ==> data('Name', ['_my:element']).

% ID
ID('_my-element') ==> data('ID', ['_my-element']).

% IDREF
IDREF('_my-element') ==> data('IDREF', ['_my-element']).

% ENTITY
ENTITY('_my-element') ==> data('ENTITY', ['_my-element']).

% integer
integer('0123') ==> data('integer', [123]).
integer('+123') ==> data('integer', [123]).
integer('-123') ==> data('integer', [-123]).

% nonPositiveInteger
nonPositiveInteger('-01234') ==> data('nonPositiveInteger', [-1234]).

% negativeInteger
negativeInteger('-1234') ==> data('negativeInteger', [-1234]).

% long
long('-21474836480') ==> data('long', [-21474836480]).

% int
int('-123') ==> data('int', [-123]).

% short
short('-1234') ==> data('short', [-1234]).

% byte
byte('-128') ==> data('byte', [-128]).

% nonNegativeInteger
nonNegativeInteger('1234') ==> data('nonNegativeInteger', [1234]).

% unsignedLong
unsignedLong('18446744073709551615') ==> data('unsignedLong', [18446744073709551615]).

% unsignedInt
unsignedInt('1234') ==> data('unsignedInt', [1234]).

% unsignedShort
unsignedShort('65432') ==> data('unsignedShort', [65432]).

% unsignedByte
unsignedByte('255') ==> data('unsignedByte', [255]).

% positiveInteger
positiveInteger('1234') ==> data('positiveInteger', [1234]).

% yearMonthDuration
yearMonthDuration('P2Y6M') ==> data('yearMonthDuration', [+, 2, 6, 0, 0, 0, 0]).
yearMonthDuration('P20M') ==> data('yearMonthDuration', [+, 1, 8, 0, 0, 0, 0]).

% dayTimeDuration
dayTimeDuration('P5DT12H35M30S') ==> data('dayTimeDuration', [+, 0, 0, 5, 12, 35, 30]).
dayTimeDuration('PT120M') ==> data('dayTimeDuration', [+, 0, 0, 0, 2, 0, 0]).
dayTimeDuration('PT65.5S') ==> data('dayTimeDuration', [+, 0, 0, 0, 0, 1, 5.5]).

% untypedAtomic
untypedAtomic('Ãæ±98af Ã©âfioe') ==> data('untypedAtomic', ['Ãæ±98af Ã©âfioe']).
