Skip to content

Commit 56ec04a

Browse files
Auto code seqs
1 parent c58bba3 commit 56ec04a

File tree

2 files changed

+19
-15
lines changed

2 files changed

+19
-15
lines changed

src/Decode.fs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/Encode.fs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -528,9 +528,8 @@ module Encode =
528528
encoder.Value.Encode fields.[0])
529529
elif fullname = typedefof<obj list>.FullName
530530
|| fullname = typedefof<Set<string>>.FullName
531-
|| fullname = typedefof<HashSet<string>>.FullName then
532-
// I don't know how to support seq for now.
533-
// || fullname = typedefof<obj seq>.FullName
531+
|| fullname = typedefof<HashSet<string>>.FullName
532+
|| fullname = typedefof<obj seq>.FullName then
534533
t.GenericTypeArguments.[0] |> autoEncoder extra skipNullField |> genericSeq
535534
elif fullname = typedefof< Map<string, obj> >.FullName
536535
|| fullname = typedefof< Dictionary<string, obj> >.FullName then

0 commit comments

Comments
 (0)