1
- import { fromJS , isCollection , isMap , List , Map } from "immutable" ;
1
+ import { fromJS , isCollection , isList , isMap , List , Map } from "immutable" ;
2
2
import { Ok , Result } from "ts-results" ;
3
3
4
4
type Primitive = boolean | number | bigint | string | null | undefined | symbol ;
@@ -101,6 +101,10 @@ export class TransactionalLens<M extends object> {
101
101
return this . db . data . getIn ( [ ...this . prefix , ...path ] ) as any ;
102
102
}
103
103
104
+ getObject < P extends PropertyKey [ ] > ( ...path : P ) : Lens < M , P > {
105
+ return fromImmutable ( this . get ( ...path ) ) ;
106
+ }
107
+
104
108
tx < R extends Result < any , any > > ( cb : ( setter : LensSetter < M > , deleter : LensDeleter ) => Promise < R > ) : Promise < R > ;
105
109
tx < R extends Result < any , any > > ( cb : ( setter : LensSetter < M > , deleter : LensDeleter ) => R ) : R ;
106
110
tx < R extends Result < any , any > > ( cb : ( setter : LensSetter < M > , deleter : LensDeleter ) => R | Promise < R > ) : R | Promise < R > {
@@ -124,3 +128,28 @@ export class TransactionalLens<M extends object> {
124
128
125
129
get data ( ) { return this . db . data . getIn ( [ ...this . prefix ] ) as Immutify < M > }
126
130
}
131
+
132
+ function fromImmutable ( value : any ) : any {
133
+ if ( isMap ( value ) ) {
134
+ return fromImmutable ( value . toObject ( ) ) ;
135
+ }
136
+ else if ( isList ( value ) ) {
137
+ return fromImmutable ( value . toArray ( ) ) ;
138
+ }
139
+ else if ( typeof value === 'object' ) {
140
+ if ( typeof value . length === 'number' && 0 in value && value . length - 1 in value ) {
141
+ for ( let i = 0 ; i < value . length ; ++ i ) {
142
+ value [ i ] = fromImmutable ( value [ i ] ) ;
143
+ }
144
+ }
145
+ else {
146
+ for ( const prop in value ) {
147
+ value [ prop ] = fromImmutable ( value [ prop ] ) ;
148
+ }
149
+ }
150
+ return value ;
151
+ }
152
+ else {
153
+ return value ;
154
+ }
155
+ }
0 commit comments