forked from DonovanChan/fmfunctions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path#Merge.calc
64 lines (56 loc) · 2.1 KB
/
#Merge.calc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Let ( [
//-- Identify first node in newPairs
~nodeOpen = "<:" ;
~nodeAssign = ":=" ;
~nodeClose = ":>" ;
~newNodeStart = Position ( newPairs ; ~nodeOpen ; 1 ; 1 ) ;
~newNodeAssignEnd = Position ( newPairs ; ~nodeAssign ; ~newNodeStart ; 1 ) + Length ( ~nodeAssign ) - 1 ;
~newNodeEnd = Position ( newPairs ; ~nodeClose ; ~newNodeAssignEnd ; 1 ) + Length ( ~nodeClose ) - 1 ;
~newNodeMatch = Middle ( newPairs ; ~newNodeStart ; ~newNodeAssignEnd - ~newNodeStart + 1 ) ;
~newNode = Middle ( newPairs ; ~newNodeStart ; ~newNodeEnd - ~newNodeStart + 1 ) ;
//-- Isolate first matching node in originalPairs
~origNodeStart = Position ( originalPairs ; ~newNodeMatch ; 1 ; 1 ) ;
~origNodePad =
Middle (
originalPairs ;
Position ( originalPairs ; ~nodeClose ; 1 ; 1 ) + Length ( ~nodeClose ) ;
1
) ;
~origNodePad = If ( ~origNodePad = Left ( ~nodeOpen ; 1 ) ; "" ; ~origNodePad ) ;
//-- Append new pair, or replace old one
~newHash =
If (
~origNodeStart = 0 ; originalPairs & ~origNodePad & ~newNode ;
Left ( originalPairs ; ~origNodeStart - 1 )
& ~newNode
& Middle ( originalPairs ;
Position ( originalPairs ; ~nodeClose ; ~origNodeStart ; 1 ) + Length ( ~nodeClose ) ;
999999
)
)
] ;
//-- Continue merging remaining newPairs
If (
Position ( newPairs ; ~nodeOpen ; ~newNodeEnd ; 1 ) ;
#Merge ( ~newHash ; Middle ( newPairs ; ~newNodeEnd + 1 ; 999999 ) ) ;
~newHash
)
)
/* __________________________________________________
NAME: #Merge ( originalPairs ; newPairs )
PURPOSE: Adds newPairs to originalPairs, overriding values of duplicate pairs.
EXAMPLES/TESTS:
Let ( [
~orig = List ( # ( "foo" ; 123 ) ; # ( "fum" ; 456 ) ) ;
~orig2 = # ( "foo" ; 123 ) & # ( "fum" ; 456 )
] ;
List (
#Merge ( ~orig ; # ( "foo" ; 321 ) ) = List ( # ( "foo" ; 321 ) ; # ( "fum" ; 456 ) ) ;
#Merge ( ~orig ; # ( "fum" ; 654 ) ) = List ( # ( "foo" ; 123 ) ; # ( "fum" ; 654 ) ) ;
#Merge ( ~orig ; # ( "bar" ; 789 ) ) = List ( ~orig ; # ( "bar" ; 789 ) ) ;
#Merge ( ~orig2 ; # ( "bar" ; 789 ) ) = ~orig2 & # ( "bar" ; 789 )
)
)
HISTORY:
2010-10-25 10:21 PST - Donovan Chandler
*/