diff --git a/Beam.Abstractions/IDataBindings.cs b/Beam.Abstractions/IDataBindings.cs index 1155eee..d8eab50 100644 --- a/Beam.Abstractions/IDataBindings.cs +++ b/Beam.Abstractions/IDataBindings.cs @@ -1,6 +1,4 @@ -using Beam.Dynamic; - -namespace Beam.Abstractions; +namespace Beam.Abstractions; public interface IDataBindings { IDataProvider? Title { get; set; } diff --git a/Beam.Abstractions/IDataProvider.cs b/Beam.Abstractions/IDataProvider.cs index db87588..68224f5 100644 --- a/Beam.Abstractions/IDataProvider.cs +++ b/Beam.Abstractions/IDataProvider.cs @@ -1,7 +1,6 @@ using HtmlAgilityPack; -using System.Text.Json.Serialization; -namespace Beam.Dynamic; +namespace Beam.Abstractions; public interface IDataProvider { public string GetString(HtmlDocument document) diff --git a/Beam.Abstractions/ILinkBuilder.cs b/Beam.Abstractions/ILinkBuilder.cs index 3e45db5..5295515 100644 --- a/Beam.Abstractions/ILinkBuilder.cs +++ b/Beam.Abstractions/ILinkBuilder.cs @@ -1,6 +1,4 @@ -using Beam.Models; - -namespace Beam.Abstractions; +namespace Beam.Abstractions; public interface ILinkBuilder { /// diff --git a/Beam.Abstractions/IReadOnlyState.cs b/Beam.Abstractions/IReadOnlyState.cs index e76be02..1c57efa 100644 --- a/Beam.Abstractions/IReadOnlyState.cs +++ b/Beam.Abstractions/IReadOnlyState.cs @@ -1,6 +1,6 @@ -namespace Beam.Models; +namespace Beam.Abstractions; public interface IReadOnlyState { - public string[] GetState(); - IReadOnlyState Copy(); + public ReadOnlySpan GetState(); + IState Copy(); } \ No newline at end of file diff --git a/Beam.Abstractions/IState.cs b/Beam.Abstractions/IState.cs index 1869f50..4aac3a5 100644 --- a/Beam.Abstractions/IState.cs +++ b/Beam.Abstractions/IState.cs @@ -1,8 +1,9 @@ -using Beam.Models; +namespace Beam.Abstractions; -namespace Beam.Abstractions; - -public interface IState : IReadOnlyState { +public interface IState { + + string[] GetState(); void SetState(string[] state); new IState Copy(); + IReadOnlyState AsReadOnly(); } \ No newline at end of file diff --git a/Beam.Abstractions/IStateChangeBehaviour.cs b/Beam.Abstractions/IStateChangeBehaviour.cs index 1a5e28b..1686df5 100644 --- a/Beam.Abstractions/IStateChangeBehaviour.cs +++ b/Beam.Abstractions/IStateChangeBehaviour.cs @@ -1,6 +1,4 @@ -using Beam.Models; - -namespace Beam.Abstractions; +namespace Beam.Abstractions; /// /// Defines how a url template should should be updated, in what order, and by how much diff --git a/Beam.Api/ApiCallBuilder.cs b/Beam.Api/ApiCallBuilder.cs index f4f3144..67745fc 100644 --- a/Beam.Api/ApiCallBuilder.cs +++ b/Beam.Api/ApiCallBuilder.cs @@ -5,7 +5,6 @@ using System.Net; using System.Reflection.PortableExecutable; using System.Text; using System.Threading.Tasks; -using Beam.Abstractions; namespace Beam { public class ApiCallBuilder(HttpClient client) { diff --git a/Beam.Data/LinkBuilder.cs b/Beam.Data/LinkBuilder.cs index 34312c6..dc1716b 100644 --- a/Beam.Data/LinkBuilder.cs +++ b/Beam.Data/LinkBuilder.cs @@ -325,7 +325,7 @@ namespace Beam.Data { } public string Build(IReadOnlyState state) - => Build(state.GetState().ToArray()); + => Build(state.GetState().ToArray().ToArray()); #region Build /// diff --git a/Beam.Dynamic/AnchorCollectionDataProvider.cs b/Beam.Dynamic/AnchorCollectionDataProvider.cs index a79a459..339c6ee 100644 --- a/Beam.Dynamic/AnchorCollectionDataProvider.cs +++ b/Beam.Dynamic/AnchorCollectionDataProvider.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Beam.Abstractions; namespace Beam.Dynamic { public class AnchorCollectionDataProvider : IDataProvider { diff --git a/Beam.Dynamic/AnchorDataProvider.cs b/Beam.Dynamic/AnchorDataProvider.cs index d9c2223..d4b91e6 100644 --- a/Beam.Dynamic/AnchorDataProvider.cs +++ b/Beam.Dynamic/AnchorDataProvider.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Beam.Abstractions; namespace Beam.Dynamic { public class AnchorDataProvider : IDataProvider { diff --git a/Beam.Dynamic/ContentsArrayDataProvider.cs b/Beam.Dynamic/ContentsArrayDataProvider.cs index 1d5af6d..6bdd4ed 100644 --- a/Beam.Dynamic/ContentsArrayDataProvider.cs +++ b/Beam.Dynamic/ContentsArrayDataProvider.cs @@ -1,4 +1,5 @@ -using HtmlAgilityPack; +using Beam.Abstractions; +using HtmlAgilityPack; namespace Beam.Dynamic { public class ContentsArrayDataProvider : ContentsDataProvider, IDataProvider { diff --git a/Beam.Dynamic/ContentsDataProvider.cs b/Beam.Dynamic/ContentsDataProvider.cs index 28a8d3e..0ecb361 100644 --- a/Beam.Dynamic/ContentsDataProvider.cs +++ b/Beam.Dynamic/ContentsDataProvider.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using Beam.Abstractions; namespace Beam.Dynamic { public class ContentsDataProvider : IDataProvider { diff --git a/Beam.Dynamic/DataProviderJsonTypeInfoResolver.cs b/Beam.Dynamic/DataProviderJsonTypeInfoResolver.cs index 132fb98..620ab38 100644 --- a/Beam.Dynamic/DataProviderJsonTypeInfoResolver.cs +++ b/Beam.Dynamic/DataProviderJsonTypeInfoResolver.cs @@ -1,6 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; +using Beam.Abstractions; namespace Beam.Dynamic; diff --git a/Beam.Dynamic/DropDownDataProvider.cs b/Beam.Dynamic/DropDownDataProvider.cs index 4e8f359..45e21b5 100644 --- a/Beam.Dynamic/DropDownDataProvider.cs +++ b/Beam.Dynamic/DropDownDataProvider.cs @@ -7,6 +7,7 @@ using System.Runtime.InteropServices.Marshalling; using System.Text; using System.Text.Json; using System.Threading.Tasks; +using Beam.Abstractions; namespace Beam.Dynamic { public class DropDownDataProvider diff --git a/Beam.Dynamic/ListContentDataProvider.cs b/Beam.Dynamic/ListContentDataProvider.cs index 0564ed0..997aadd 100644 --- a/Beam.Dynamic/ListContentDataProvider.cs +++ b/Beam.Dynamic/ListContentDataProvider.cs @@ -1,5 +1,6 @@ using HtmlAgilityPack; using System.Text; +using Beam.Abstractions; namespace Beam.Dynamic { public class ListContentDataProvider : IDataProvider { diff --git a/Beam.Dynamic/ParagraphedContentDataProvider.cs b/Beam.Dynamic/ParagraphedContentDataProvider.cs index 67e32b5..ef81fab 100644 --- a/Beam.Dynamic/ParagraphedContentDataProvider.cs +++ b/Beam.Dynamic/ParagraphedContentDataProvider.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Beam.Abstractions; namespace Beam.Dynamic { public class ParagraphedContentDataProvider : IDataProvider { diff --git a/Beam.Fluent/DownloadBuilder.ContextStage.cs b/Beam.Fluent/DownloadBuilder.ContextStage.cs index 182c725..1940bd2 100644 --- a/Beam.Fluent/DownloadBuilder.ContextStage.cs +++ b/Beam.Fluent/DownloadBuilder.ContextStage.cs @@ -1,9 +1,9 @@ -using Beam.Abstractions; -using Beam.Models; +using Beam.Models; using HtmlAgilityPack; using Beam.Playwright; using Beam.Stealth; using Beam; +using Beam.Abstractions; using Beam.Downloaders; namespace Beam.Fluent { diff --git a/Beam.Models/ImmutableState.cs b/Beam.Models/ImmutableState.cs index 97bb3d6..faee5ec 100644 --- a/Beam.Models/ImmutableState.cs +++ b/Beam.Models/ImmutableState.cs @@ -1,25 +1,22 @@ using System.Text.Json.Serialization; +using Beam.Abstractions; namespace Beam.Models { - public readonly struct ImmutableState { - readonly string[] state; + public readonly struct ImmutableState : IReadOnlyState { + private readonly string[] state; [JsonConstructor] - public ImmutableState(string[] state) { - this.state = state ?? []; + public ImmutableState(params IEnumerable state) { + this.state = state.ToArray(); } - public string[] State => state ?? []; - - public readonly Span AsSpan() => state ?? []; - + public ReadOnlySpan GetState() => this.state; + public readonly State Copy() => new((string[])(state ?? []).Clone()); - - public readonly string this[Index i] { - get => state[i]; - } - + IState IReadOnlyState.Copy() + => Copy(); + public readonly string this[Index i] => state[i]; public static implicit operator State(ImmutableState state) => state.Copy(); } diff --git a/Beam.Models/State.cs b/Beam.Models/State.cs index ced03a5..44c5b4a 100644 --- a/Beam.Models/State.cs +++ b/Beam.Models/State.cs @@ -3,18 +3,21 @@ namespace Beam.Models { public class State(string[] state) : IState { string[] state = state; - + public string[] GetState() => state; + public void SetState(string[] state) => this.state = state; + public IReadOnlyState AsReadOnly() => new ImmutableState(this.state); + public State Copy() => new((string[])state.Clone()); - IReadOnlyState IReadOnlyState.Copy() - => Copy(); IState IState.Copy() => Copy(); + public static implicit operator ImmutableState(State state) => new ImmutableState(state.GetState()); + public string this[Index i] { get => state[i]; set => state[i] = value; diff --git a/Beam/OrderedLinkGenerator.cs b/Beam/OrderedLinkGenerator.cs index ad80a74..2fd6708 100644 --- a/Beam/OrderedLinkGenerator.cs +++ b/Beam/OrderedLinkGenerator.cs @@ -49,7 +49,7 @@ namespace Beam { } Behaviour.Apply(State, 1); - Current = Builder.Build(State); + Current = Builder.Build(State.AsReadOnly()); return !string.IsNullOrWhiteSpace(Current) && (EndState is null || !State.GetState().SequenceEqual(EndState.GetState())); } @@ -57,7 +57,7 @@ namespace Beam { public void Reset() { State = InitialState.Copy(); Behaviour.Apply(State, -1); - Current = Builder.Build(State); + Current = Builder.Build(State.AsReadOnly()); } } }