@@ -202,6 +202,7 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
202
202
prefer (#Busy , Store .busy , inner ),
203
203
preferFiltered (#Invalid , Store .invalid (_ , #Part ), inner , inner -> I .filter ),
204
204
preferFiltered (#Dirty , Store .dirty , inner , inner -> I .filter ),
205
+ prefer (#Init , Store .init , inner ),
205
206
validate (inner ),
206
207
]
207
208
-> Array .reduce (Result .first , Error (#Invalid ))
@@ -275,7 +276,6 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
275
276
})
276
277
}
277
278
278
-
279
279
external outputToString : output => string = "%identity"
280
280
let show = (store : t ) => {
281
281
` FieldArray{
@@ -288,7 +288,7 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
288
288
}`
289
289
}
290
290
291
- let traverseSetk = (context : context , set , elements , validate ) => {
291
+ let traverseSetk = (context : context , set , elements : Array . t < Field . Init . t < F . input >> , validate ) => {
292
292
elements
293
293
-> Array .mapi ( (value , index ) => (value , index ))
294
294
-> traverseTuple3 ( ((value , index )) => {
@@ -329,20 +329,21 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
329
329
)
330
330
)
331
331
332
- let makeDynInner = (context : context , initial : option <input >, set : Rxjs .Observable .t <input >, val : Option .t <Rxjs .Observable .t <()>>)
332
+ let makeDynInner = (context : context , initial : option <Field . Init . t < input > >, set : Rxjs .Observable .t <input >, val : Option .t <Rxjs .Observable .t <()>>)
333
333
: (
334
334
Array .t <Close .t <Form .t <(key , F .t ), F .actions <unit >>>>,
335
335
Array .t <Dyn .init <Close .t <Form .t <(key , F .t ), F .actions <unit >>>>>,
336
336
Array .t <Dyn .dyn <Close .t <Form .t <(key , F .t ), F .actions <()>>>>>,
337
337
)
338
338
=> {
339
- Option .first (initial , Option .flap0 (context .empty ))
340
- -> Option .or ([])
339
+ Option .first (initial , Option .flap0 (context .empty )-> Option .map (x => Field .Init .Natural (x )))
340
+ -> Option .or (Field .Init .Natural ([]))
341
+ -> Field .Init .distributeArray
341
342
-> traverseSetk (context , set , _ , val )
342
343
-> packKey
343
344
}
344
345
345
- let makeDyn = (context : context , initial : option <input >, setOuter : Rxjs .Observable .t <input >, validate : option <Rxjs .Observable .t <()>>)
346
+ let makeDyn = (context : context , initial : option <Field . Init . t < input > >, setOuter : Rxjs .Observable .t <input >, validate : option <Rxjs .Observable .t <()>>)
346
347
: Dyn .t <Close .t <Form .t <t , actions <()>>>>
347
348
=> {
348
349
// Every observable has a complete, to terminate the stream
@@ -395,10 +396,10 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
395
396
, close : makeClose (close )
396
397
}
397
398
398
- let applyInner = (inners ): Rxjs .Observable .t <Close .t <Form .t <t , actions <()>>>> => {
399
+ let applyInner = (~ validateFn , inners ): Rxjs .Observable .t <Close .t <Form .t <t , actions <()>>>> => {
399
400
let inners = mergeInner (inners )
400
401
inners .pack .field
401
- -> makeStore (~validate = validateImpl ( context , false ) )
402
+ -> makeStore (~validate = validateFn )
402
403
-> Dynamic .map (applyField (inners ))
403
404
}
404
405
@@ -425,9 +426,11 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
425
426
-> Rxjs .pipe (Rxjs .distinct ())
426
427
427
428
let init = {
429
+ let validateInit = initial -> Option .map (Field .Init .isValidate )-> Option .or (false )
430
+ let validateFn = validateImpl (context , validateInit )
428
431
combineLatestScan (initInner , firstInner )
429
432
-> Dynamic .tap (Rxjs .next (stateValues ))
430
- -> Dynamic .switchMap (applyInner )
433
+ -> Dynamic .switchMap (applyInner (~ validateFn ) )
431
434
}
432
435
433
436
let set = Rxjs .merge3 (setOuter , setInner , setOpt )
@@ -461,18 +464,18 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
461
464
, _sequence )
462
465
: ( Array .t <Close .t <Form .t <(key , F .t ), F .actions <unit >>>>
463
466
, Array .t <Dyn .init <Close .t <Form .t <(key , F .t ), F .actions <unit >>>>>
464
- , Array .t
465
- < Either .t
466
- < (Dyn .init <Close .t <Form .t <(key , F .t ), F .actions <unit >>>>, Dyn .dyn <Close .t <Form .t <(key , F .t ), F .actions <()>>>>)
467
+ , Array .t <
468
+ Either .t <
469
+ (Dyn .init <Close .t <Form .t <(key , F .t ), F .actions <unit >>>>, Dyn .dyn <Close .t <Form .t <(key , F .t ), F .actions <()>>>>)
467
470
, Dyn .dyn <Close .t <Form .t <(key , F .t ), F .actions <()>>>>
468
- >
469
471
>
472
+ >
470
473
)
471
474
=> {
472
475
// We are tracking the init of dynamically added elements in the 'dyn' value.
473
476
// When a new array level change comes in, we no longer want to replay the init,
474
477
// So cast all the eithers to right, losing the inits
475
- let dyns = dyns -> Array .map (Either .either (x => x -> Tuple .snd2 -> Either .right , Either .right ))
478
+ // let dyns = Array.map(dyns, y => Either.either(x => x->Tuple.snd2->Either.right, x => Either.right(x), y ))
476
479
477
480
switch change {
478
481
| #Clear => {
@@ -489,7 +492,7 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
489
492
| #Add (value ) => {
490
493
let index = stateValues -> Array .length
491
494
let setElement = set -> Dynamic .keepMap (Array .get (_ , index ))
492
- let {first , init , dyn } = F .makeDyn (context .element , value , setElement , None )
495
+ let {first , init , dyn } = F .makeDyn (context .element , value -> Option . map ( Field . Init . natural ) , setElement , None )
493
496
let key = getKey ()
494
497
let first = packKeyValue (key , first )
495
498
let init = packKeyObss (key , init )
@@ -516,7 +519,7 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
516
519
}
517
520
| #Set (input ) => {
518
521
stateValues -> Array .forEach (c => c .close ())
519
- let (values , obs , dyns ) = input -> traverseSetk (context , set , _ , validate )-> packKey
522
+ let (values , obs , dyns ) = input -> Array . map ( Field . Init . natural ) -> traverseSetk (context , set , _ , validate )-> packKey
520
523
521
524
let dyns = dyns -> Array .mapi ( (dyn , i ) => (obs -> Array .getUnsafe (i ), dyn )-> Either .left )
522
525
( values , obs , dyns )
@@ -585,11 +588,14 @@ module Make: Make = (F: Field.T, I: IArray with type t = F.t) => {
585
588
}}
586
589
})
587
590
588
- let dyn =
591
+
592
+ let dyn = {
593
+ let validateFn = validateImpl (context , false )
589
594
dynInner
590
595
-> Dynamic .map (Dynamic .tap (_ , Rxjs .next (stateValues )))
591
- -> Dynamic .switchMap (Dynamic .map (_ , applyInner ))
596
+ -> Dynamic .switchMap (Dynamic .map (_ , applyInner (~ validateFn ) ))
592
597
-> Rxjs .pipe (Rxjs .takeUntil (complete ))
598
+ }
593
599
594
600
{first , init , dyn }
595
601
}
0 commit comments