23
23
// MODULES //
24
24
25
25
var setNonEnumerableReadOnly = require ( '@stdlib/utils/define-nonenumerable-read-only-property' ) ;
26
+ var setNonEnumerable = require ( '@stdlib/utils/define-nonenumerable-property' ) ;
26
27
var setReadWriteAccessor = require ( '@stdlib/utils/define-read-write-accessor' ) ;
27
28
var resolveGetter = require ( '@stdlib/array/base/resolve-getter' ) ;
28
29
var accessors = require ( '@stdlib/array/base/accessors' ) ;
@@ -99,13 +100,15 @@ function nested2views( arr, fields ) {
99
100
* @private
100
101
* @constructor
101
102
* @param {Collection } arr - nested array
103
+ * @param {NonNegativeInteger } i - element index
102
104
* @returns {Datum } datum instance
103
105
*/
104
- function Datum ( arr ) {
106
+ function Datum ( arr , i ) {
105
107
var acc = accessors ( arr ) . accessors ;
106
- setNonEnumerableReadOnly ( this , '_arr' , arr ) ;
107
- setNonEnumerableReadOnly ( this , '_get' , acc [ 0 ] ) ;
108
- setNonEnumerableReadOnly ( this , '_set' , acc [ 1 ] ) ;
108
+ setNonEnumerable ( this , '_arr' , arr ) ;
109
+ setNonEnumerable ( this , '_get' , acc [ 0 ] ) ;
110
+ setNonEnumerable ( this , '_set' , acc [ 1 ] ) ;
111
+ setNonEnumerableReadOnly ( this , '_i' , i ) ;
109
112
return this ;
110
113
}
111
114
@@ -114,16 +117,37 @@ function nested2views( arr, fields ) {
114
117
setReadWriteAccessor ( Datum . prototype , keys [ i ] , getValue ( i ) , setValue ( i ) ) ; // eslint-disable-line max-len
115
118
}
116
119
120
+ // Define a method for ensuring that cached references are up-to-date:
121
+ setNonEnumerableReadOnly ( Datum . prototype , '_updateCache' , updateCache ) ;
122
+
117
123
// Ensure that the returned array correctly serializes to JSON:
118
124
setNonEnumerableReadOnly ( Datum . prototype , 'toJSON' , toJSON ) ;
119
125
120
126
// Create a list of composite views...
121
127
out = [ ] ;
122
128
for ( i = 0 ; i < M ; i ++ ) {
123
- out . push ( new Datum ( oget ( arr , i ) ) ) ;
129
+ out . push ( new Datum ( oget ( arr , i ) , i ) ) ;
124
130
}
125
131
return out ;
126
132
133
+ /**
134
+ * Updates cached references, if necessary.
135
+ *
136
+ * @private
137
+ */
138
+ function updateCache ( ) {
139
+ var acc ;
140
+ var ref ;
141
+
142
+ ref = oget ( arr , this . _i ) ;
143
+ if ( ref !== this . _arr ) {
144
+ acc = accessors ( ref ) . accessors ;
145
+ this . _arr = ref ;
146
+ this . _get = acc [ 0 ] ;
147
+ this . _set = acc [ 1 ] ;
148
+ }
149
+ }
150
+
127
151
/**
128
152
* Returns an accessor for returning the value associated with a field.
129
153
*
@@ -141,6 +165,7 @@ function nested2views( arr, fields ) {
141
165
* @returns {* } result
142
166
*/
143
167
function get ( ) {
168
+ this . _updateCache ( ) ;
144
169
return this . _get ( this . _arr , idx ) ;
145
170
}
146
171
}
@@ -162,6 +187,7 @@ function nested2views( arr, fields ) {
162
187
* @param {* } value - value to set
163
188
*/
164
189
function set ( value ) {
190
+ this . _updateCache ( ) ;
165
191
this . _set ( this . _arr , idx , value ) ;
166
192
}
167
193
}
0 commit comments