Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Ramstack.HtmxToolkit/Collections/SmallDictionary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,8 @@ public void Clear()
var count = _count;
if (count != 0)
Array.Clear(_items, 0, count);

}

_count = 0;
}

Expand Down
26 changes: 14 additions & 12 deletions src/Ramstack.HtmxToolkit/PendingEvents.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using System.Runtime.InteropServices;
using System.Text.Json;

using Microsoft.AspNetCore.Http;

using Ramstack.HtmxToolkit.Collections;
using Ramstack.HtmxToolkit.Internal;

namespace Ramstack.HtmxToolkit;
Expand All @@ -16,9 +16,9 @@ internal sealed class PendingEvents
private const string ProxyEventName = "rs:events";

private readonly HttpResponse _response;
private Dictionary<string, object>? _receive;
private Dictionary<string, object>? _afterSwap;
private Dictionary<string, object>? _afterSettle;
private SmallDictionary<string, object>? _receive;
private SmallDictionary<string, object>? _afterSwap;
private SmallDictionary<string, object>? _afterSettle;

/// <summary>
/// Initializes a new instance of the <see cref="PendingEvents"/> class.
Expand All @@ -37,19 +37,21 @@ public void AddEvents(HtmxTriggerTiming timing, IReadOnlyDictionary<string, obje
{
var current = timing switch
{
HtmxTriggerTiming.Receive => _receive ??= new Dictionary<string, object>(),
HtmxTriggerTiming.AfterSwap => _afterSwap ??= new Dictionary<string, object>(),
_ => _afterSettle ??= new Dictionary<string, object>()
HtmxTriggerTiming.Receive => _receive ??= new SmallDictionary<string, object>(StringComparer.Ordinal),
HtmxTriggerTiming.AfterSwap => _afterSwap ??= new SmallDictionary<string, object>(StringComparer.Ordinal),
_ => _afterSettle ??= new SmallDictionary<string, object>(StringComparer.Ordinal)
};

foreach (var (k, v) in events)
{
if (current.TryAdd(k, v))
continue;

ref var value = ref CollectionsMarshal.GetValueRefOrAddDefault(current, ProxyEventName, out _);
if (value is not List<KeyValuePair<string, object>> collection)
value = collection = [];
if (!current.TryGetValue(ProxyEventName, out var value) || value is not List<KeyValuePair<string, object>> collection)
{
collection = [];
current[ProxyEventName] = collection;
}

collection.Add(new KeyValuePair<string, object>(k, v));
}
Expand Down Expand Up @@ -79,7 +81,7 @@ public void AddEvents(HtmxTriggerTiming timing, IReadOnlyDictionary<string, obje
/// <param name="events">A dictionary containing event names as keys and event details as values.</param>
public void SetEvents(HtmxTriggerTiming timing, IReadOnlyDictionary<string, object> events)
{
var replacement = new Dictionary<string, object>(events);
var replacement = new SmallDictionary<string, object>(events, StringComparer.Ordinal);
switch (timing)
{
case HtmxTriggerTiming.Receive:
Expand Down Expand Up @@ -140,7 +142,7 @@ public static PendingEvents GetOrCreate(HttpResponse response)
return pending;
}

private void SetHeader(string name, Dictionary<string, object>? events)
private void SetHeader(string name, SmallDictionary<string, object>? events)
{
if (events is not null)
_response.Headers[name] = JsonSerializer.Serialize(events, JsonOptions.CamelCase);
Expand Down
Loading