@@ -636,5 +636,82 @@ let ``[ASet] content bind``() =
636636 cnt |> should equal set.Count
637637
638638
639+ [<Test>]
640+ let ``[ ASet ] mapA / flattenA / chooseA async`` () =
641+
642+ let set = cset< cval< int>>()
643+
644+ let out1 = set |> ASet.mapA ( fun x -> x)
645+ let out2 = set |> ASet.map( fun x -> x :> IAdaptiveValue<_>) |> ASet.flattenA
646+ let out3 = set |> ASet.chooseA ( fun x -> x |> AVal.map ( fun v -> if ( v % 2 ) = 0 then Some v else None))
647+
648+ let sw = System.Diagnostics.Stopwatch.StartNew()
649+
650+ System.Threading.Thread( System.Threading.ThreadStart( fun x ->
651+ while sw.ElapsedMilliseconds < 5000 do
652+ let res = out1 |> ASet.force
653+ //printfn "set count: %d output count: %d" set.Count res.Count
654+ //System.Threading.Thread.Sleep(1)
655+ ()
656+ )) .Start()
657+
658+ System.Threading.Thread( System.Threading.ThreadStart( fun x ->
659+ while sw.ElapsedMilliseconds < 5000 do
660+ let res = out2 |> ASet.force
661+ //printfn "set count: %d output count: %d" set.Count res.Count
662+ //System.Threading.Thread.Sleep(1)
663+ ()
664+ )) .Start()
665+
666+ System.Threading.Thread( System.Threading.ThreadStart( fun x ->
667+ while sw.ElapsedMilliseconds < 5000 do
668+ let res = out3 |> ASet.force
669+ //printfn "set count: %d output count: %d" set.Count res.Count
670+ //System.Threading.Thread.Sleep(1)
671+ ()
672+ )) .Start()
673+
674+ let rnd = System.Random( 2 )
675+ while sw.ElapsedMilliseconds < 5000 do
676+ //System.Threading.Thread.Sleep(1)
677+
678+ transact( fun () ->
679+
680+ let rndAction = rnd.Next( 10 )
681+
682+ if rndAction = 0 then // add
683+ //printfn "add"
684+ let value = rnd.Next() % 100
685+ let addItem = cval< int>( value)
686+ set.Add( addItem) |> ignore
687+
688+ elif rndAction = 1 then // rem
689+ if set.Count > 10 then
690+ //printfn "rem"
691+ let remIndex = rnd.Next( set.Count)
692+ let remItem = set.Value.ToArray()[ remIndex]
693+ set.Remove( remItem) |> ignore
694+
695+ elif rndAction = 2 then // rem + change
696+ if set.Count > 1 then
697+ // !! potential crash !!
698+ //printfn "change + rem"
699+ let ind = rnd.Next( set.Count)
700+ let item = set.Value.ToArray()[ ind]
701+ // NOTE: order of value change and remove does not matter, both variants cause the exception
702+ item.Value <- rnd.Next() % 100
703+ set.Remove( item) |> ignore
704+
705+ elif set.Count > 0 then // change
706+ //printfn "change"
707+ let changeIndex = rnd.Next( set.Count)
708+ let changeItem = set.Value.ToArray()[ changeIndex]
709+ changeItem.Value <- rnd.Next() % 100
710+ )
711+
712+ //let res = out |> ASet.force
713+
714+ ()
639715
716+ ()
640717
0 commit comments