AnotherReplayReader/Utils/ReplayPinyinList.cs

62 lines
2.0 KiB
C#

using AnotherReplayReader.ReplayFile;
using System.Collections.Immutable;
using System.Linq;
namespace AnotherReplayReader.Utils
{
internal class ReplayPinyinList
{
private readonly PlayerIdentity _playerIdentity;
public ImmutableArray<Replay> Replays { get; } = ImmutableArray<Replay>.Empty;
public ImmutableArray<ReplayPinyinData> Pinyins { get; } = ImmutableArray<ReplayPinyinData>.Empty;
public ReplayPinyinList(PlayerIdentity playerIdentity) :
this(ImmutableArray<Replay>.Empty, playerIdentity)
{
}
public ReplayPinyinList(ImmutableArray<Replay> replay, PlayerIdentity playerIdentity) :
this(replay,
replay.Select(replay => new ReplayPinyinData(replay, playerIdentity)).ToImmutableArray(),
playerIdentity)
{
}
private ReplayPinyinList(ImmutableArray<Replay> replay,
ImmutableArray<ReplayPinyinData> pinyins,
PlayerIdentity playerIdentity)
{
_playerIdentity = playerIdentity;
Replays = replay;
Pinyins = pinyins;
}
public ReplayPinyinList SetItem(int index, Replay replay)
{
return new(Replays.SetItem(index, replay),
Pinyins.SetItem(index, new(replay, _playerIdentity)),
_playerIdentity);
}
}
class ReplayPinyinData
{
public Replay Replay { get; }
public string? PinyinDetails { get; }
public string? PinyinMod { get; }
public ReplayPinyinData(Replay replay, PlayerIdentity playerIdentity)
{
Replay = replay;
PinyinDetails = replay.GetDetails(playerIdentity).ToPinyin();
PinyinMod = replay.Mod.ModName.ToPinyin();
}
public bool MatchPinyin(string? pinyin)
{
return PinyinDetails?.ContainsIgnoreCase(pinyin) is true
|| PinyinMod?.ContainsIgnoreCase(pinyin) is true;
}
}
}