@@ -28,17 +28,12 @@ THE SOFTWARE.
2828
2929// deno-fmt-ignore-file
3030
31- import { IsResult } from './internal/result .ts'
31+ import { Match } from './internal/match .ts'
3232import { type TTrim , Trim } from './internal/trim.ts'
33- import { type TTake , Take } from './internal/take.ts'
34- import { type TMany , Many } from './internal/many.ts'
3533import { type TOptional , Optional } from './internal/optional.ts'
36-
37- import { type TDigit , Digit } from './internal/char.ts'
3834import { type THyphen , Hyphen } from './internal/char.ts'
39- import { type TZero , Zero } from './internal/char.ts'
40- import { type TNonZero , NonZero } from './internal/char.ts'
41- import { type TUnderScore , UnderScore } from './internal/char.ts'
35+
36+ import { type TUnsignedInteger , UnsignedInteger } from './unsigned_integer.ts'
4237
4338// ------------------------------------------------------------------
4439// TakeSign
@@ -50,68 +45,30 @@ function TakeSign<Input extends string>(input: Input): TTakeSign<Input> {
5045 return Optional ( Hyphen , input ) as never
5146}
5247// ------------------------------------------------------------------
53- // TakeNonZero
54- // ------------------------------------------------------------------
55- type TTakeNonZero < Input extends string > = (
56- TTake < TNonZero , Input >
57- )
58- function TakeNonZero < Input extends string > ( input : Input ) : TTakeNonZero < Input > {
59- return Take ( NonZero , input )
60- }
61- // ------------------------------------------------------------------
62- // TakeDigits
48+ // TakeSignedInteger
6349// ------------------------------------------------------------------
64- type TAllowedDigits = [ ...TDigit , TUnderScore ]
65- const AllowedDigits = [ ...Digit , UnderScore ] as TAllowedDigits
66- // ...
67- type TTakeDigits < Input extends string > = (
68- TMany < TAllowedDigits , [ TUnderScore ] , Input >
69- )
70- function TakeDigits < Input extends string > ( input : Input ) : TTakeDigits < Input > {
71- return Many ( AllowedDigits , [ UnderScore ] , input ) as never
72- }
73- // ------------------------------------------------------------------
74- // TakeInteger
75- // ------------------------------------------------------------------
76- type TTakeInteger < Input extends string > = (
50+ type TTakeSignedInteger < Input extends string > = (
7751 TTakeSign < Input > extends [ infer Sign extends string , infer SignRest extends string ]
78- ? TTake < [ TZero ] , SignRest > extends [ infer Zero extends string , infer ZeroRest extends string ]
79- ? [ `${Sign } ${Zero } `, ZeroRest ]
80- : TTakeNonZero < SignRest > extends [ infer NonZero extends string , infer NonZeroRest extends string ]
81- ? TTakeDigits < NonZeroRest > extends [ infer Digits extends string , infer DigitsRest extends string ]
82- ? [ `${Sign } ${NonZero } ${Digits } `, DigitsRest ]
83- : [ ] // fail: did not match Digits
84- : [ ] // fail: did not match NonZero
52+ ? TUnsignedInteger < SignRest > extends [ infer UnsignedInteger extends string , infer UnsignedIntegerRest extends string ]
53+ ? [ `${Sign } ${UnsignedInteger } `, UnsignedIntegerRest ]
54+ : [ ] // fail: did not match unsigned integer
8555 : [ ] // fail: did not match Sign
8656)
87- function TakeInteger < Input extends string > ( input : Input ) : TTakeInteger < Input > {
88- const sign = TakeSign ( input )
89- return (
90- IsResult ( sign ) ? ( ( ) => {
91- const zero = Take ( [ Zero ] , sign [ 1 ] )
92- return IsResult ( zero )
93- ? [ `${ sign [ 0 ] } ${ zero [ 0 ] } ` , zero [ 1 ] ]
94- : ( ( ) => {
95- const nonZero = TakeNonZero ( sign [ 1 ] )
96- return IsResult ( nonZero ) ? ( ( ) => {
97- const digits = TakeDigits ( nonZero [ 1 ] )
98- return IsResult ( digits )
99- ? [ `${ sign [ 0 ] } ${ nonZero [ 0 ] } ${ digits [ 0 ] } ` , digits [ 1 ] ]
100- : [ ] // fail: did not match Digits
101- } ) ( ) : [ ] // fail: did not match NonZero
102- } ) ( )
103- } ) ( ) : [ ] // fail: did not match Sign
104- ) as never
57+ function TakeSignedInteger < Input extends string > ( input : Input ) : TTakeSignedInteger < Input > {
58+ return Match ( TakeSign ( input ) , ( Sign , SignRest ) =>
59+ Match ( UnsignedInteger ( SignRest ) , ( UnsignedInteger , UnsignedIntegerRest ) =>
60+ [ `${ Sign } ${ UnsignedInteger } ` , UnsignedIntegerRest ] ,
61+ ( ) => [ ] ) , // fail: did not match unsigned integer
62+ ( ) => [ ] ) as never // fail: did not match Sign
10563}
10664// ------------------------------------------------------------------
10765// Integer
10866// ------------------------------------------------------------------
109- /** Matches if next is a Integer */
67+ /** Matches if next is a signed or unsigned Integer */
11068export type TInteger < Input extends string > = (
111- TTakeInteger < TTrim < Input > >
69+ TTakeSignedInteger < TTrim < Input > >
11270)
113- /** Matches if next is a Integer */
71+ /** Matches if next is a signed or unsigned Integer */
11472export function Integer < Input extends string > ( input : Input ) : TInteger < Input > {
115- return TakeInteger ( Trim ( input ) ) as never
116- }
117-
73+ return TakeSignedInteger ( Trim ( input ) ) as never
74+ }
0 commit comments