@@ -15,41 +15,46 @@ module MSDPLibrary =
15
15
| MSDP_ ARRAY_ CLOSE = 6 uy
16
16
17
17
let emptyMap : Map < string , obj > = Map< string, obj> []
18
-
19
- let MSDPVal : byte = byte Trigger.MSDP_ VAL
18
+
19
+ let MSDP_VAL : byte = byte Trigger.MSDP_ VAL
20
+
21
+ let MSDP_VAR : byte = byte Trigger.MSDP_ VAR
22
+
23
+ let MSDP_ARRAY_OPEN : byte = byte Trigger.MSDP_ ARRAY_ OPEN
24
+
25
+ let MSDP_ARRAY_CLOSE : byte = byte Trigger.MSDP_ ARRAY_ CLOSE
26
+
27
+ let MSDP_TABLE_OPEN : byte = byte Trigger.MSDP_ TABLE_ OPEN
28
+
29
+ let MSDP_TABLE_CLOSE : byte = byte Trigger.MSDP_ TABLE_ CLOSE
20
30
21
31
[<TailCall>]
22
32
let rec private MSDPScanTailRec ( root : obj , array : byte seq , encoding : Encoding ) =
23
33
let rec scanRec accRoot accArray =
24
- if Seq.length accArray = 0 then
25
- ( accRoot, accArray)
26
- else
27
- match accArray |> Seq.head with
28
- | 1 uy ->
29
- let key =
30
- encoding.GetString(
31
- accArray |> Seq.skip 1 |> Seq.takeWhile ( fun x -> x <> MSDPVal) |> Array.ofSeq
32
- )
33
-
34
- let cv , rest =
35
- scanRec root ( accArray |> Seq.skip 1 |> Seq.skipWhile ( fun x -> x <> MSDPVal))
36
-
37
- scanRec (( accRoot :?> Map< string, obj>) .Add( key, cv)) rest
38
- | 2 uy ->
39
- match accRoot with
40
- | :? Map< string, obj> -> scanRec emptyMap ( accArray |> Seq.skip 1 )
41
- | :? List< obj> ->
42
- let cv , rest = scanRec emptyMap ( accArray |> Seq.skip 1 )
43
-
44
- scanRec (( accRoot :?> List< obj>) @ [ cv ]) rest
45
- | _ -> scanRec accRoot ( accArray |> Seq.skip 1 )
46
- | 3 uy -> scanRec emptyMap ( accArray |> Seq.skip 1 )
47
- | 4 uy -> accRoot, accArray |> Seq.skip 1
48
- | 5 uy -> scanRec [] ( accArray |> Seq.skip 1 )
49
- | 6 uy -> accRoot, accArray |> Seq.skip 1
50
- | _ ->
51
- encoding.GetString( accArray |> Seq.takeWhile ( fun x -> x > 6 uy) |> Array.ofSeq),
52
- accArray |> Seq.skipWhile ( fun x -> x > 6 uy)
34
+ match accArray |> Seq.tryHead with
35
+ | None -> accRoot, accArray
36
+ | Some( 1 uy) ->
37
+ let key =
38
+ encoding.GetString( accArray |> Seq.skip 1 |> Seq.takeWhile ( fun x -> x <> MSDP_ VAL) |> Array.ofSeq)
39
+
40
+ let cv , rest =
41
+ scanRec root ( accArray |> Seq.skip 1 |> Seq.skipWhile ( fun x -> x <> MSDP_ VAL))
42
+
43
+ scanRec (( accRoot :?> Map< string, obj>) .Add( key, cv)) rest
44
+ | Some( 2 uy) ->
45
+ match accRoot with
46
+ | :? Map< string, obj> -> scanRec emptyMap ( accArray |> Seq.skip 1 )
47
+ | :? List< obj> as accRootList ->
48
+ let cv , rest = scanRec emptyMap ( accArray |> Seq.skip 1 )
49
+ scanRec ( accRootList @ [ cv ]) rest
50
+ | _ -> scanRec accRoot ( accArray |> Seq.skip 1 )
51
+ | Some( 3 uy) -> scanRec emptyMap ( accArray |> Seq.skip 1 )
52
+ | Some( 4 uy) -> accRoot, accArray |> Seq.skip 1
53
+ | Some( 5 uy) -> scanRec [] ( accArray |> Seq.skip 1 )
54
+ | Some( 6 uy) -> accRoot, accArray |> Seq.skip 1
55
+ | _ ->
56
+ encoding.GetString( accArray |> Seq.takeWhile ( fun x -> x > 6 uy) |> Array.ofSeq),
57
+ accArray |> Seq.skipWhile ( fun x -> x > 6 uy)
53
58
54
59
scanRec root array
55
60
@@ -64,21 +69,21 @@ module MSDPLibrary =
64
69
let parsedObj =
65
70
jsonNode.AsObject()
66
71
|> Seq.map ( fun prop ->
67
- [ byte Trigger. MSDP_ VAR ]
72
+ [ MSDP_ VAR ]
68
73
@ ( encoding.GetBytes( prop.Key) |> List.ofArray)
69
- @ [ byte Trigger. MSDP_ VAL ]
74
+ @ [ MSDP_ VAL ]
70
75
@ parseJsonValue prop.Value)
71
76
|> List.concat
72
77
73
- [ byte Trigger. MSDP_ TABLE_ OPEN ] @ parsedObj @ [ byte Trigger. MSDP_ TABLE_ CLOSE ]
78
+ [ MSDP_ TABLE_ OPEN ] @ parsedObj @ [ MSDP_ TABLE_ CLOSE ]
74
79
| JsonValueKind.Array ->
75
80
let parsedArr =
76
81
jsonNode.AsArray()
77
- |> Seq.map ( fun prop -> [ byte Trigger. MSDP_ VAL ] @ parseJsonValue prop)
82
+ |> Seq.map ( fun prop -> [ MSDP_ VAL ] @ parseJsonValue prop)
78
83
|> List.ofSeq
79
84
|> List.concat
80
85
81
- [ byte Trigger. MSDP_ ARRAY_ OPEN ] @ parsedArr @ [ byte Trigger. MSDP_ ARRAY_ CLOSE ]
86
+ [ MSDP_ ARRAY_ OPEN ] @ parsedArr @ [ MSDP_ ARRAY_ CLOSE ]
82
87
| JsonValueKind.String -> encoding.GetBytes( jsonNode.AsValue() .ToString()) |> List.ofArray
83
88
| JsonValueKind.Number -> encoding.GetBytes( jsonNode.AsValue() .ToString()) |> List.ofArray
84
89
| JsonValueKind.True -> encoding.GetBytes( " 1" ) |> List.ofArray
0 commit comments