@@ -1002,6 +1002,19 @@ module Decode =
10021002 | Error er -> Error er
10031003 | Ok result -> FSharpValue.MakeUnion( ucis.[ 1 ], [| result; acc|], allowAccessToPrivateRepresentation= true ) |> Ok)
10041004
1005+ let private genericArray elemType ( decoder : BoxedDecoder ) =
1006+ fun path value ->
1007+ if not ( Helpers.isArray value) then
1008+ ( path, BadPrimitive ( " a list" , value)) |> Error
1009+ else
1010+ match array decoder.BoxedDecoder path value with
1011+ | Ok items ->
1012+ let ar = System.Array.CreateInstance( elemType, items.Length)
1013+ for i = 0 to ar.Length - 1 do
1014+ ar.SetValue( items.[ i], i)
1015+ Ok ar
1016+ | Error er -> Error er
1017+
10051018 // let private genericSeq t (decoder: BoxedDecoder) =
10061019 // fun (path : string) (value: JsonValue) ->
10071020 // if not (Helpers.isArray value) then
@@ -1179,15 +1192,7 @@ module Decode =
11791192 | None ->
11801193 if t.IsArray then
11811194 let elemType = t.GetElementType()
1182- let decoder = autoDecoder extra false elemType
1183- boxDecoder( fun path value ->
1184- match array decoder.BoxedDecoder path value with
1185- | Ok items ->
1186- let ar = System.Array.CreateInstance( elemType, items.Length)
1187- for i = 0 to ar.Length - 1 do
1188- ar.SetValue( items.[ i], i)
1189- Ok ar
1190- | Error er -> Error er)
1195+ autoDecoder extra false elemType |> genericArray elemType |> boxDecoder
11911196 elif t.IsGenericType then
11921197 if FSharpType.IsTuple( t) then
11931198 let decoders = FSharpType.GetTupleElements( t) |> Array.map ( autoDecoder extra false )
@@ -1202,9 +1207,9 @@ module Decode =
12021207 autoDecoder extra true t.GenericTypeArguments.[ 0 ] |> genericOption t |> boxDecoder
12031208 elif fullname = typedefof< obj list>. FullName then
12041209 autoDecoder extra false t.GenericTypeArguments.[ 0 ] |> genericList t |> boxDecoder
1205- // I don't know for now how to support seq
1206- // elif fullname = typedefof<obj seq>.FullName then
1207- // autoDecoder extra false t.GenericTypeArguments.[0] |> genericSeq t |> boxDecoder
1210+ elif fullname = typedefof < obj seq>. FullName then
1211+ let elemType = t.GenericTypeArguments .[ 0 ]
1212+ autoDecoder extra false elemType |> genericArray elemType |> boxDecoder
12081213 elif fullname = typedefof< Map< string, obj> >. FullName then
12091214 autoDecodeMapOrDict ( fun t _ _ kvs -> System.Activator.CreateInstance( t, kvs)) extra t |> boxDecoder
12101215 elif fullname = typedefof< System.Collections.Generic.Dictionary< string, obj> >. FullName then
0 commit comments