-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathFSharpListConverter.cs
More file actions
59 lines (49 loc) · 1.54 KB
/
Copy pathFSharpListConverter.cs
File metadata and controls
59 lines (49 loc) · 1.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
namespace Argon;
// ReSharper disable UnusedMember.Global
/// <summary>
/// Converts a <see cref="FSharpList{T}"/>.
/// </summary>
public class FSharpListConverter :
JsonConverter
{
static MethodInfo readList = typeof(FSharpListConverter).GetMethod("ReadList")!;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartArray();
foreach (var item in (IEnumerable)value)
{
serializer.Serialize(writer, item);
}
writer.WriteEndArray();
}
public override object? ReadJson(JsonReader reader, Type type, object? existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var genericArgument = type.GetGenericArguments()[0];
return readList.MakeGenericMethod(genericArgument)
.Invoke(
null,
[
reader,
serializer
]);
}
public static FSharpList<T> ReadList<T>(JsonReader reader, JsonSerializer serializer)
{
var list = new List<T>();
reader.Read();
while (reader.TokenType != JsonToken.EndArray)
{
var item = serializer.Deserialize<T>(reader);
list.Add(item);
reader.Read();
}
return ListModule.OfSeq(list);
}
public override bool CanConvert(Type type) =>
type.IsGenericType &&
type.GetGenericTypeDefinition() == typeof(FSharpList<>);
}