@@ -28,23 +28,12 @@ THE SOFTWARE.
2828
2929// deno-fmt-ignore-file
3030
31- import { IsEqual } from './internal/guard.ts'
32- import { IsMatch , Match } from './internal/match.ts'
31+ import { Match } from './internal/match.ts'
3332import { type TTrim , Trim } from './internal/trim.ts'
34- import { type TTake , Take } from './internal/take.ts'
35- import { type TMany , Many } from './internal/many.ts'
3633import { type TOptional , Optional } from './internal/optional.ts'
37-
38- import { type TDigit , Digit , TUnderScore , UnderScore } from './internal/char.ts'
39- import { type TDot , Dot } from './internal/char.ts'
4034import { type THyphen , Hyphen } from './internal/char.ts'
41- import { type TInteger , Integer } from './integer.ts'
4235
43- // ------------------------------------------------------------------
44- // AllowedDigits
45- // ------------------------------------------------------------------
46- type TAllowedDigits = [ ...TDigit , TUnderScore ]
47- const AllowedDigits = [ ...Digit , UnderScore ] as TAllowedDigits
36+ import { type TUnsignedNumber , UnsignedNumber } from './unsigned_number.ts'
4837
4938// ------------------------------------------------------------------
5039// TakeSign
@@ -56,94 +45,30 @@ function TakeSign<Input extends string>(input: Input): TTakeSign<Input> {
5645 return Optional ( Hyphen , input ) as never
5746}
5847// ------------------------------------------------------------------
59- // IsLeadingDot
60- // ------------------------------------------------------------------
61- type TIsLeadingDot < Input extends string > = (
62- TTake < [ TDot ] , Input > extends [ string , string ] ? true : false
63- )
64- function IsLeadingDot < Input extends string > ( input : Input ) : TIsLeadingDot < Input > {
65- return IsMatch ( Take ( [ Dot ] , input ) ) as never
66- }
67- // ------------------------------------------------------------------
68- // TakeFractional
69- // ------------------------------------------------------------------
70- type TTakeFractional < Input extends string > = (
71- TMany < TAllowedDigits , [ TUnderScore ] , Input > extends [ infer Digits extends string , infer DigitsRest extends string ]
72- ? Digits extends ''
73- ? [ ] // fail: no Digits
74- : [ Digits , DigitsRest ]
75- : [ ] // fail: did not match Digits
76- )
77- function TakeFractional < Input extends string > ( input : Input ) : TTakeFractional < Input > {
78- return Match ( Many ( AllowedDigits , [ UnderScore ] , input ) , ( Digits , DigitsRest ) =>
79- IsEqual ( Digits , '' )
80- ? [ ] // fail: no Digits
81- : [ Digits , DigitsRest ]
82- , ( ) => [ ] ) as never // fail: did not match Digits
83- }
84- // ------------------------------------------------------------------
85- // LeadingDot
86- // ------------------------------------------------------------------
87- type TLeadingDot < Sign extends string , Input extends string > = (
88- TTake < [ TDot ] , Input > extends [ infer Dot extends string , infer DotRest extends string ]
89- ? TTakeFractional < DotRest > extends [ infer Fractional extends string , infer FractionalRest extends string ]
90- ? [ `${Sign } 0${Dot } ${Fractional } `, FractionalRest ]
91- : [ ] // fail: did not match Fractional
92- : [ ] // fail: did not match Dot
93- )
94- function LeadingDot < Sign extends string , Input extends string > ( sign : Sign , input : Input ) : TLeadingDot < Sign , Input > {
95- return Match ( Take ( [ Dot ] , input ) , ( Dot , DotRest ) =>
96- Match ( TakeFractional ( DotRest ) , ( Fractional , FractionalRest ) =>
97- [ `${ sign } 0${ Dot } ${ Fractional } ` , FractionalRest ] ,
98- ( ) => [ ] ) , // fail: did not match Fractional
99- ( ) => [ ] ) as never // fail: did not match Dot
100- }
101- // ------------------------------------------------------------------
102- // TakeLeadingInteger
103- // ------------------------------------------------------------------
104- type TLeadingInteger < Sign extends string , Input extends string > = (
105- TInteger < Input > extends [ infer Integer extends string , infer IntegerRest extends string ]
106- ? TTake < [ TDot ] , IntegerRest > extends [ infer Dot extends string , infer DotRest extends string ]
107- ? TTakeFractional < DotRest > extends [ infer Fractional extends string , infer FractionalRest extends string ]
108- ? [ `${Sign } ${Integer } ${Dot } ${Fractional } `, FractionalRest ]
109- : [ `${Sign } ${Integer } `, DotRest ] // fail: did not match Fractional, use Integer
110- : [ `${Sign } ${Integer } `, IntegerRest ] // fail: did not match Dot, use Integer
111- : [ ] // fail: did not match Integer
112- )
113- function LeadingInteger < Sign extends string , Input extends string > ( sign : Sign , input : Input ) : TLeadingInteger < Sign , Input > {
114- return Match ( Integer ( input ) , ( Integer , IntegerRest ) =>
115- Match ( Take ( [ Dot ] , IntegerRest ) , ( Dot , DotRest ) =>
116- Match ( TakeFractional ( DotRest ) , ( Fractional , FractionalRest ) =>
117- [ `${ sign } ${ Integer } ${ Dot } ${ Fractional } ` , FractionalRest ] ,
118- ( ) => [ `${ sign } ${ Integer } ` , DotRest ] ) , // fail: did not match Fractional, use Integer
119- ( ) => [ `${ sign } ${ Integer } ` , IntegerRest ] ) , // fail: did not match Dot, use Integer
120- ( ) => [ ] ) as never // fail: did not match Integer
121- }
122- // ------------------------------------------------------------------
123- // TakeNumber
48+ // TakeSignedNumber
12449// ------------------------------------------------------------------
125- type TTakeNumber < Input extends string > = (
50+ type TTakeSignedNumber < Input extends string > = (
12651 TTakeSign < Input > extends [ infer Sign extends string , infer SignRest extends string ]
127- ? TIsLeadingDot < SignRest > extends true
128- ? TLeadingDot < Sign , SignRest >
129- : TLeadingInteger < Sign , SignRest >
52+ ? TUnsignedNumber < SignRest > extends [ infer UnsignedInteger extends string , infer UnsignedIntegerRest extends string ]
53+ ? [ `${ Sign } ${ UnsignedInteger } ` , UnsignedIntegerRest ]
54+ : [ ] // fail: did not match unsigned integer
13055 : [ ] // fail: did not match Sign
13156)
132- function TakeNumber < Input extends string > ( input : Input ) : TTakeNumber < Input > {
57+ function TakeSignedNumber < Input extends string > ( input : Input ) : TTakeSignedNumber < Input > {
13358 return Match ( TakeSign ( input ) , ( Sign , SignRest ) =>
134- IsLeadingDot ( SignRest )
135- ? LeadingDot ( Sign , SignRest )
136- : LeadingInteger ( Sign , SignRest )
137- , ( ) => [ ] ) as never // fail: did not match Sign
59+ Match ( UnsignedNumber ( SignRest ) , ( UnsignedInteger , UnsignedIntegerRest ) =>
60+ [ ` ${ Sign } ${ UnsignedInteger } ` , UnsignedIntegerRest ] ,
61+ ( ) => [ ] ) , // fail: did not match unsigned integer
62+ ( ) => [ ] ) as never // fail: did not match Sign
13863}
13964// ------------------------------------------------------------------
140- // Number
65+ // Integer
14166// ------------------------------------------------------------------
142- /** Matches if next is a literal Number */
67+ /** Matches if next is a signed or unsigned Number */
14368export type TNumber < Input extends string > = (
144- TTakeNumber < TTrim < Input > >
69+ TTakeSignedNumber < TTrim < Input > >
14570)
146- /** Matches if next is a literal Number */
71+ /** Matches if next is a signed or unsigned Number */
14772export function Number < Input extends string > ( input : Input ) : TNumber < Input > {
148- return TakeNumber ( Trim ( input ) ) as never
73+ return TakeSignedNumber ( Trim ( input ) ) as never
14974}
0 commit comments