From 59433272dc570b820ae501dcb0ade78b20a8ef2c Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Wed, 15 Jul 2020 16:21:14 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=20Refactor=20for=20UPM=20structure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 215 ------------- .gitignore | 350 -------------------- CHANGELOG.md | 72 ----- CONTRIBUTING.md | 29 -- LICENSE.md | 21 -- README.md | 262 --------------- X10D.Tests/X10D.Tests.csproj | 35 -- X10D.Tests/src/Assembly.cs | 3 - X10D.Tests/src/Core/BooleanTests.cs | 214 ------------- X10D.Tests/src/Core/ByteTests.cs | 103 ------ X10D.Tests/src/Core/CharTests.cs | 35 -- X10D.Tests/src/Core/ComparableTests.cs | 22 -- X10D.Tests/src/Core/ConvertibleTests.cs | 58 ---- X10D.Tests/src/Core/DateTimeTests.cs | 107 ------- X10D.Tests/src/Core/DictionaryTests.cs | 42 --- X10D.Tests/src/Core/DoubleTests.cs | 84 ----- X10D.Tests/src/Core/EnumerableTests.cs | 55 ---- X10D.Tests/src/Core/ReflectionTests.cs | 70 ---- X10D.Tests/src/Core/StringTests.cs | 34 -- X10D.Tests/src/Core/TimeSpanParserTests.cs | 26 -- X10D.Tests/src/Unity/Vector3Tests.cs | 93 ------ X10D.Unity.dll | Bin 0 -> 9216 bytes X10D.Unity/X10D.Unity.csproj | 72 ----- X10D.Unity/src/BetterBehavior.cs | 107 ------- X10D.Unity/src/GameObjectExtensions.cs | 64 ---- X10D.Unity/src/GameTime.cs | 54 ---- X10D.Unity/src/TransformExtensions.cs | 37 --- X10D.Unity/src/Vector3Extensions.cs | 111 ------- X10D.dll | Bin 0 -> 26112 bytes X10D.sln | 42 --- X10D/README.md | 27 -- X10D/Resource.Designer.cs | 81 ----- X10D/Resource.resx | 126 -------- X10D/X10D.csproj | 65 ---- X10D/src/Assembly.cs | 3 - X10D/src/BooleanExtensions.cs | 145 --------- X10D/src/ByteExtensions.cs | 116 ------- X10D/src/CharExtensions.cs | 90 ------ X10D/src/ComparableExtensions.cs | 27 -- X10D/src/ConvertibleExtensions.cs | 161 ---------- X10D/src/DateTimeExtensions.cs | 124 ------- X10D/src/DictionaryExtensions.cs | 101 ------ X10D/src/DoubleExtensions.cs | 93 ------ X10D/src/EndPointExtensions.cs | 43 --- X10D/src/EnumerableExtensions.cs | 33 -- X10D/src/Int16Extensions.cs | 189 ----------- X10D/src/Int32Extensions.cs | 175 ---------- X10D/src/Int64Extensions.cs | 241 -------------- X10D/src/ListExtensions.cs | 104 ------ X10D/src/RandomExtensions.cs | 76 ----- X10D/src/ReflectionExtensions.cs | 123 ------- X10D/src/SingleExtensions.cs | 93 ------ X10D/src/StreamExtensions.cs | 32 -- X10D/src/StringExtensions.cs | 356 --------------------- X10D/src/StructExtensions.cs | 56 ---- X10D/src/TimeSpanParser.cs | 77 ----- X10D/src/WaitHandleExtensions.cs | 21 -- _config.yml | 1 - icon.png | Bin 32695 -> 0 bytes 59 files changed, 5196 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .gitignore delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE.md delete mode 100644 README.md delete mode 100644 X10D.Tests/X10D.Tests.csproj delete mode 100644 X10D.Tests/src/Assembly.cs delete mode 100644 X10D.Tests/src/Core/BooleanTests.cs delete mode 100644 X10D.Tests/src/Core/ByteTests.cs delete mode 100644 X10D.Tests/src/Core/CharTests.cs delete mode 100644 X10D.Tests/src/Core/ComparableTests.cs delete mode 100644 X10D.Tests/src/Core/ConvertibleTests.cs delete mode 100644 X10D.Tests/src/Core/DateTimeTests.cs delete mode 100644 X10D.Tests/src/Core/DictionaryTests.cs delete mode 100644 X10D.Tests/src/Core/DoubleTests.cs delete mode 100644 X10D.Tests/src/Core/EnumerableTests.cs delete mode 100644 X10D.Tests/src/Core/ReflectionTests.cs delete mode 100644 X10D.Tests/src/Core/StringTests.cs delete mode 100644 X10D.Tests/src/Core/TimeSpanParserTests.cs delete mode 100644 X10D.Tests/src/Unity/Vector3Tests.cs create mode 100644 X10D.Unity.dll delete mode 100644 X10D.Unity/X10D.Unity.csproj delete mode 100644 X10D.Unity/src/BetterBehavior.cs delete mode 100644 X10D.Unity/src/GameObjectExtensions.cs delete mode 100644 X10D.Unity/src/GameTime.cs delete mode 100644 X10D.Unity/src/TransformExtensions.cs delete mode 100644 X10D.Unity/src/Vector3Extensions.cs create mode 100644 X10D.dll delete mode 100644 X10D.sln delete mode 100644 X10D/README.md delete mode 100644 X10D/Resource.Designer.cs delete mode 100644 X10D/Resource.resx delete mode 100644 X10D/X10D.csproj delete mode 100644 X10D/src/Assembly.cs delete mode 100644 X10D/src/BooleanExtensions.cs delete mode 100644 X10D/src/ByteExtensions.cs delete mode 100644 X10D/src/CharExtensions.cs delete mode 100644 X10D/src/ComparableExtensions.cs delete mode 100644 X10D/src/ConvertibleExtensions.cs delete mode 100644 X10D/src/DateTimeExtensions.cs delete mode 100644 X10D/src/DictionaryExtensions.cs delete mode 100644 X10D/src/DoubleExtensions.cs delete mode 100644 X10D/src/EndPointExtensions.cs delete mode 100644 X10D/src/EnumerableExtensions.cs delete mode 100644 X10D/src/Int16Extensions.cs delete mode 100644 X10D/src/Int32Extensions.cs delete mode 100644 X10D/src/Int64Extensions.cs delete mode 100644 X10D/src/ListExtensions.cs delete mode 100644 X10D/src/RandomExtensions.cs delete mode 100644 X10D/src/ReflectionExtensions.cs delete mode 100644 X10D/src/SingleExtensions.cs delete mode 100644 X10D/src/StreamExtensions.cs delete mode 100644 X10D/src/StringExtensions.cs delete mode 100644 X10D/src/StructExtensions.cs delete mode 100644 X10D/src/TimeSpanParser.cs delete mode 100644 X10D/src/WaitHandleExtensions.cs delete mode 100644 _config.yml delete mode 100644 icon.png diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index ae973bf..0000000 --- a/.editorconfig +++ /dev/null @@ -1,215 +0,0 @@ -# All files -[*] -guidelines = 130 - -# C# files -[*.cs] - -#### Core EditorConfig Options #### - -# Indentation and spacing -indent_size=4 -indent_style=space -tab_width=4 - -# New line preferences -end_of_line=crlf -insert_final_newline=true - -#### .NET Coding Conventions #### - -# Organize usings -dotnet_separate_import_directive_groups=false -dotnet_sort_system_directives_first=true - -# this. and Me. preferences -dotnet_style_qualification_for_event=true:suggestion -dotnet_style_qualification_for_field=true:suggestion -dotnet_style_qualification_for_method=true:suggestion -dotnet_style_qualification_for_property=true:suggestion - -# Language keywords vs BCL types preferences -dotnet_style_predefined_type_for_locals_parameters_members=true:warning -dotnet_style_predefined_type_for_member_access=true:warning - -# Parentheses preferences -dotnet_style_parentheses_in_arithmetic_binary_operators=always_for_clarity:silent -dotnet_style_parentheses_in_other_binary_operators=always_for_clarity:silent -dotnet_style_parentheses_in_other_operators=never_if_unnecessary:silent -dotnet_style_parentheses_in_relational_binary_operators=always_for_clarity:silent - -# Modifier preferences -dotnet_style_require_accessibility_modifiers=for_non_interface_members:silent - -# Expression-level preferences -dotnet_style_coalesce_expression=true:suggestion -dotnet_style_collection_initializer=true:suggestion -dotnet_style_explicit_tuple_names=true:suggestion -dotnet_style_null_propagation=true:suggestion -dotnet_style_object_initializer=true:suggestion -dotnet_style_prefer_auto_properties=true:silent -dotnet_style_prefer_compound_assignment=true:suggestion -dotnet_style_prefer_conditional_expression_over_assignment=true:silent -dotnet_style_prefer_conditional_expression_over_return=true:silent -dotnet_style_prefer_inferred_anonymous_type_member_names=false:suggestion -dotnet_style_prefer_inferred_tuple_names=false:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method=true:suggestion -dotnet_style_prefer_simplified_interpolation=true:suggestion - -# Field preferences -dotnet_style_readonly_field=true:suggestion - -# Parameter preferences -dotnet_code_quality_unused_parameters=all:suggestion - -#### C# Coding Conventions #### - -# var preferences -csharp_style_var_elsewhere=true:warning -csharp_style_var_when_type_is_apparent=true:warning -csharp_style_var_for_built_in_types=true:warning - -# Expression-bodied members -csharp_style_expression_bodied_accessors=true:suggestion -csharp_style_expression_bodied_constructors=false:suggestion -csharp_style_expression_bodied_indexers=true:suggestion -csharp_style_expression_bodied_lambdas=true:silent -csharp_style_expression_bodied_local_functions=false:silent -csharp_style_expression_bodied_methods=false:suggestion -csharp_style_expression_bodied_operators=false:suggestion -csharp_style_expression_bodied_properties=false:suggestion - -# Pattern matching preferences -csharp_style_pattern_matching_over_as_with_null_check=true:suggestion -csharp_style_pattern_matching_over_is_with_cast_check=true:suggestion -csharp_style_prefer_switch_expression=true:suggestion - -# Null-checking preferences -csharp_style_conditional_delegate_call=true:suggestion - -# Modifier preferences -csharp_prefer_static_local_function=true:suggestion -csharp_preferred_modifier_order=public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent - -# Code-block preferences -csharp_prefer_braces=true:suggestion -csharp_prefer_simple_using_statement=true:suggestion - -# Expression-level preferences -csharp_prefer_simple_default_expression=true:suggestion -csharp_style_deconstructed_variable_declaration=true:suggestion -csharp_style_inlined_variable_declaration=true:suggestion -csharp_style_pattern_local_over_anonymous_function=true:suggestion -csharp_style_prefer_index_operator=true:suggestion -csharp_style_prefer_range_operator=true:suggestion -csharp_style_throw_expression=true:suggestion -csharp_style_unused_value_assignment_preference=discard_variable:suggestion -csharp_style_unused_value_expression_statement_preference=discard_variable:silent - -# 'using' directive preferences -csharp_using_directive_placement=inside_namespace:suggestion - -#### C# Formatting Rules #### - -max_line_length=130 - -# New line preferences -csharp_new_line_before_catch=true -csharp_new_line_before_else=true -csharp_new_line_before_finally=true -csharp_new_line_before_members_in_anonymous_types=true -csharp_new_line_before_members_in_object_initializers=true -csharp_new_line_before_open_brace=all -csharp_new_line_between_query_expression_clauses=true - -# Indentation preferences -csharp_indent_block_contents=true -csharp_indent_braces=false -csharp_indent_case_contents=true -csharp_indent_case_contents_when_block=true -csharp_indent_labels=one_less_than_current -csharp_indent_switch_labels=true - -# Space preferences -csharp_space_after_cast=false -csharp_space_after_colon_in_inheritance_clause=true -csharp_space_after_comma=true -csharp_space_after_dot=false -csharp_space_after_keywords_in_control_flow_statements=true -csharp_space_after_semicolon_in_for_statement=true -csharp_space_around_binary_operators=before_and_after -csharp_space_around_declaration_statements=false -csharp_space_before_colon_in_inheritance_clause=true -csharp_space_before_comma=false -csharp_space_before_dot=false -csharp_space_before_open_square_brackets=false -csharp_space_before_semicolon_in_for_statement=false -csharp_space_between_empty_square_brackets=false -csharp_space_between_method_call_empty_parameter_list_parentheses=false -csharp_space_between_method_call_name_and_opening_parenthesis=false -csharp_space_between_method_call_parameter_list_parentheses=false -csharp_space_between_method_declaration_empty_parameter_list_parentheses=false -csharp_space_between_method_declaration_name_and_open_parenthesis=false -csharp_space_between_method_declaration_parameter_list_parentheses=false -csharp_space_between_parentheses=false -csharp_space_between_square_brackets=false - -# Wrapping preferences -csharp_preserve_single_line_blocks=true -csharp_preserve_single_line_statements=true - -#### Naming styles #### - -# Naming rules - -dotnet_naming_rule.interface_should_be_begins_with_i.severity=suggestion -dotnet_naming_rule.interface_should_be_begins_with_i.symbols=interface -dotnet_naming_rule.interface_should_be_begins_with_i.style=begins_with_i - -dotnet_naming_rule.types_should_be_pascal_case.severity=suggestion -dotnet_naming_rule.types_should_be_pascal_case.symbols=types -dotnet_naming_rule.types_should_be_pascal_case.style=pascal_case - -dotnet_naming_rule.non_field_members_should_be_pascal_case.severity=suggestion -dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols=non_field_members -dotnet_naming_rule.non_field_members_should_be_pascal_case.style=pascal_case - -# Symbol specifications - -dotnet_naming_symbols.interface.applicable_kinds=interface -dotnet_naming_symbols.interface.applicable_accessibilities=public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.interface.required_modifiers= - -dotnet_naming_symbols.types.applicable_kinds=class, struct, interface, enum -dotnet_naming_symbols.types.applicable_accessibilities=public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.types.required_modifiers= - -dotnet_naming_symbols.non_field_members.applicable_kinds=property, event, method -dotnet_naming_symbols.non_field_members.applicable_accessibilities=public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.non_field_members.required_modifiers= - -# Naming styles - -dotnet_naming_style.pascal_case.required_prefix= - dotnet_naming_style.pascal_case.required_suffix= - dotnet_naming_style.pascal_case.word_separator= - dotnet_naming_style.pascal_case.capitalization=pascal_case - -dotnet_naming_style.begins_with_i.required_prefix=I -dotnet_naming_style.begins_with_i.required_suffix= -dotnet_naming_style.begins_with_i.word_separator= - dotnet_naming_style.begins_with_i.capitalization=pascal_case - -# XML comment analysis is disabled due to project configuration -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA0001.md -dotnet_diagnostic.SA0001.severity = silent - -# A C# code file is missing a standard file header. -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1633.md -dotnet_diagnostic.SA1633.severity = silent - -# Consider calling ConfigureAwait on the awaited Task -# https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2007?view=vs-2019 -# https://github.com/JosefPihrt/Roslynator/blob/master/docs/analyzers/RCS1090.md -dotnet_diagnostic.CA2007.severity = silent -dotnet_diagnostic.RCS1090.severity = silent diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 16fe8be..0000000 --- a/.gitignore +++ /dev/null @@ -1,350 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.idea -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 276ae66..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,72 +0,0 @@ -# Changelog - -## [2.2.0] - 2020-04-21 -### Added -- Add `string.ChangeEncoding(Encoding, Encoding)` - - Converts this string from one encoding to another -- Add `string.IsLower` - - Determines if all alpha characters in this string are considered lowercase -- Add `string.IsUpper` - - Determines if all alpha characters in this string are considered uppercase - -- Various extension methods with regards to reflection: - - `GetDefaultValue` and `GetDefaultValue` - gets the value stored in the member's `DefaultValue` attribute - - `GetDescription`- gets the value stored in the member's `Description` attribute - - `SelectFromCustomAttribute` - Internally calls `GetCustomAttribute` and passes it to a `Func` so that specific members may be selected - -### Changed -- n/a - -### Removed -- n/a - -## [2.1.0] - 2020-04-18 -### Added -- `bool bool.And(bool)` - - Performs logical AND -- `bool bool.Or(bool)` - - Performs logical OR -- `bool bool.Not(bool)` - - Performs logical NOT -- `bool bool.XOr(bool)` - - Performs Logical XOR -- `bool bool.NAnd(bool)` - - Performs logical NAND -- `bool bool.NOr(bool)` - - Performs logical NOR -- `bool bool.XNOr(bool)` - - Performs logical XNOR -- `byte bool.ToByte()` - - 1 if `true`, 0 otherwise -- `short bool.ToInt16()` - - 1 if `true`, 0 otherwise -- `long bool.ToInt64()` - - 1 if `true`, 0 otherwise - -### Changed -- n/a - -### Removed -- n/a - -## [2.0.0] - 2020-04-18 - -### Added -- Add `IEnumerable.Split(int)` - - Performs the same operation as the previously defined `IEnumerable.Chunkify(int)`, except now accepts any type `T` - -### Changed -- Fix `DateTime.Last(DayOfWeek)` implementation - - Now returns the correct date/time for a given day of the week - -### Removed -- Remove `IEnumerable.Chunkify(int)` - - Replaced by a method of the same behaviour `IEnumerable.Split(int)` - -## Earlier versions -### ***Not documented*** - -[Unreleased]: https://github.com/oliverbooth/X10D/tree/HEAD -[2.2.0]: https://github.com/oliverbooth/X10D/releases/tag/2.2.0 -[2.1.0]: https://github.com/oliverbooth/X10D/releases/tag/2.1.0 -[2.0.0]: https://github.com/oliverbooth/X10D/releases/tag/2.0.0 \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index edf02e4..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,29 +0,0 @@ -## How you can contribute -Contributions to this project are always welcome. If you spot a bug, or want to request a new extension method, open a new issue or submit a pull request. - -### Pull request guidelines -This project uses C# 8.0 language features, and adheres to the following analyzers: - -- Rozlynator -- FxCop -- StyleCop - -There is an `.editorconfig` and an analyzer `ruleset` file included in this repository. For quick and painless pull requests, ensure that these analyzers do not throw warnings. - -### Code style -Below are a few pointers to which you may refer, but keep in mind this is not an exhaustive list: - -- Use C# 8.0 features where possible -- Try to ensure code is CLS-compliant -- Follow all .NET guidelines for naming conventions -- Make full use of XMLDoc and be thorough - but concise - with all documentation. -- Ensure that no line exceeds 120 characters in length -- Do NOT include file headers in any form -- Declare `using` directives within namespace scope -- Try to avoid using exceptions for flow control - -### Tests -When introducing a new extension method, you must ensure that you have also defined a unit test that asserts its correct behavior. The code style guidelines and code-analysis rules apply to the `X10D.Tests` equally as much as `X10D`, although documentation may be briefer. Refer to existing tests as a guideline. - -### Disclaimer -In the event of a code style violation, a pull request may left open (or closed entirely) without merging. Keep in mind this does not mean the theory or implementation of the method is inherently bad or rejected entirely (although if this is the case, it will be outlined) \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index b6e3a9a..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Oliver Booth - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 7906e5e..0000000 --- a/README.md +++ /dev/null @@ -1,262 +0,0 @@ -# X10D -## Extension methods on crack - -[](https://github.com/oliverbooth/X10D/actions?query=workflow%3A%22.NET+Core%22) -[](https://github.com/oliverbooth/X10D/issues) -[](https://www.nuget.org/packages/X10D/) -[](https://github.com/oliverbooth/X10D/blob/master/LICENSE.md) - -### About -X10D (pronounced *extend*), is a class library that provides extension methods for numerous .NET types. The purpose of this library is to simplify a codebase by reducing the need for repeated code when performing common operations. Simplify your codebase. Take advantage of .NET. Use extension methods. - -*(I'm also [dogfooding](https://deviq.com/dogfooding/) this library, so there's that.)* - -### Table of contents -- [Install](#install) -- [Features](#features) - - [Numeric](#numeric) - - [String](#string) - - [DateTime](#datetime) - - [Enumerable](#enumerable) - - [Enum](#enum) - - [Conversion](#conversion) - - [Random](#random) -- [Contributing](#contributing) -- [License](#license) - -You can find the list of classes that have extension methods by viewing the `README.md` file in any of the respective library folders. - -## Install -Install X10D with NuGet via the following command: -```ps -Install-Package X10D -Version 2.2.0 -``` -or by downloading the [latest release](https://github.com/oliverbooth/X10D/releases/latest) from this repository. - -## Features -### Numeric extensions -> 👍 ProTip: *Most* of the extensions available for `int` will also exist for `short`, `long`, and their unsigned counterparts! - -#### `bool` <-> `int` -Convert a `bool` to an `int` by using `ToInt32`. The value returned is 1 if the input is `true`, and 0 if it's `false`. -```cs -bool b = true; - -int i = b.ToInt32(); // 1 -``` -The same also works in reverse. Using `ToBoolean` on an `int` will return `false` if the input is 0, and `true`if the input is anything else. -```cs -int zero = 0; -long nonZero = 1; - -bool b1 = zero.ToBoolean(); // false -bool b2 = nonZero.ToBoolean(); // true -``` - -#### Between -Determine if a value is between other values using `Between` like so: -```cs -int i = 3; - -if (i.Between(2, 4)) -{ - // i is between 2 and 4! -} -``` -Since the signature of this method is defined with a generic constraint of `IComparable`, this will also work for any object that is `IComparable` - not just numeric types! -```cs -bool Between(this T actual, T lower, T upper) where T : IComparable -``` - -#### IsEven (*and IsOdd*) -As the names suggest, this method determines if the input value is evenly divisible by 2. -```cs -int i = 5; -bool b = i.IsEven(); // false -``` -There is also an `IsOdd` extension method, which will return the opposite of that returned by `IsEven`. - -#### IsPrime -Determine if an integral is a prime number by using `IsPrime`. -```cs -bool b = 43.IsPrime(); // true -``` - -#### Clamp -Clamp a value between an upper and lower bound -```cs -int i = 5.Clamp(0, 3); // 3 -``` - -#### Convert degrees <-> radians -Easily convert between radians and degrees -```cs -double rad = 2 * Math.PI; -double deg = rad.RadiansToDegrees(); // 360 - -rad = deg.DegreesToRadians(); // back to 2*pi -``` - -#### Round -Round a value to the nearest whole number: -```cs -var d = 2.75; -var rounded = d.Round(); // 3 -``` -Or specify a value to have it round to the nearest multiple of `x`: -```cs -double a = 8.0.Round(10); // 10 -double b = 2.0.Round(10); // 0 -``` - -### String -#### Repeat value -Repeat a string or a char a specific number of times using `Repeat` -```cs -var c = '-'; -var str = "foo"; - -string repeatedC = c.Repeat(10); // ---------- -string repeatedStr = str.Repeat(5); // foofoofoofoofoo -``` - -#### Base-64 encode/decode -```cs -var base64 = "Hello World".Base64Encode(); // SGVsbG8gV29ybGQ= -var str = "SGVsbG8gV29ybGQ=".Base64Decode(); // Hello World -``` - -### DateTime - -#### Age -Get a rounded integer representing the number of years since a given date. i.e. easily calculate someone's age: -```cs -var dateOfBirth = new DateTime(1960, 7, 16); -int age = dateOfBirth.Age(); // the age as of today -``` -You can also specify a date at which to stop counting the years, by passing an `asOf` date: -```cs -var dateOfBirth = new DateTime(1960, 7, 16); -int age = dateOfBirth.Age(new DateTime(1970, 7, 16)); // 10, the age as of 1970 -``` - -#### To/From Unix Timestamp -Convert to/from a Unix timestamp represented in seconds using `FromUnixTimestamp` on a numeric type, and `ToUnixTimestamp` on a `DateTime`. -```cs -long sec = 1587223415; -DateTime time = sec.FromUnixTimestamp(); // 2020-04-18 15:23:35 -long unix = time.ToUnixTimestamp(); -``` -or represent it with milliseconds by passing `true` for the `isMillis` argument: -```cs -long millis = 1587223415500; -DateTime time = millis.FromUnixTimestamp(true); // 2020-04-18 15:23:35.50 -long unix = time.ToUnixTimestamp(true); -``` - -#### Get first/last day of month -Get the first or last day of the month by using `FirstDayOfMonth` and `LastDayOfMonth` -```cs -var dt = new DateTime(2016, 2, 4); - -DateTime first = dt.FirstDayOfMonth(); // 2016-02-01 -DateTime last = dt.LastDayOfMonth(); // 2016-02-29 (2016 is a leap year) -``` -You can also use `First` or `Last` to get the first or final occurrence of a specific day of the week in a given month: -```cs -var dt = new DateTime(2019, 4, 14); - -DateTime theLastFriday = dt.Last(DayOfWeek.Friday); // 2019-04-24 -DateTime theLastThursday = dt.Last(DayOfWeek.Thursday); // 2019-04-40 -``` - -### Enumerable -#### Split into chunks -Split an `IEnumerable` into an `IEnumerable>`, essentially "chunking" the original IEnumerable into a specific size -```cs -var arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; -var chunks = arr.Split(2); // split into chunks of 2 - -foreach (var chunk in chunks) -{ - Console.WriteLine(string.Join(", ", chunk)); -} - -// Output: -// 1, 2 -// 3, 4 -// 5, 6 -// 7, 8 -``` -This also works for `string`: -```cs -var str = "Hello World"; -var chunks = str.Split(2); // split string into chunks of 2 - -foreach (var chunk in chunks) -{ - Console.WriteLine(string.Join(string.Empty, chunk)); -} - -// Output: -// He -// ll -// o <-- space is included -// Wo -// rl -// d <-- no space! end of string -``` - -### Enum -#### Parse string into enum -You can use the `EnumParse` method to convert a string into a value from an enum, while optionally ignoring case: -```cs -enum Number -{ - Zero, - One, - Two, - Three, -} - -Number num = "two".EnumParse(true); // num == Number.Two -``` - -#### `Next` / `Previous` enum cycling -Cycle through the values in an enum with `Next` and `Previous`: -```cs -Number two = Number.Two; - -Number one = two.Previous(); -Number three = two.Next(); -``` - -### Conversion -Easily convert between types using `To`, `ToOrNull`, `ToOrDefault`, or `ToOrOther`, thereby shortening the call to `Convert.ChangeType` or `Convert.ToX`: -```CS -int i = "43".To(); -int j = "a".ToOrDefault(); // 0 -int k = "a".ToOrOther(100); // 100 -``` - -### Random -Do more with Random including flip a coin, randomly select an element in an array, or shuffle the array entirely. -```cs -var random = new Random(); - -// flip a coin -bool heads = random.CoinToss(); - -// randomly choose an item -var arr = new int[] { 1, 2, 3, 4 }; -var item = random.OneOf(arr); - -// shuffle an array or list -var shuffled = arr.Shuffle(random); -``` - -## Contributing -Contributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md). - -## License -X10D is released under the MIT License. See [here](https://github.com/oliverbooth/X10D/blob/master/LICENSE.md) for more details. \ No newline at end of file diff --git a/X10D.Tests/X10D.Tests.csproj b/X10D.Tests/X10D.Tests.csproj deleted file mode 100644 index bdba516..0000000 --- a/X10D.Tests/X10D.Tests.csproj +++ /dev/null @@ -1,35 +0,0 @@ - - - - netcoreapp3.1 - false - ..\X10D.ruleset - true - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - \ No newline at end of file diff --git a/X10D.Tests/src/Assembly.cs b/X10D.Tests/src/Assembly.cs deleted file mode 100644 index 8c11453..0000000 --- a/X10D.Tests/src/Assembly.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System; - -[assembly: CLSCompliant(true)] diff --git a/X10D.Tests/src/Core/BooleanTests.cs b/X10D.Tests/src/Core/BooleanTests.cs deleted file mode 100644 index 15bad0f..0000000 --- a/X10D.Tests/src/Core/BooleanTests.cs +++ /dev/null @@ -1,214 +0,0 @@ -namespace X10D.Tests.Core -{ - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class BooleanTests - { - /// - /// Tests for . - /// - [TestMethod] - public void And() - { - const bool a = true; - const bool b = true; - const bool c = false; - const bool d = false; - - Assert.IsTrue(a); - Assert.IsTrue(b); - Assert.IsFalse(c); - Assert.IsFalse(d); - - Assert.IsTrue(a.And(b)); - Assert.IsFalse(b.And(c)); - Assert.IsFalse(c.And(d)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void NAnd() - { - const bool a = true; - const bool b = true; - const bool c = false; - const bool d = false; - - Assert.IsTrue(a); - Assert.IsTrue(b); - Assert.IsFalse(c); - Assert.IsFalse(d); - - Assert.IsFalse(a.NAnd(b)); - Assert.IsTrue(b.NAnd(c)); - Assert.IsTrue(c.NAnd(d)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void NOr() - { - const bool a = true; - const bool b = true; - const bool c = false; - const bool d = false; - - Assert.IsTrue(a); - Assert.IsTrue(b); - Assert.IsFalse(c); - Assert.IsFalse(d); - - Assert.IsFalse(a.NOr(b)); - Assert.IsFalse(b.NOr(c)); - Assert.IsTrue(c.NOr(d)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void Not() - { - const bool a = true; - const bool b = false; - - Assert.IsTrue(a); - Assert.IsFalse(b); - Assert.IsFalse(a.Not()); - Assert.IsTrue(b.Not()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void Or() - { - const bool a = true; - const bool b = true; - const bool c = false; - const bool d = false; - - Assert.IsTrue(a); - Assert.IsTrue(b); - Assert.IsFalse(c); - Assert.IsFalse(d); - - Assert.IsTrue(a.Or(b)); - Assert.IsTrue(b.Or(c)); - Assert.IsFalse(c.Or(d)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToByte() - { - const bool a = true; - const bool b = false; - const byte c = 1; - const byte d = 0; - - Assert.IsTrue(a); - Assert.IsFalse(b); - Assert.AreEqual(c, a.ToByte()); - Assert.AreEqual(d, b.ToByte()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToInt16() - { - const bool a = true; - const bool b = false; - - Assert.IsTrue(a); - Assert.IsFalse(b); - Assert.AreEqual(1, a.ToInt16()); - Assert.AreEqual(0, b.ToInt16()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToInt32() - { - const bool a = true; - const bool b = false; - - Assert.IsTrue(a); - Assert.IsFalse(b); - Assert.AreEqual(1, a.ToInt32()); - Assert.AreEqual(0, b.ToInt32()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToInt64() - { - const bool a = true; - const bool b = false; - - Assert.IsTrue(a); - Assert.IsFalse(b); - Assert.AreEqual(1L, a.ToInt64()); - Assert.AreEqual(0L, b.ToInt64()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void XNOr() - { - const bool a = true; - const bool b = true; - const bool c = false; - const bool d = false; - - Assert.IsTrue(a); - Assert.IsTrue(b); - Assert.IsFalse(c); - Assert.IsFalse(d); - - Assert.IsTrue(a.XNOr(b)); - Assert.IsFalse(b.XNOr(c)); - Assert.IsTrue(c.XNOr(d)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void XOr() - { - const bool a = true; - const bool b = true; - const bool c = false; - const bool d = false; - - Assert.IsTrue(a); - Assert.IsTrue(b); - Assert.IsFalse(c); - Assert.IsFalse(d); - - Assert.IsFalse(a.XOr(b)); - Assert.IsTrue(b.XOr(c)); - Assert.IsFalse(c.XOr(d)); - } - } -} diff --git a/X10D.Tests/src/Core/ByteTests.cs b/X10D.Tests/src/Core/ByteTests.cs deleted file mode 100644 index e97061a..0000000 --- a/X10D.Tests/src/Core/ByteTests.cs +++ /dev/null @@ -1,103 +0,0 @@ -namespace X10D.Tests.Core -{ - using System.Collections.Generic; - using System.Text; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class ByteTests - { - /// - /// Tests for . - /// - [TestMethod] - public void AsString() - { - byte[] a = { 0x00, 0x73, 0xc6, 0xff }; - Assert.AreEqual("00-73-C6-FF", a.AsString()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetInt16() - { - byte[] a = { 0xF3, 0x3F }; - Assert.AreEqual(16371, a.GetInt16()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetInt32() - { - byte[] a = { 0xB0, 0x0B, 0x13, 0x5F }; - Assert.AreEqual(1595083696, a.GetInt32()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetInt64() - { - byte[] a = { 0xB0, 0x0B, 0x13, 0x50, 0x05, 0x31, 0xB0, 0x0B }; - Assert.AreEqual(842227029206305712L, a.GetInt64()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetString() - { - byte[] a = { 0x48, 0xc3, 0xa9, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64 }; - Assert.AreEqual("H\u00e9llo World", a.GetString()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetStringAscii() - { - byte[] a = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64 }; - Assert.AreEqual("Hello World", a.GetString(Encoding.ASCII)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetUInt16() - { - byte[] a = { 0xF3, 0x3F }; - Assert.AreEqual(16371, a.GetUInt16()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetUInt32() - { - byte[] a = { 0xB0, 0x0B, 0x13, 0x5F }; - Assert.AreEqual(1595083696U, a.GetUInt32()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetUInt64() - { - byte[] a = { 0xB0, 0x0B, 0x13, 0x50, 0x05, 0x31, 0xB0, 0x0B }; - Assert.AreEqual(842227029206305712UL, a.GetUInt64()); - } - } -} diff --git a/X10D.Tests/src/Core/CharTests.cs b/X10D.Tests/src/Core/CharTests.cs deleted file mode 100644 index d462d59..0000000 --- a/X10D.Tests/src/Core/CharTests.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace X10D.Tests.Core -{ - using System; - using System.Linq; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class CharTests - { - /// - /// Tests for . - /// - [TestMethod] - public void Random() - { - var set = "abcdefghijklmnopqrstuvwxyz".ToCharArray(); - var random = set.Random(20); - - Assert.IsTrue(random.All(c => Array.IndexOf(set, c) >= 0)); - Assert.IsFalse(random.Any(c => Array.IndexOf(set, c) < -1)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void Repeat() - { - Assert.AreEqual("aaaaaaaaaa", 'a'.Repeat(10)); - } - } -} diff --git a/X10D.Tests/src/Core/ComparableTests.cs b/X10D.Tests/src/Core/ComparableTests.cs deleted file mode 100644 index c477f9d..0000000 --- a/X10D.Tests/src/Core/ComparableTests.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace X10D.Tests.Core -{ - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class ComparableTests - { - /// - /// Tests for . - /// - [TestMethod] - public void Between() - { - Assert.IsTrue(5.Between(2, 7)); - Assert.IsTrue(10.Between(9, 11)); - Assert.IsFalse(100.Between(80, 99)); - } - } -} diff --git a/X10D.Tests/src/Core/ConvertibleTests.cs b/X10D.Tests/src/Core/ConvertibleTests.cs deleted file mode 100644 index cc11fc2..0000000 --- a/X10D.Tests/src/Core/ConvertibleTests.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace X10D.Tests.Core -{ - using System; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class ConvertibleTests - { - /// - /// Tests for . - /// - [TestMethod] - public void To() - { - Assert.AreEqual(2, "2".To()); - Assert.AreEqual("12.5", 12.50.To()); - Assert.IsTrue("True".To()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToOrDefault() - { - Assert.AreEqual(2, "2".ToOrDefault()); - Assert.AreEqual("12.5", 12.50.ToOrDefault()); - Assert.IsTrue("True".ToOrDefault()); - Assert.ThrowsException(() => "Foo".ToOrDefault()); - Assert.IsTrue("1.5".ToOrDefault(out float f)); - Assert.AreEqual(1.5f, f); - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToOrNull() - { - Assert.IsFalse("foo".ToOrNull(out ConvertibleTests t)); - Assert.IsNull(t); - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToOrOther() - { - Assert.AreEqual(2.0, "Foo".ToOrOther(2.0)); - Assert.IsFalse("Foo".ToOrOther(out var d, 2.0)); - Assert.AreEqual(2.0, d); - } - } -} diff --git a/X10D.Tests/src/Core/DateTimeTests.cs b/X10D.Tests/src/Core/DateTimeTests.cs deleted file mode 100644 index a670af9..0000000 --- a/X10D.Tests/src/Core/DateTimeTests.cs +++ /dev/null @@ -1,107 +0,0 @@ -namespace X10D.Tests.Core -{ - using System; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class DateTimeTests - { - /// - /// Tests for . - /// - [TestMethod] - public void Age() - { - // no choice but to create dynamic based on today's date. - // age varies with time - var now = DateTime.Now; - var dt = new DateTime(now.Year - 18, 1, 1); - - Assert.AreEqual(18, dt.Age()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void First() - { - var dt = new DateTime(2018, 6, 20); - - Assert.AreEqual(4, dt.First(DayOfWeek.Monday).Day); - } - - /// - /// Tests for . - /// - [TestMethod] - public void FirstDayOfMonth() - { - var dt = new DateTime(2018, 6, 20); - var first = dt.FirstDayOfMonth(); - - Assert.AreEqual(dt.Year, first.Year); - Assert.AreEqual(dt.Month, first.Month); - Assert.AreEqual(1, first.Day); - } - - /// - /// Tests for . - /// - [TestMethod] - public void Last() - { - { - var dt = new DateTime(2019, 12, 1); - var last = dt.Last(DayOfWeek.Wednesday); - - Assert.AreEqual(dt.Year, last.Year); - Assert.AreEqual(dt.Month, last.Month); - Assert.AreEqual(25, last.Day); - } - - { - var dt = new DateTime(2020, 4, 14); - var last = dt.Last(DayOfWeek.Friday); - - Assert.AreEqual(dt.Year, last.Year); - Assert.AreEqual(dt.Month, last.Month); - Assert.AreEqual(24, last.Day); - - last = dt.Last(DayOfWeek.Thursday); - Assert.AreEqual(dt.Year, last.Year); - Assert.AreEqual(dt.Month, last.Month); - Assert.AreEqual(30, last.Day); - } - } - - /// - /// Tests for . - /// - [TestMethod] - public void LastDayOfMonth() - { - var dt = new DateTime(2016, 2, 4); - var last = dt.LastDayOfMonth(); - - Assert.AreEqual(dt.Year, last.Year); - Assert.AreEqual(dt.Month, last.Month); - Assert.AreEqual(29, last.Day); // 2016 is a leap year - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToUnixTimestamp() - { - var dt = new DateTime(2015, 10, 21, 1, 0, 0, DateTimeKind.Utc); - var unix = dt.ToUnixTimeStamp(); - - Assert.AreEqual(1445389200L, unix); - } - } -} diff --git a/X10D.Tests/src/Core/DictionaryTests.cs b/X10D.Tests/src/Core/DictionaryTests.cs deleted file mode 100644 index 983fc9b..0000000 --- a/X10D.Tests/src/Core/DictionaryTests.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace X10D.Tests.Core -{ - using System.Collections.Generic; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class DictionaryTests - { - /// - /// Tests for . - /// - [TestMethod] - public void ToConnectionString() - { - var dictionary = new Dictionary - { - { "username", "Foo" }, { "password", "Foo Bar" }, { "port", 3306 }, - }; - - var connectionString = dictionary.ToConnectionString(); - Assert.AreEqual("username=Foo;password=\"Foo Bar\";port=3306", connectionString); - } - - /// - /// Tests for . - /// - [TestMethod] - public void ToGetParameters() - { - var dictionary = new Dictionary - { - { "username", "Foo" }, { "password", "Foo Bar" }, { "port", 3306 }, - }; - - var getParameterString = dictionary.ToGetParameters(); - Assert.AreEqual("username=Foo&password=Foo+Bar&port=3306", getParameterString); - } - } -} diff --git a/X10D.Tests/src/Core/DoubleTests.cs b/X10D.Tests/src/Core/DoubleTests.cs deleted file mode 100644 index 9990370..0000000 --- a/X10D.Tests/src/Core/DoubleTests.cs +++ /dev/null @@ -1,84 +0,0 @@ -namespace X10D.Tests.Core -{ - using System; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class DoubleTests - { - /// - /// Tests for . - /// - [TestMethod] - public void Clamp() - { - Assert.AreEqual(2.0, 3.0.Clamp(1.0, 2.0)); - Assert.AreEqual(1.0, (-3.0).Clamp(1.0, 2.0)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void DegreesToRadians() - { - Assert.AreEqual(Math.PI, 180.0.DegreesToRadians()); - Assert.AreEqual(Math.PI * 1.5, 270.0.DegreesToRadians()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void GetBytes() - { - CollectionAssert.AreEqual( - new byte[] { 0x18, 0x2D, 0x44, 0x54, 0xFB, 0x21, 0x09, 0x40 }, - Math.PI.GetBytes()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void IsEven() - { - Assert.IsTrue(2.0.IsEven()); - Assert.IsFalse(1.0.IsEven()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void IsOdd() - { - Assert.IsFalse(2.0.IsOdd()); - Assert.IsTrue(1.0.IsOdd()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void RadiansToDegrees() - { - Assert.AreEqual(180.0, Math.PI.RadiansToDegrees()); - Assert.AreEqual(360.0, (2.0 * Math.PI).RadiansToDegrees()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void Round() - { - Assert.AreEqual(5.0, 3.5.Round(5)); - Assert.AreEqual(5.0, 7.0.Round(5)); - Assert.AreEqual(10.0, 7.5.Round(5)); - } - } -} diff --git a/X10D.Tests/src/Core/EnumerableTests.cs b/X10D.Tests/src/Core/EnumerableTests.cs deleted file mode 100644 index 6da9ac3..0000000 --- a/X10D.Tests/src/Core/EnumerableTests.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace X10D.Tests.Core -{ - using System.Collections.Generic; - using System.Linq; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class EnumerableTests - { - /// - /// Tests for using an array of . - /// - [TestMethod] - public void SplitByte() - { - byte[] foo = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; - IEnumerable> chunks = foo.Split(2).ToArray(); - - Assert.AreEqual(4, chunks.Count()); - CollectionAssert.AreEqual(new byte[] { 0x01, 0x02 }, chunks.ElementAt(0).ToList()); - CollectionAssert.AreEqual(new byte[] { 0x03, 0x04 }, chunks.ElementAt(1).ToList()); - CollectionAssert.AreEqual(new byte[] { 0x05, 0x06 }, chunks.ElementAt(2).ToList()); - CollectionAssert.AreEqual(new byte[] { 0x07, 0x08 }, chunks.ElementAt(3).ToList()); - - // test exceeding chunk size - chunks = foo.Split(foo.Length + 10).ToArray(); - Assert.AreEqual(1, chunks.Count()); - CollectionAssert.AreEqual(foo, chunks.SelectMany(c => c).ToList()); - } - - /// - /// Tests for using an array of . - /// - [TestMethod] - public void SplitInt32() - { - int[] foo = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; - IEnumerable> chunks = foo.Split(2).ToArray(); - - Assert.AreEqual(4, chunks.Count()); - CollectionAssert.AreEqual(new[] { 0x01, 0x02 }, chunks.ElementAt(0).ToList()); - CollectionAssert.AreEqual(new[] { 0x03, 0x04 }, chunks.ElementAt(1).ToList()); - CollectionAssert.AreEqual(new[] { 0x05, 0x06 }, chunks.ElementAt(2).ToList()); - CollectionAssert.AreEqual(new[] { 0x07, 0x08 }, chunks.ElementAt(3).ToList()); - - // test exceeding chunk size - chunks = foo.Split(foo.Length + 10).ToArray(); - Assert.AreEqual(1, chunks.Count()); - CollectionAssert.AreEqual(foo, chunks.SelectMany(c => c).ToList()); - } - } -} diff --git a/X10D.Tests/src/Core/ReflectionTests.cs b/X10D.Tests/src/Core/ReflectionTests.cs deleted file mode 100644 index b182a4b..0000000 --- a/X10D.Tests/src/Core/ReflectionTests.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace X10D.Tests.Core -{ - using System; - using System.ComponentModel; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class ReflectionTests - { - /// - /// Test for . - /// - [TestMethod] - public void GetDefaultValue() - { - var klass = new TestClass(); - - foreach (var property in klass.GetType().GetProperties()) - { - Assert.AreEqual("Foo", property.GetDefaultValue()); - } - } - - /// - /// Test for . - /// - [TestMethod] - public void GetDescription() - { - var klass = new TestClass(); - - foreach (var property in klass.GetType().GetProperties()) - { - Assert.AreEqual("Test description", property.GetDescription()); - } - } - - /// - /// Test for . - /// - [TestMethod] - public void SelectFromCustomAttribute() - { - var klass = new TestClass(); - - foreach (var property in klass.GetType().GetProperties()) - { - var value = property.SelectFromCustomAttribute(a => a.TestValue); - Assert.AreEqual("Bar", value); - } - } - - [AttributeUsage(AttributeTargets.Property)] - private sealed class TestAttribute : Attribute - { - public string TestValue { get; set; } - } - - private sealed class TestClass - { - [System.ComponentModel.Description("Test description")] - [DefaultValue("Foo")] - [Test(TestValue = "Bar")] - public string TestProperty { get; set; } - } - } -} diff --git a/X10D.Tests/src/Core/StringTests.cs b/X10D.Tests/src/Core/StringTests.cs deleted file mode 100644 index 32d6fb4..0000000 --- a/X10D.Tests/src/Core/StringTests.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace X10D.Tests.Core -{ - using System.Linq; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class StringTests - { - /// - /// Tests for . - /// - [TestMethod] - public void Repeat() - { - Assert.AreEqual("foofoofoofoofoo", "foo".Repeat(5)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void Split() - { - const string str = "Hello World"; - - // ReSharper disable once SuggestVarOrType_Elsewhere - var arr = str.Split(2).ToArray(); - CollectionAssert.AreEqual(new[] { "He", "ll", "o ", "Wo", "rl", "d" }, arr); - } - } -} diff --git a/X10D.Tests/src/Core/TimeSpanParserTests.cs b/X10D.Tests/src/Core/TimeSpanParserTests.cs deleted file mode 100644 index bbbb5e7..0000000 --- a/X10D.Tests/src/Core/TimeSpanParserTests.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace X10D.Tests.Core -{ - using System; - using Microsoft.VisualStudio.TestTools.UnitTesting; - - /// - /// Tests for . - /// - [TestClass] - public class TimeSpanParserTests - { - /// - /// Tests for . - /// - [TestMethod] - public void TestParser() - { - Assert.AreEqual(TimeSpan.FromHours(3), "3h".ToTimeSpan()); - Assert.AreEqual(TimeSpan.FromMinutes(2.5), "2.5m".ToTimeSpan()); - Assert.AreEqual(TimeSpan.FromHours(1), "60m".ToTimeSpan()); - Assert.AreEqual(TimeSpan.FromDays(1), "1d".ToTimeSpan()); - Assert.AreEqual(TimeSpan.FromDays(8), "1w 1d".ToTimeSpan()); - Assert.AreEqual(TimeSpan.FromDays(8), "1w1d".ToTimeSpan()); - } - } -} diff --git a/X10D.Tests/src/Unity/Vector3Tests.cs b/X10D.Tests/src/Unity/Vector3Tests.cs deleted file mode 100644 index 2e02cf0..0000000 --- a/X10D.Tests/src/Unity/Vector3Tests.cs +++ /dev/null @@ -1,93 +0,0 @@ -namespace X10D.Tests.Unity -{ - using Microsoft.VisualStudio.TestTools.UnitTesting; - using UnityEngine; - using X10D.Unity; - - /// - /// Tests for . - /// - [TestClass] - public class Vector3Tests - { - /// - /// Tests for by rounding to the nearest 0.5. - /// - [TestMethod] - public void TestRoundHalf() - { - var vector = new Vector3(1.8f, 2.1f, 3.37f); - Assert.AreEqual(new Vector3(2, 2, 3.5f), vector.Round(0.5f)); - } - - /// - /// Tests for by rounding to the nearest integer. - /// - [TestMethod] - public void TestRoundInteger() - { - var vector = new Vector3(1.8f, 2.1f, 3.37f); - Assert.AreEqual(new Vector3(2, 2, 3), vector.Round()); - } - - /// - /// Tests for . - /// - [TestMethod] - public void TestWithX() - { - var vector = new Vector3(1, 2, 3); - Assert.AreEqual(new Vector3(4, 2, 3), vector.WithX(4)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void TestWithXY() - { - var vector = new Vector3(1, 2, 3); - Assert.AreEqual(new Vector3(8, 10, 3), vector.WithXY(8, 10)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void TestWithXZ() - { - var vector = new Vector3(1, 2, 3); - Assert.AreEqual(new Vector3(8, 2, 10), vector.WithXZ(8, 10)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void TestWithY() - { - var vector = new Vector3(1, 2, 3); - Assert.AreEqual(new Vector3(1, 4, 3), vector.WithY(4)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void TestWithYZ() - { - var vector = new Vector3(1, 2, 3); - Assert.AreEqual(new Vector3(1, 8, 10), vector.WithYZ(8, 10)); - } - - /// - /// Tests for . - /// - [TestMethod] - public void TestWithZ() - { - var vector = new Vector3(1, 2, 3); - Assert.AreEqual(new Vector3(1, 2, 4), vector.WithZ(4)); - } - } -} diff --git a/X10D.Unity.dll b/X10D.Unity.dll new file mode 100644 index 0000000000000000000000000000000000000000..f7f9bee0d4787bac8188a2f0558e403cefad36c9 GIT binary patch literal 9216 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 L?;Q9)%fSBt>=GAw literal 0 HcmV?d00001 diff --git a/X10D.Unity/X10D.Unity.csproj b/X10D.Unity/X10D.Unity.csproj deleted file mode 100644 index 1f9582e..0000000 --- a/X10D.Unity/X10D.Unity.csproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - netstandard2.0 - 8.0 - Oliver Booth - en - true - https://github.com/oliverbooth/X10D - git - Extension methods on crack. - LICENSE.md - icon.png - - dotnet extension-methods unity - 2.2.0 - ..\X10D.ruleset - true - 2.5.0 - 2.5.0 - 2.5.0 - - - - - True - - - - True - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - - - - - - - - - - True - True - Resource.resx - - - - - - ResXFileCodeGenerator - Resource.Designer.cs - - - - \ No newline at end of file diff --git a/X10D.Unity/src/BetterBehavior.cs b/X10D.Unity/src/BetterBehavior.cs deleted file mode 100644 index 6069676..0000000 --- a/X10D.Unity/src/BetterBehavior.cs +++ /dev/null @@ -1,107 +0,0 @@ -namespace X10D.Unity -{ - using System.Diagnostics.CodeAnalysis; - using System.Threading.Tasks; - using UnityEngine; - - /// - /// Represents a class which inherits to offer wider functionality. - /// - [SuppressMessage("ReSharper", "MemberCanBePrivate.Global", Justification = "Unity property")] - [SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Global", Justification = "Unity property")] - [SuppressMessage("ReSharper", "SA1300", Justification = "Unity API-compliant property")] - [SuppressMessage("ReSharper", "CA2007", Justification = "Unnecessary")] - [SuppressMessage("ReSharper", "RCS1090", Justification = "Unnecessary")] - [SuppressMessage("ReSharper", "RCS1213", Justification = "Unity method")] - [SuppressMessage("ReSharper", "UnusedParameter.Global", Justification = "Override method")] - public abstract class BetterBehavior : MonoBehaviour - { - /// - /// Gets the component attached to this object. - /// - public new Transform transform { get; private set; } - - /// - /// Awake is called when the script instance is being loaded. - /// - protected virtual void Awake() - { - this.transform = this.GetComponent(); - } - - /// - /// Frame-rate independent messaging for physics calculations. - /// - /// A snapshot of timing values. - protected virtual void OnFixedUpdate(in GameTime gameTime) - { - } - - /// - /// Frame-rate independent messaging for physics calculations. - /// - /// A snapshot of timing values. - /// Returns a task representing the result of the operation. - protected virtual Task OnFixedUpdateAsync(GameTime gameTime) - { - return Task.CompletedTask; - } - - /// - /// Called once per frame, after all Update calls. - /// - /// A snapshot of timing values. - protected virtual void OnLateUpdate(in GameTime gameTime) - { - } - - /// - /// Called once per frame, after all Update calls. - /// - /// A snapshot of timing values. - /// Returns a task representing the result of the operation. - protected virtual Task OnLateUpdateAsync(GameTime gameTime) - { - return Task.CompletedTask; - } - - /// - /// Called once per frame. - /// - /// A snapshot of timing values. - protected virtual void OnUpdate(in GameTime gameTime) - { - } - - /// - /// Called once per frame. - /// - /// A snapshot of timing values. - /// Returns a task representing the result of the operation. - protected virtual Task OnUpdateAsync(GameTime gameTime) - { - return Task.CompletedTask; - } - - private async void FixedUpdate() - { - var time = GameTime.CreateFromCurrentTimes(); - this.OnFixedUpdate(time); - await this.OnFixedUpdateAsync(time); - } - - private async void LateUpdate() - { - var time = GameTime.CreateFromCurrentTimes(); - this.OnLateUpdate(time); - await this.OnLateUpdateAsync(time); - } - - private async void Update() - { - var time = GameTime.CreateFromCurrentTimes(); - this.OnUpdate(time); - await this.OnUpdateAsync(time); - } - } -} diff --git a/X10D.Unity/src/GameObjectExtensions.cs b/X10D.Unity/src/GameObjectExtensions.cs deleted file mode 100644 index 3341e87..0000000 --- a/X10D.Unity/src/GameObjectExtensions.cs +++ /dev/null @@ -1,64 +0,0 @@ -namespace X10D.Unity -{ - using System; - using JetBrains.Annotations; - using UnityEngine; - - /// - /// Extension methods for . - /// - public static class GameObjectExtensions - { - /// - /// Rotates the component on the current such that is is facing another - /// . - /// - /// The current game object. - /// The target. - /// - /// is null - /// - or - - /// is null. - /// - public static void LookAt([NotNull] this GameObject gameObject, [NotNull] GameObject other) - { - if (gameObject is null) - { - throw new ArgumentNullException(nameof(gameObject)); - } - - if (other is null) - { - throw new ArgumentNullException(nameof(other)); - } - - gameObject.LookAt(other.transform); - } - - /// - /// Rotates the component on the current such that is is facing another - /// . - /// - /// The current game object. - /// The target. - /// - /// is null - /// - or - - /// is null. - /// - public static void LookAt([NotNull] this GameObject gameObject, [NotNull] Transform other) - { - if (gameObject is null) - { - throw new ArgumentNullException(nameof(gameObject)); - } - - if (other is null) - { - throw new ArgumentNullException(nameof(other)); - } - - gameObject.transform.LookAt(other); - } - } -} diff --git a/X10D.Unity/src/GameTime.cs b/X10D.Unity/src/GameTime.cs deleted file mode 100644 index f59a6df..0000000 --- a/X10D.Unity/src/GameTime.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace X10D.Unity -{ - using System; - using UnityEngine; - - /// - /// Represents a struct which contains game timing information. - /// - public readonly struct GameTime - { - private GameTime(float totalTime, float deltaTime, float fixedDeltaTime, int frameCount, float timeScale) - { - this.TotalTime = TimeSpan.FromSeconds(totalTime); - this.DeltaTime = TimeSpan.FromSeconds(deltaTime); - this.FixedDeltaTime = TimeSpan.FromSeconds(fixedDeltaTime); - this.FrameCount = frameCount; - this.TimeScale = timeScale; - } - - /// - /// Gets the time since the last frame was rendered. - /// - public TimeSpan DeltaTime { get; } - - /// - /// Gets the time since the last physics time step. - /// - public TimeSpan FixedDeltaTime { get; } - - /// - /// Gets the total number of frames which have been rendered. - /// - public int FrameCount { get; } - - /// - /// Gets the total time for which the game has been running. - /// - public TimeSpan TotalTime { get; } - - /// - /// Gets the time scale. - /// - public float TimeScale { get; } - - /// - /// Creates a new instance of the struct by creating a snapshot of values offered by . - /// - /// An instance of . - public static GameTime CreateFromCurrentTimes() - { - return new GameTime(Time.time, Time.deltaTime, Time.fixedDeltaTime, Time.frameCount, Time.timeScale); - } - } -} diff --git a/X10D.Unity/src/TransformExtensions.cs b/X10D.Unity/src/TransformExtensions.cs deleted file mode 100644 index 6cdb7e3..0000000 --- a/X10D.Unity/src/TransformExtensions.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace X10D.Unity -{ - using System; - using JetBrains.Annotations; - using UnityEngine; - - /// - /// Extension methods for . - /// - public static class TransformExtensions - { - /// - /// Rotates the current such that is is facing another . - /// - /// The current transform. - /// The target. - /// - /// is null - /// - or - - /// is null. - /// - public static void LookAt([NotNull] this Transform transform, [NotNull] GameObject other) - { - if (transform is null) - { - throw new ArgumentNullException(nameof(transform)); - } - - if (other is null) - { - throw new ArgumentNullException(nameof(other)); - } - - transform.LookAt(other.transform); - } - } -} diff --git a/X10D.Unity/src/Vector3Extensions.cs b/X10D.Unity/src/Vector3Extensions.cs deleted file mode 100644 index 3f9b1eb..0000000 --- a/X10D.Unity/src/Vector3Extensions.cs +++ /dev/null @@ -1,111 +0,0 @@ -namespace X10D.Unity -{ - using UnityEngine; - - /// - /// Extension methods for . - /// - public static class Vector3Extensions - { - /// - /// Rounds a by calling on each of the components. - /// - /// The vector to round. - /// The nearest value. - /// rounded to the nearest . - public static Vector3 Round(this Vector3 vector, float nearest = 1) - { - return new Vector3(vector.x.Round(nearest), vector.y.Round(nearest), vector.z.Round(nearest)); - } - - /// - /// Returns a vector whose Y and Z components match that of a provided vector, and sets the X component to a provided value. - /// - /// The input vector. - /// The new X value. - /// - /// Returns a whose Y and Z components match that of , - /// but with the component set to . - /// - public static Vector3 WithX(this Vector3 vector, float x) - { - return new Vector3(x, vector.y, vector.z); - } - - /// - /// Returns a vector whose Z component matches that of a provided vector, and sets the X and Y components to provided values. - /// - /// The input vector. - /// The new X value. - /// The new Y value. - /// - /// Returns a whose Z component matches that of , - /// but with the and components set to and - /// respectively. - /// - public static Vector3 WithXY(this Vector3 vector, float x, float y) - { - return new Vector3(x, y, vector.z); - } - - /// - /// Returns a vector whose Y component matches that of a provided vector, and sets the X and Z components to provided values. - /// - /// The input vector. - /// The new X value. - /// The new Z value. - /// - /// Returns a whose Y component matches that of , - /// but with the and components set to and - /// respectively. - /// - public static Vector3 WithXZ(this Vector3 vector, float x, float z) - { - return new Vector3(x, vector.y, z); - } - - /// - /// Returns a vector whose X and Z components match that of a provided vector, and sets the Y component to a provided value. - /// - /// The input vector. - /// The new Y value. - /// - /// Returns a whose X and Z components match that of , - /// but with the component set to . - /// - public static Vector3 WithY(this Vector3 vector, float y) - { - return new Vector3(vector.x, y, vector.z); - } - - /// - /// Returns a vector whose X component matches that of a provided vector, and sets the Y and Z components to provided values. - /// - /// The input vector. - /// The new Y value. - /// The new Z value. - /// - /// Returns a whose X component matches that of , - /// but with the and components set to and - /// respectively. - /// - public static Vector3 WithYZ(this Vector3 vector, float y, float z) - { - return new Vector3(vector.x, y, z); - } - - /// - /// Returns a vector whose X and Y components match that of a provided vector, and sets the Z component to a provided value. - /// - /// The input vector. - /// The new Z value. - /// - /// Returns a whose X and Y components match that of , - /// but with the component set to . - /// - public static Vector3 WithZ(this Vector3 vector, float z) - { - return new Vector3(vector.x, vector.y, z); - } - } -} diff --git a/X10D.dll b/X10D.dll new file mode 100644 index 0000000000000000000000000000000000000000..5588877631eb55d9feb68f076595e0761a9740e8 GIT binary patch literal 26112 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 Tb-TY+b`*z>|Nr`b&jbGfVXc&E literal 0 HcmV?d00001 diff --git a/X10D.sln b/X10D.sln deleted file mode 100644 index d20ed46..0000000 --- a/X10D.sln +++ /dev/null @@ -1,42 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28902.138 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "X10D", "X10D\X10D.csproj", "{4A8CC062-8B82-4625-B3CC-7DBEAB2AF149}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "X10D.Tests", "X10D.Tests\X10D.Tests.csproj", "{DF228EA2-D8EC-4A40-8917-E1E62E3B7D8E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FF6E59AB-1A23-4981-834C-47BEB5A46DC1}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X10D.Unity", "X10D.Unity\X10D.Unity.csproj", "{C21ABC58-68D6-4CA0-9CE6-A2E96C5E89AE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4A8CC062-8B82-4625-B3CC-7DBEAB2AF149}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A8CC062-8B82-4625-B3CC-7DBEAB2AF149}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A8CC062-8B82-4625-B3CC-7DBEAB2AF149}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A8CC062-8B82-4625-B3CC-7DBEAB2AF149}.Release|Any CPU.Build.0 = Release|Any CPU - {DF228EA2-D8EC-4A40-8917-E1E62E3B7D8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF228EA2-D8EC-4A40-8917-E1E62E3B7D8E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF228EA2-D8EC-4A40-8917-E1E62E3B7D8E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF228EA2-D8EC-4A40-8917-E1E62E3B7D8E}.Release|Any CPU.Build.0 = Release|Any CPU - {C21ABC58-68D6-4CA0-9CE6-A2E96C5E89AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C21ABC58-68D6-4CA0-9CE6-A2E96C5E89AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C21ABC58-68D6-4CA0-9CE6-A2E96C5E89AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C21ABC58-68D6-4CA0-9CE6-A2E96C5E89AE}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {6F733785-8837-410C-BD91-C4AD1F0A6914} - EndGlobalSection -EndGlobal diff --git a/X10D/README.md b/X10D/README.md deleted file mode 100644 index 3596d22..0000000 --- a/X10D/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# X10D - -## About -The X10D library contains extension methods for standard .NET library types. - -## Extended Classes -Below is a list of the number of extension methods written for a given type. Overloaded methods are not counted. - -| Type | Library | Method count | -| :--- | :--- | :--- | -| `bool` | `X10D` | 1 | -| `byte` / `byte[]` | `X10D` | 8 | -| `char` | `X10D` | 1 | -| `IComparable` | `X10D` | 1 | -| `IConvertible` | `X10D` | 4 | -| `DateTime` | `X10D` | 11 | -| `EndPoint` | `X10D` | 2 | -| `double` | `X10D` | 7 | -| `enum` | `X10D` | 2 | -| `float` | `X10D` | 7 | -| `short` / `ushort` | `X10D` | 11 | -| `int` / `uint` | `X10D` | 25 | -| `long` / `ulong` | `X10D` | 13 | -| `IList` | `X10D` | 2 | -| `Random` | `X10D` | 2 | -| `string` / `SecureString` | `X10D` | 8 | -| `Dictionary` | `X10D` | 2 | \ No newline at end of file diff --git a/X10D/Resource.Designer.cs b/X10D/Resource.Designer.cs deleted file mode 100644 index 02e56e9..0000000 --- a/X10D/Resource.Designer.cs +++ /dev/null @@ -1,81 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace X10D { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resource { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resource() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("X10D.Resource", typeof(Resource).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Must specify valid information for parsing in the string.. - /// - internal static string EnumParseEmptyStringException { - get { - return ResourceManager.GetString("EnumParseEmptyStringException", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type provided must be an Enum.. - /// - internal static string EnumParseNotEnumException { - get { - return ResourceManager.GetString("EnumParseNotEnumException", resourceCulture); - } - } - } -} diff --git a/X10D/Resource.resx b/X10D/Resource.resx deleted file mode 100644 index 3a48c16..0000000 --- a/X10D/Resource.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Must specify valid information for parsing in the string. - - - Type provided must be an Enum. - - \ No newline at end of file diff --git a/X10D/X10D.csproj b/X10D/X10D.csproj deleted file mode 100644 index a2e63c9..0000000 --- a/X10D/X10D.csproj +++ /dev/null @@ -1,65 +0,0 @@ - - - - netstandard2.0 - 8.0 - Oliver Booth - en - true - https://github.com/oliverbooth/X10D - git - Extension methods on crack. - LICENSE.md - icon.png - - dotnet extension-methods - 2.2.0 - ..\X10D.ruleset - true - 2.5.0 - 2.5.0 - 2.5.0 - - - - - True - - - - True - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - True - True - Resource.resx - - - - - - ResXFileCodeGenerator - Resource.Designer.cs - - - - \ No newline at end of file diff --git a/X10D/src/Assembly.cs b/X10D/src/Assembly.cs deleted file mode 100644 index 8c11453..0000000 --- a/X10D/src/Assembly.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System; - -[assembly: CLSCompliant(true)] diff --git a/X10D/src/BooleanExtensions.cs b/X10D/src/BooleanExtensions.cs deleted file mode 100644 index fbdab76..0000000 --- a/X10D/src/BooleanExtensions.cs +++ /dev/null @@ -1,145 +0,0 @@ -namespace X10D -{ - /// - /// Extension methods for . - /// - public static class BooleanExtensions - { - /// - /// Performs logical AND on this and another . - /// - /// The boolean. - /// The boolean comparator. - /// - /// Returns if AND - /// evaluate to , or otherwise. - /// - public static bool And(this bool value, bool comparison) - { - return value && comparison; - } - - /// - /// Performs logical NAND on this and another . - /// - /// The boolean. - /// The boolean comparator. - /// - /// Returns if NAND - /// evaluate to , or otherwise. - /// - public static bool NAnd(this bool value, bool comparison) - { - return !(value && comparison); - } - - /// - /// Performs logical NOR on this and another . - /// - /// The boolean. - /// The boolean comparator. - /// - /// Returns if NOR - /// evaluate to , or otherwise. - /// - public static bool NOr(this bool value, bool comparison) - { - return !(value || comparison); - } - - /// - /// Performs logical NOT on this . - /// - /// The boolean. - /// - /// Returns if is , - /// or otherwise. - /// - public static bool Not(this bool value) - { - return !value; - } - - /// - /// Performs logical OR on this and another . - /// - /// The boolean. - /// The boolean comparator. - /// - /// Returns if OR - /// evaluate to , or otherwise. - /// - public static bool Or(this bool value, bool comparison) - { - return value || comparison; - } - - /// - /// Gets the value of this boolean as represented by . - /// - /// The boolean. - /// Returns 1 if is , or 0 otherwise. - public static byte ToByte(this bool value) - { - return (byte)value.ToInt32(); - } - - /// - /// Gets the value of this boolean as represented by . - /// - /// The boolean. - /// Returns 1 if is , or 0 otherwise. - public static short ToInt16(this bool value) - { - return (short)value.ToInt32(); - } - - /// - /// Gets the value of this boolean as represented by . - /// - /// The boolean. - /// Returns 1 if is , or 0 otherwise. - public static int ToInt32(this bool value) - { - return value ? 1 : 0; - } - - /// - /// Gets the value of this boolean as represented by . - /// - /// The boolean. - /// Returns 1 if is , 0 otherwise. - public static long ToInt64(this bool value) - { - return value.ToInt32(); - } - - /// - /// Performs logical XNOR on this and another . - /// - /// The boolean. - /// The boolean comparator. - /// - /// Returns if XNOR - /// evaluate to , or otherwise. - /// - public static bool XNOr(this bool value, bool comparison) - { - return !(value ^ comparison); - } - - /// - /// Performs logical XOR on this and another . - /// - /// The boolean. - /// The boolean comparator. - /// - /// Returns if XOR - /// evaluate to , or otherwise. - /// - public static bool XOr(this bool value, bool comparison) - { - return value ^ comparison; - } - } -} diff --git a/X10D/src/ByteExtensions.cs b/X10D/src/ByteExtensions.cs deleted file mode 100644 index dd1f634..0000000 --- a/X10D/src/ByteExtensions.cs +++ /dev/null @@ -1,116 +0,0 @@ -namespace X10D -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; - - /// - /// Extension methods for . - /// - public static class ByteExtensions - { - /// - /// Gets a literally representing the raw values in the []. - /// - /// The bytes to get. - /// Returns a . - public static string AsString(this IEnumerable bytes) - { - return BitConverter.ToString(bytes.ToArray()); - } - - /// - /// Converts the [] to an . - /// - /// The bytes to convert. - /// Returns an . - public static short GetInt16(this IEnumerable bytes) - { - return BitConverter.ToInt16(bytes.ToArray(), 0); - } - - /// - /// Converts the [] to an . - /// - /// The bytes to convert. - /// Returns an . - public static int GetInt32(this IEnumerable bytes) - { - return BitConverter.ToInt32(bytes.ToArray(), 0); - } - - /// - /// Converts the [] to an . - /// - /// The bytes to convert. - /// Returns an . - public static long GetInt64(this IEnumerable bytes) - { - return BitConverter.ToInt64(bytes.ToArray(), 0); - } - - /// - /// Gets a representing the value the [] with - /// encoding. - /// - /// The bytes to convert. - /// Returns a . - public static string GetString(this IEnumerable bytes) - { - return bytes.GetString(Encoding.UTF8); - } - - /// - /// Gets a representing the value the [] with the provided encoding. - /// - /// The bytes to convert. - /// The encoding to use. - /// Returns a . - /// is . - public static string GetString(this IEnumerable bytes, Encoding encoding) - { - if (encoding is null) - { - throw new ArgumentNullException(nameof(encoding)); - } - - // ReSharper disable once SuggestVarOrType_Elsewhere - var array = bytes.ToArray(); - return encoding.GetString(array, 0, array.Length); - } - - /// - /// Converts the [] to a . - /// - /// The bytes to convert. - /// Returns an . - [CLSCompliant(false)] - public static ushort GetUInt16(this IEnumerable bytes) - { - return BitConverter.ToUInt16(bytes.ToArray(), 0); - } - - /// - /// Converts the [] to an . - /// - /// The bytes to convert. - /// Returns an . - [CLSCompliant(false)] - public static uint GetUInt32(this IEnumerable bytes) - { - return BitConverter.ToUInt32(bytes.ToArray(), 0); - } - - /// - /// Converts the [] to an . - /// - /// The bytes to convert. - /// Returns an . - [CLSCompliant(false)] - public static ulong GetUInt64(this IEnumerable bytes) - { - return BitConverter.ToUInt64(bytes.ToArray(), 0); - } - } -} diff --git a/X10D/src/CharExtensions.cs b/X10D/src/CharExtensions.cs deleted file mode 100644 index cbdd49e..0000000 --- a/X10D/src/CharExtensions.cs +++ /dev/null @@ -1,90 +0,0 @@ -namespace X10D -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; - - /// - /// Extension methods for . - /// - public static class CharExtensions - { - /// - /// Generates a new random string by filling it with characters found in . - /// - /// The character set. - /// The length of the string to generate. - /// Returns a containing characters. - public static string Random(this char[] chars, int length) - { - return chars.Random(length, RandomExtensions.Random); - } - - /// - /// Generates a new random string by filling it with characters found in . - /// - /// The character set. - /// The length of the string to generate. - /// The instance. - /// Returns a containing characters. - /// is . - public static string Random(this char[] chars, int length, Random random) - { - if (chars is null) - { - throw new ArgumentNullException(nameof(chars)); - } - - if (random is null) - { - throw new ArgumentNullException(nameof(random)); - } - - var builder = new StringBuilder(length); - for (var i = 0; i < length; i++) - { - builder.Append(chars[random.Next(0, chars.Length)]); - } - - return builder.ToString(); - } - - /// - /// Generates a new random string by filling it with characters found in . - /// - /// The character set. - /// The length of the string to generate. - /// Returns a containing characters. - public static string Random(this IEnumerable chars, int length) - { - return chars.Random(length, RandomExtensions.Random); - } - - /// - /// Generates a new random string by filling it with characters found in . - /// - /// The character set. - /// The length of the string to generate. - /// The instance. - /// Returns a containing characters. - public static string Random(this IEnumerable chars, int length, Random random) - { - return chars.ToArray().Random(length, random); - } - - /// - /// Repeats a character a specified number of times. - /// - /// The character to repeat. - /// The repeat count. - /// - /// Returns a whose value is repeated - /// times. - /// - public static string Repeat(this char c, int count) - { - return new string(c, count); - } - } -} diff --git a/X10D/src/ComparableExtensions.cs b/X10D/src/ComparableExtensions.cs deleted file mode 100644 index 798112b..0000000 --- a/X10D/src/ComparableExtensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for . - /// - public static class ComparableExtensions - { - /// - /// Determines if is between and . - /// - /// The comparable type. - /// The value to compare. - /// The exclusive lower bound. - /// The exclusive upper bound. - /// - /// Returns if the value is between the bounds, - /// otherwise. - /// - public static bool Between(this T actual, T lower, T upper) - where T : IComparable - { - return actual.CompareTo(lower) > 0 && actual.CompareTo(upper) < 0; - } - } -} diff --git a/X10D/src/ConvertibleExtensions.cs b/X10D/src/ConvertibleExtensions.cs deleted file mode 100644 index bf2a3ce..0000000 --- a/X10D/src/ConvertibleExtensions.cs +++ /dev/null @@ -1,161 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for . - /// - public static class ConvertibleExtensions - { - /// - /// Converts the object to another type. - /// - /// The type to convert to. - /// The object to convert. - /// An object that supplies culture-specific formatting information. - /// Returns the value converted to . - /// - /// This conversion is not supported. - /// -or- - /// is and is a value type. - /// - [CLSCompliant(false)] - public static T To(this IConvertible value, IFormatProvider provider = null) - { - if (value is null) - { - return default; - } - - return (T)Convert.ChangeType(value, typeof(T), provider); - } - - /// - /// Converts the object to another type, returning the default value on failure. - /// - /// The type to convert to. - /// The object to convert. - /// The format provider. - /// Returns the value converted to . - /// This conversion is not supported. - [CLSCompliant(false)] - public static T ToOrDefault(this IConvertible value, IFormatProvider provider = null) - { - return value is null ? default : To(value, provider); - } - - /// - /// Converts the object to another type, returning the default value on failure. - /// - /// The type to convert to. - /// The object to convert. - /// The parameter where the result should be sent. - /// An object that supplies culture-specific formatting information. - /// Returns on success, on failure. - [CLSCompliant(false)] - public static bool ToOrDefault(this IConvertible value, out T newObj, IFormatProvider provider = null) - { - if (value is null) - { - newObj = default; - return false; - } - - try - { - newObj = To(value, provider); - return true; - } - catch (InvalidCastException) - { - newObj = default; - return false; - } - } - - /// - /// Converts the object to another type, returning on failure. - /// - /// The type to convert to. - /// The object to convert. - /// An object that supplies culture-specific formatting information. - /// Returns a or . - [CLSCompliant(false)] - public static T ToOrNull(this IConvertible value, IFormatProvider provider = null) - where T : class - { - return value.ToOrNull(out T v, provider) ? v : null; - } - - /// - /// Converts the object to another type, returning on failure. - /// - /// The type to convert to. - /// The object to convert. - /// The parameter where the result should be sent. - /// An object that supplies culture-specific formatting information. - /// Returns a or . - [CLSCompliant(false)] - public static bool ToOrNull(this IConvertible value, out T newObj, IFormatProvider provider = null) - where T : class - { - return ToOrOther(value, out newObj, null, provider); - } - - /// - /// Converts the object to another type, returning a different value on failure. - /// - /// The type to convert to. - /// The object to convert. - /// The backup value. - /// An object that supplies culture-specific formatting information. - /// Returns the value converted to . - [CLSCompliant(false)] - public static T ToOrOther(this IConvertible value, T other, IFormatProvider provider = null) - { - if (value is null) - { - return other; - } - - try - { - return To(value, provider); - } - catch (Exception ex) when (ex is InvalidCastException || ex is FormatException) - { - return other; - } - } - - /// - /// Converts the object to another type, returning a different value on failure. - /// - /// The type to convert to. - /// The object to convert. - /// The parameter where the result should be sent. - /// The backup value. - /// An object that supplies culture-specific formatting information. - /// Returns on success, on failure. - [CLSCompliant(false)] - public static bool ToOrOther(this IConvertible value, out T newObj, T other, IFormatProvider provider = null) - { - if (value is null) - { - newObj = other; - return false; - } - - try - { - newObj = To(value, provider); - return true; - } - catch (Exception ex) when (ex is InvalidCastException || ex is FormatException) - { - newObj = other; - return false; - } - } - } -} diff --git a/X10D/src/DateTimeExtensions.cs b/X10D/src/DateTimeExtensions.cs deleted file mode 100644 index 84a559d..0000000 --- a/X10D/src/DateTimeExtensions.cs +++ /dev/null @@ -1,124 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for . - /// - public static class DateTimeExtensions - { - /// - /// Returns a rounded integer of the number of years since a given date as of today. - /// - /// The date from which to start. - /// Returns the number of years since as of today. - public static int Age(this DateTime date) - { - return date.Age(DateTime.Today); - } - - /// - /// Returns a rounded integer of the number of years since a given date as of another given date. - /// - /// The date from which to start. - /// The date at which to stop counting. - /// - /// Returns the integer number of years since as of - /// . - /// - public static int Age(this DateTime date, DateTime asOf) - { - return (int)(((asOf.Date - TimeSpan.FromDays(1) - date.Date).TotalDays + 1) / 365.2425); - } - - /// - /// Gets a DateTime representing the first occurence of a specified day in the current month. - /// - /// The current day. - /// The current day of week. - /// Returns a date representing the first occurence of . - public static DateTime First(this DateTime current, DayOfWeek dayOfWeek) - { - var first = current.FirstDayOfMonth(); - - if (first.DayOfWeek != dayOfWeek) - { - first = first.Next(dayOfWeek); - } - - return first; - } - - /// - /// Gets a representing the first day in the current month. - /// - /// The current date. - /// Returns a date representing the first day of the month>. - public static DateTime FirstDayOfMonth(this DateTime current) - { - return current.AddDays(1 - current.Day); - } - - /// - /// Gets a representing the last specified day in the current month. - /// - /// The current date. - /// The current day of week. - /// Returns a date representing the final occurence of . - public static DateTime Last(this DateTime current, DayOfWeek dayOfWeek) - { - var last = current.LastDayOfMonth(); - var lastDayOfWeek = last.DayOfWeek; - - var diff = dayOfWeek - lastDayOfWeek; - var offset = diff > 0 ? diff - 7 : diff; - - return last.AddDays(offset); - } - - /// - /// Gets a representing the last day in the current month. - /// - /// The current date. - /// Returns a date representing the last day of the month>. - public static DateTime LastDayOfMonth(this DateTime current) - { - var daysInMonth = DateTime.DaysInMonth(current.Year, current.Month); - return new DateTime(current.Year, current.Month, daysInMonth); - } - - /// - /// Gets a representing the first date following the current date which falls on the - /// given day of the week. - /// - /// The current date. - /// The day of week for the next date to get. - /// Returns a date representing the next occurence of . - public static DateTime Next(this DateTime current, DayOfWeek dayOfWeek) - { - var offsetDays = dayOfWeek - current.DayOfWeek; - - if (offsetDays <= 0) - { - offsetDays += 7; - } - - return current.AddDays(offsetDays); - } - - /// - /// Converts the to a Unix timestamp. - /// - /// The instance. - /// - /// Optional. Whether or not the return value should be represented as milliseconds. - /// Defaults to . - /// - /// Returns a Unix timestamp representing the provided . - public static long ToUnixTimeStamp(this DateTime time, bool useMillis = false) - { - DateTimeOffset offset = time; - return useMillis ? offset.ToUnixTimeMilliseconds() : offset.ToUnixTimeSeconds(); - } - } -} diff --git a/X10D/src/DictionaryExtensions.cs b/X10D/src/DictionaryExtensions.cs deleted file mode 100644 index 8f12bee..0000000 --- a/X10D/src/DictionaryExtensions.cs +++ /dev/null @@ -1,101 +0,0 @@ -namespace X10D -{ - using System.Collections.Generic; - using System.Linq; - using System.Text.RegularExpressions; - using System.Web; - - /// - /// A set of extension methods for . - /// - public static class DictionaryExtensions - { - /// - /// Converts a to an object-relational-safe connection string. - /// - /// The key type. - /// The value type. - /// The dictionary. - /// Returns a representing the dictionary as a key=value; set. - public static string ToConnectionString(this IReadOnlyDictionary dictionary) - { - static string SanitizeValue(T value) - { - return value is string str && - Regex.IsMatch(str, "\\s") - ? $"\"{str}\"" - : value.ToString(); - } - - var strings = dictionary.Select(o => $"{o.Key}={SanitizeValue(o.Value)}"); - return string.Join(";", strings); - } - - /// - /// Converts a to an object-relational-safe connection string. - /// - /// The key type. - /// The value type. - /// The dictionary. - /// Returns a representing the dictionary as a key=value; set. - public static string ToConnectionString(this IDictionary dictionary) - { - return ((IReadOnlyDictionary)dictionary).ToConnectionString(); - } - - /// - /// Converts a to an object-relational-safe connection string. - /// - /// The key type. - /// The value type. - /// The dictionary. - /// Returns a representing the dictionary as a key=value; set. - public static string ToConnectionString(this Dictionary dictionary) - { - return ((IReadOnlyDictionary)dictionary).ToConnectionString(); - } - - /// - /// Converts an to a HTTP GET parameter string. - /// - /// The key type. - /// The value type. - /// The dictionary. - /// Returns a representing the dictionary as a key=value& set. - public static string ToGetParameters(this IReadOnlyDictionary dictionary) - { - static string Sanitize(KeyValuePair kvp) - { - var key = HttpUtility.UrlEncode(kvp.Key.ToString()); - var value = HttpUtility.UrlEncode(kvp.Value.ToString()); - return $"{key}={value}"; - } - - return string.Join("&", dictionary.Select(Sanitize)); - } - - /// - /// Converts an to a HTTP GET parameter string. - /// - /// The key type. - /// The value type. - /// The dictionary. - /// Returns a representing the dictionary as a key=value& set. - public static string ToGetParameters(this IDictionary dictionary) - { - return ((IReadOnlyDictionary)dictionary).ToGetParameters(); - } - - /// - /// Converts a to a HTTP GET parameter string. - /// - /// The key type. - /// The value type. - /// The dictionary. - /// Returns a representing the dictionary as a key=value& set. - public static string ToGetParameters(this Dictionary dictionary) - { - return ((IReadOnlyDictionary)dictionary).ToGetParameters(); - } - } -} diff --git a/X10D/src/DoubleExtensions.cs b/X10D/src/DoubleExtensions.cs deleted file mode 100644 index bd6e531..0000000 --- a/X10D/src/DoubleExtensions.cs +++ /dev/null @@ -1,93 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for . - /// - public static class DoubleExtensions - { - /// - /// Clamps a value between a minimum and a maximum value. - /// - /// The value to clamp. - /// The minimum value. - /// The maximum value. - /// - /// Returns if is greater than it, - /// if is less than it, - /// or itself otherwise. - /// - public static double Clamp(this double value, double min, double max) - { - return Math.Min(Math.Max(value, min), max); - } - - /// - /// Converts an angle from degrees to radians. - /// - /// The angle in degrees. - /// Returns in radians. - public static double DegreesToRadians(this double angle) - { - return (Math.PI * angle) / 180.0; - } - - /// - /// Converts the to a []. - /// - /// The number to convert. - /// Returns a []. - public static byte[] GetBytes(this double number) - { - return BitConverter.GetBytes(number); - } - - /// - /// Determines if the is even. - /// - /// The number. - /// - /// Returns if is even, - /// otherwise. - /// - public static bool IsEven(this double number) - { - return Math.Abs(number % 2.0) < double.Epsilon; - } - - /// - /// Determines if the is odd. - /// - /// The number. - /// - /// Returns if is odd, - /// otherwise. - /// - public static bool IsOdd(this double number) - { - return !number.IsEven(); - } - - /// - /// Converts an angle from radians to degrees. - /// - /// The angle in radians. - /// Returns in degrees. - public static double RadiansToDegrees(this double angle) - { - return angle * (180.0 / Math.PI); - } - - /// - /// Rounds to the nearest value. - /// - /// The value to round. - /// The nearest value. - /// Returns the rounded value. - public static double Round(this double v, double nearest = 1) - { - return Math.Round(v / nearest) * nearest; - } - } -} diff --git a/X10D/src/EndPointExtensions.cs b/X10D/src/EndPointExtensions.cs deleted file mode 100644 index 7da5099..0000000 --- a/X10D/src/EndPointExtensions.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace X10D -{ - using System.Net; - - /// - /// Extension methods for and derived types. - /// - public static class EndPointExtensions - { - /// - /// Gets the endpoint hostname. - /// - /// The endpoint whose hostname to get. - /// - /// Returns a representing the hostname, which may be an IP or a DNS, or empty - /// string on failure. - /// - public static string GetHost(this EndPoint endPoint) - { - return endPoint switch - { - IPEndPoint ip => ip.Address.ToString(), - DnsEndPoint dns => dns.Host, - var _ => string.Empty, - }; - } - - /// - /// Gets the endpoint port. - /// - /// The endpoint whose port to get. - /// Returns an representing the port, or 0 on failure. - public static int GetPort(this EndPoint endPoint) - { - return endPoint switch - { - IPEndPoint ip => ip.Port, - DnsEndPoint dns => dns.Port, - var _ => 0, - }; - } - } -} diff --git a/X10D/src/EnumerableExtensions.cs b/X10D/src/EnumerableExtensions.cs deleted file mode 100644 index 9d09e43..0000000 --- a/X10D/src/EnumerableExtensions.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace X10D -{ - using System.Collections.Generic; - using System.Linq; - - /// - /// Extension methods for . - /// - public static class EnumerableExtensions - { - /// - /// Splits into chunks of size . - /// - /// Any type. - /// The collection to split. - /// The maximum length of the nested collection. - /// - /// Returns an of of - /// values. - /// - public static IEnumerable> Split(this IEnumerable value, int chunkSize) - { - var enumerable = value.ToArray(); - var count = enumerable.LongCount(); - chunkSize = chunkSize.Clamp(1, enumerable.Length); - - for (var i = 0; i < (int)(count / chunkSize); i++) - { - yield return enumerable.Skip(i * chunkSize).Take(chunkSize); - } - } - } -} diff --git a/X10D/src/Int16Extensions.cs b/X10D/src/Int16Extensions.cs deleted file mode 100644 index 264891f..0000000 --- a/X10D/src/Int16Extensions.cs +++ /dev/null @@ -1,189 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for . - /// - public static class Int16Extensions - { - /// - /// Clamps a value between a minimum and a maximum value. - /// - /// The value to clamp. - /// The minimum value. - /// The maximum value. - /// - /// Returns if is greater than it, - /// if is less than it, - /// or itself otherwise. - /// - public static short Clamp(this short value, short min, short max) - { - return Math.Min(Math.Max(value, min), max); - } - - /// - /// Clamps a value between a minimum and a maximum value. - /// - /// The value to clamp. - /// The minimum value. - /// The maximum value. - /// - /// Returns if is greater than it, - /// if is less than it, - /// or itself otherwise. - /// - [CLSCompliant(false)] - public static ushort Clamp(this ushort value, ushort min, ushort max) - { - return Math.Min(Math.Max(value, min), max); - } - - /// - /// Converts the to a treating it as a Unix timestamp. - /// - /// The timestamp. - /// - /// Optional. Whether or not the input value should be treated as milliseconds. Defaults - /// to .. - /// - /// - /// Returns a representing seconds since the Unix - /// epoch. - /// - public static DateTime FromUnixTimestamp(this short timestamp, bool isMillis = false) - { - return ((long)timestamp).FromUnixTimestamp(isMillis); - } - - /// - /// Converts the to a []. - /// - /// The number to convert. - /// Returns a []. - [CLSCompliant(false)] - public static byte[] GetBytes(this ushort number) - { - return BitConverter.GetBytes(number); - } - - /// - /// Converts the to a []. - /// - /// The number to convert. - /// Returns a []. - public static byte[] GetBytes(this short number) - { - return BitConverter.GetBytes(number); - } - - /// - /// Determines if the is even. - /// - /// The number. - /// - /// Returns if is even, - /// otherwise. - /// - public static bool IsEven(this short number) - { - return ((long)number).IsEven(); - } - - /// - /// Determines if the is even. - /// - /// The number. - /// - /// Returns if is even, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool IsEven(this ushort number) - { - return ((ulong)number).IsEven(); - } - - /// - /// Determines if the is odd. - /// - /// The number. - /// - /// Returns if is odd, - /// otherwise. - /// - public static bool IsOdd(this short number) - { - return !number.IsEven(); - } - - /// - /// Determines if the is odd. - /// - /// The number. - /// - /// Returns if is odd, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool IsOdd(this ushort number) - { - return !number.IsEven(); - } - - /// - /// Determines if the is a prime number. - /// - /// The number. - /// - /// Returns if is prime, - /// otherwise. - /// - public static bool IsPrime(this short number) - { - return ((long)number).IsPrime(); - } - - /// - /// Determines if the is a prime number. - /// - /// The number. - /// - /// Returns if is prime, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool IsPrime(this ushort number) - { - return ((ulong)number).IsPrime(); - } - - /// - /// Gets an boolean value that represents this integer. - /// - /// The integer. - /// - /// Returns if is 0, - /// otherwise. - /// - public static bool ToBoolean(this short value) - { - return ((long)value).ToBoolean(); - } - - /// - /// Gets an boolean value that represents this integer. - /// - /// The integer. - /// - /// Returns if is 0, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool ToBoolean(this ushort value) - { - return ((ulong)value).ToBoolean(); - } - } -} diff --git a/X10D/src/Int32Extensions.cs b/X10D/src/Int32Extensions.cs deleted file mode 100644 index 309cfe5..0000000 --- a/X10D/src/Int32Extensions.cs +++ /dev/null @@ -1,175 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for . - /// - public static class Int32Extensions - { - /// - /// Clamps a value between a minimum and a maximum value. - /// - /// The value to clamp. - /// The minimum value. - /// The maximum value. - /// - /// Returns if is greater than it, - /// if is less than it, - /// or itself otherwise. - /// - public static int Clamp(this int value, int min, int max) - { - return Math.Min(Math.Max(value, min), max); - } - - /// - /// Clamps a value between a minimum and a maximum value. - /// - /// The value to clamp. - /// The minimum value. - /// The maximum value. - /// - /// Returns if is greater than it, - /// if is less than it, - /// or itself otherwise. - /// - [CLSCompliant(false)] - public static uint Clamp(this uint value, uint min, uint max) - { - return Math.Min(Math.Max(value, min), max); - } - - /// - /// Converts the to a treating it as a Unix timestamp. - /// - /// The timestamp. - /// - /// Optional. Whether or not the input value should be treated as milliseconds. Defaults - /// to .. - /// - /// - /// Returns a representing seconds since the Unix - /// epoch. - /// - public static DateTime FromUnixTimestamp(this int timestamp, bool isMillis = false) - { - return ((long)timestamp).FromUnixTimestamp(isMillis); - } - - /// - /// Converts the to a []. - /// - /// The number to convert. - /// Returns a []. - [CLSCompliant(false)] - public static byte[] GetBytes(this uint number) - { - return BitConverter.GetBytes(number); - } - - /// - /// Converts the to a []. - /// - /// The number to convert. - /// Returns a []. - public static byte[] GetBytes(this int number) - { - return BitConverter.GetBytes(number); - } - - /// - /// Determines if the is even. - /// - /// The number. - /// - /// Returns if is even, - /// otherwise. - /// - public static bool IsEven(this int number) - { - return ((long)number).IsEven(); - } - - /// - /// Determines if the is even. - /// - /// The number. - /// - /// Returns if is even, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool IsEven(this uint number) - { - return ((ulong)number).IsEven(); - } - - /// - /// Determines if the is odd. - /// - /// The number. - /// - /// Returns if is odd, - /// otherwise. - /// - public static bool IsOdd(this int number) - { - return !number.IsEven(); - } - - /// - /// Determines if the is odd. - /// - /// The number. - /// - /// Returns if is odd, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool IsOdd(this uint number) - { - return !number.IsEven(); - } - - /// - /// Determines if the is a prime number. - /// - /// The number. - /// - /// Returns if is prime, - /// otherwise. - /// - public static bool IsPrime(this int number) - { - return ((long)number).IsPrime(); - } - - /// - /// Gets an boolean value that represents this integer. - /// - /// The integer. - /// - /// Returns if is 0, - /// otherwise. - /// - public static bool ToBoolean(this int value) - { - return ((long)value).ToBoolean(); - } - - /// - /// Gets an boolean value that represents this integer. - /// - /// The integer. - /// - /// Returns if is 0, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool ToBoolean(this uint value) - { - return ((ulong)value).ToBoolean(); - } - } -} diff --git a/X10D/src/Int64Extensions.cs b/X10D/src/Int64Extensions.cs deleted file mode 100644 index 8a54030..0000000 --- a/X10D/src/Int64Extensions.cs +++ /dev/null @@ -1,241 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for . - /// - public static class Int64Extensions - { - /// - /// Clamps a value between a minimum and a maximum value. - /// - /// The value to clamp. - /// The minimum value. - /// The maximum value. - /// - /// Returns if is greater than it, - /// if is less than it, - /// or itself otherwise. - /// - public static long Clamp(this long value, long min, long max) - { - return Math.Min(Math.Max(value, min), max); - } - - /// - /// Clamps a value between a minimum and a maximum value. - /// - /// The value to clamp. - /// The minimum value. - /// The maximum value. - /// - /// Returns if is greater than it, - /// if is less than it, - /// or itself otherwise. - /// - [CLSCompliant(false)] - public static ulong Clamp(this ulong value, ulong min, ulong max) - { - return Math.Min(Math.Max(value, min), max); - } - - /// - /// Converts the to a treating it as a Unix timestamp. - /// - /// The timestamp. - /// - /// Optional. Whether or not the input value should be treated as milliseconds. Defaults - /// to . - /// - /// - /// Returns a representing seconds since the Unix - /// epoch. - /// - public static DateTime FromUnixTimestamp(this long timestamp, bool isMillis = false) - { - var offset = isMillis - ? DateTimeOffset.FromUnixTimeMilliseconds(timestamp) - : DateTimeOffset.FromUnixTimeSeconds(timestamp); - - return offset.DateTime; - } - - /// - /// Converts the to a []. - /// - /// The number to convert. - /// Returns a []. - [CLSCompliant(false)] - public static byte[] GetBytes(this ulong number) - { - return BitConverter.GetBytes(number); - } - - /// - /// Converts the to a []. - /// - /// The number to convert. - /// Returns a []. - public static byte[] GetBytes(this long number) - { - return BitConverter.GetBytes(number); - } - - /// - /// Determines if the is even. - /// - /// The number. - /// - /// Returns if is even, - /// otherwise. - /// - public static bool IsEven(this long number) - { - return Math.Abs(number % 2.0) < double.Epsilon; - } - - /// - /// Determines if the is even. - /// - /// The number. - /// - /// Returns if is even, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool IsEven(this ulong number) - { - return Math.Abs(number % 2.0) < double.Epsilon; - } - - /// - /// Determines if the is odd. - /// - /// The number. - /// - /// Returns if is odd, - /// otherwise. - /// - public static bool IsOdd(this long number) - { - return !IsEven(number); - } - - /// - /// Determines if the is odd. - /// - /// The number. - /// - /// Returns if is odd, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool IsOdd(this ulong number) - { - return !IsEven(number); - } - - /// - /// Determines if the is a prime number. - /// - /// The number. - /// - /// Returns if is prime, - /// otherwise. - /// - public static bool IsPrime(this long number) - { - if (number <= 1) - { - return false; - } - - if (number == 2) - { - return true; - } - - if (number % 2 == 0) - { - return false; - } - - var boundary = (long)Math.Floor(Math.Sqrt(number)); - for (var i = 3; i <= boundary; i += 2) - { - if (number % i == 0) - { - return false; - } - } - - return true; - } - - /// - /// Determines if the is a prime number. - /// - /// The number. - /// - /// Returns if is prime, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool IsPrime(this ulong number) - { - if (number <= 1) - { - return false; - } - - if (number == 2) - { - return true; - } - - if (number % 2 == 0) - { - return false; - } - - var boundary = (ulong)Math.Floor(Math.Sqrt(number)); - for (uint i = 3; i <= boundary; i += 2) - { - if (number % i == 0) - { - return false; - } - } - - return true; - } - - /// - /// Gets an boolean value that represents this integer. - /// - /// The integer. - /// - /// Returns if is 0, - /// otherwise. - /// - public static bool ToBoolean(this long value) - { - return value != 0; - } - - /// - /// Gets an boolean value that represents this integer. - /// - /// The integer. - /// - /// Returns if is 0, - /// otherwise. - /// - [CLSCompliant(false)] - public static bool ToBoolean(this ulong value) - { - return value != 0; - } - } -} diff --git a/X10D/src/ListExtensions.cs b/X10D/src/ListExtensions.cs deleted file mode 100644 index e4e5086..0000000 --- a/X10D/src/ListExtensions.cs +++ /dev/null @@ -1,104 +0,0 @@ -namespace X10D -{ - using System; - using System.Collections.Generic; - using System.Linq; - - /// - /// Extension methods for . - /// - public static class ListExtensions - { - /// - /// Returns a random element from using a new instance. - /// - /// The collection type. - /// The collection to draw from. - /// Returns a random element of type from . - public static T OneOf(this IEnumerable source) - { - return source.OneOf(new Random()); - } - - /// - /// Returns a random element from using the instance. - /// - /// The collection type. - /// The collection to draw from. - /// The instance. - /// Returns a random element of type from . - public static T OneOf(this IEnumerable source, Random random) - { - return source.ToList().OneOf(random); - } - - /// - /// Returns a random element from using a new instance. - /// - /// The collection type. - /// The collection to draw from. - /// Returns a random element of type from . - public static T OneOf(this IList source) - { - return source.OneOf(new Random()); - } - - /// - /// Returns a random element from using the instance. - /// - /// The collection type. - /// The collection to draw from. - /// The instance. - /// Returns a random element of type from . - public static T OneOf(this IList source, Random random) - { - return random.OneOf(source); - } - - /// - /// Shuffles an enumerable. - /// - /// The collection type. - /// The collection to shuffle. - /// Returns shuffled. - public static IEnumerable Shuffle(this IEnumerable source) - { - return source.Shuffle(new Random()); - } - - /// - /// Shuffles an enumerable. - /// - /// The collection type. - /// The collection to shuffle. - /// The instance. - /// Returns shuffled. - public static IEnumerable Shuffle(this IEnumerable source, Random random) - { - return source.OrderBy(_ => random.Next()); - } - - /// - /// Shuffles a list. - /// - /// The collection type. - /// The collection to shuffle. - /// Returns shuffled. - public static IEnumerable Shuffle(this IList source) - { - return source.Shuffle(new Random()); - } - - /// - /// Shuffles a list. - /// - /// The collection type. - /// The collection to shuffle. - /// The instance. - /// Returns shuffled. - public static IEnumerable Shuffle(this IList source, Random random) - { - return source.OrderBy(_ => random.Next()); - } - } -} diff --git a/X10D/src/RandomExtensions.cs b/X10D/src/RandomExtensions.cs deleted file mode 100644 index 0008338..0000000 --- a/X10D/src/RandomExtensions.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace X10D -{ - using System; - using System.Collections.Generic; - using System.Linq; - - /// - /// Extension methods for . - /// - public static class RandomExtensions - { - /// - /// Gets the instance to which other extension methods may refer, when one is - /// needed but not provided. - /// - internal static Random Random { get; } = new Random(); - - /// - /// Returns either or based on 's next - /// generation. - /// - /// The instance. - /// - /// Returns or depending on the return value - /// from . - /// - /// is . - public static bool CoinToss(this Random random) - { - if (random is null) - { - throw new ArgumentNullException(nameof(random)); - } - - return random.Next(2) == 0; - } - - /// - /// Returns a random element from using the instance. - /// - /// The collection type. - /// The instance. - /// The collection from which to draw. - /// Returns a random element of type from . - public static T OneOf(this Random random, params T[] source) - { - return source.ToList().OneOf(random); - } - - /// - /// Returns a random element from using the instance. - /// - /// The collection type. - /// The instance. - /// The collection from which to draw. - /// Returns a random element of type from . - /// - /// or is - /// . - /// - public static T OneOf(this Random random, IList source) - { - if (random is null) - { - throw new ArgumentNullException(nameof(random)); - } - - if (source is null) - { - throw new ArgumentNullException(nameof(source)); - } - - return source[random.Next(source.Count)]; - } - } -} diff --git a/X10D/src/ReflectionExtensions.cs b/X10D/src/ReflectionExtensions.cs deleted file mode 100644 index ff3cb23..0000000 --- a/X10D/src/ReflectionExtensions.cs +++ /dev/null @@ -1,123 +0,0 @@ -namespace X10D -{ - using System; - using System.ComponentModel; - using System.Reflection; - - /// - /// Extension methods for various reflection types. - /// - public static class ReflectionExtensions - { - /// - /// Gets the value set in this member's annotated , or - /// if none exists. - /// - /// The member. - /// - /// Returns an representing the value stored in this member's - /// . - /// - /// is . - public static object GetDefaultValue(this MemberInfo member) - { - if (member is null) - { - throw new ArgumentNullException(nameof(member)); - } - - if (!(member.GetCustomAttribute() is { } attribute)) - { - return default; - } - - return attribute.Value; - } - - /// - /// Gets the value set in this member's annotated , or - /// if none exists. - /// - /// The type to which the value should cast. - /// The member. - /// - /// Returns an instance of representing the value stored in this member's - /// . - /// - /// is . - public static T GetDefaultValue(this MemberInfo member) - { - if (member is null) - { - throw new ArgumentNullException(nameof(member)); - } - - return (T)member.GetDefaultValue(); - } - - /// - /// Gets the value set in this member's annotated , or - /// if none exists. - /// - /// The member. - /// - /// Returns a string representing the value stored in this member's - /// . - /// - /// is . - public static string GetDescription(this MemberInfo member) - { - if (member is null) - { - throw new ArgumentNullException(nameof(member)); - } - - if (!(member.GetCustomAttribute() is { } attribute)) - { - return null; - } - - return attribute.Description; - } - - /// - /// Retrieves a custom attribute of a specified type that is applied to the specified member, and passes it - /// to a selector delegate in order to select one or more the members in the attribute. - /// - /// The attribute type. - /// The return type of the delegate. - /// The member. - /// The selector delegate. - /// - /// Returns an instance of as provided from - /// . - /// - /// - /// is - /// -or- - /// is . - /// - public static TReturn SelectFromCustomAttribute( - this MemberInfo member, - Func selector) - where TAttribute : Attribute - { - if (member is null) - { - throw new ArgumentNullException(nameof(member)); - } - - if (selector is null) - { - throw new ArgumentNullException(nameof(selector)); - } - - if (!(member.GetCustomAttribute() is { } attribute)) - { - return default; - } - - return selector(attribute); - } - } -} diff --git a/X10D/src/SingleExtensions.cs b/X10D/src/SingleExtensions.cs deleted file mode 100644 index 53f6925..0000000 --- a/X10D/src/SingleExtensions.cs +++ /dev/null @@ -1,93 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for . - /// - public static class SingleExtensions - { - /// - /// Clamps a value between a minimum and a maximum value. - /// - /// The value to clamp. - /// The minimum value. - /// The maximum value. - /// - /// Returns if is greater than it, - /// if is less than it, - /// or itself otherwise. - /// - public static float Clamp(this float value, float min, float max) - { - return Math.Min(Math.Max(value, min), max); - } - - /// - /// Converts an angle from degrees to radians. - /// - /// The angle in degrees. - /// Returns in radians. - public static float DegreesToRadians(this float angle) - { - return (float)((double)angle).DegreesToRadians(); - } - - /// - /// Converts the to a []. - /// - /// The number to convert. - /// Returns a []. - public static byte[] GetBytes(this float number) - { - return BitConverter.GetBytes(number); - } - - /// - /// Determines if the is even. - /// - /// The number. - /// - /// Returns if is even, - /// otherwise. - /// - public static bool IsEven(this float number) - { - return ((double)number).IsEven(); - } - - /// - /// Determines if the is odd. - /// - /// The number. - /// - /// Returns if is odd, - /// otherwise. - /// - public static bool IsOdd(this float number) - { - return !number.IsEven(); - } - - /// - /// Converts an angle from radians to degrees. - /// - /// The angle in radians. - /// Returns in degrees. - public static float RadiansToDegrees(this float angle) - { - return (float)((double)angle).RadiansToDegrees(); - } - - /// - /// Rounds to the nearest value. - /// - /// The value to round. - /// The nearest value. - /// Returns the rounded value. - public static float Round(this float v, float nearest = 1) - { - return (float)((double)v).Round(nearest); - } - } -} diff --git a/X10D/src/StreamExtensions.cs b/X10D/src/StreamExtensions.cs deleted file mode 100644 index 521796b..0000000 --- a/X10D/src/StreamExtensions.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace X10D -{ - using System; - using System.IO; - using System.Security.Cryptography; - - /// - /// Extension methods for . - /// - public static class StreamExtensions - { - /// - /// Returns the hash of a stream using the specified hashing algorithm. - /// - /// A derived type. - /// The stream whose hash is to be computed. - /// Returns a array representing the hash of the stream. - /// is . - public static byte[] GetHash(this Stream stream) - where T : HashAlgorithm - { - if (stream is null) - { - throw new ArgumentNullException(nameof(stream)); - } - - var create = typeof(T).GetMethod("Create", Array.Empty()); - using var crypt = (T)create?.Invoke(null, null); - return crypt?.ComputeHash(stream); - } - } -} diff --git a/X10D/src/StringExtensions.cs b/X10D/src/StringExtensions.cs deleted file mode 100644 index a462ad4..0000000 --- a/X10D/src/StringExtensions.cs +++ /dev/null @@ -1,356 +0,0 @@ -namespace X10D -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Net; - using System.Security; - using System.Text; - - /// - /// Extension methods for . - /// - public static class StringExtensions - { - /// - /// Decodes a base-64 encoded string. - /// - /// The base-64 string to decode. - /// Returns the string in plain text. - public static string Base64Decode(this string data) - { - return Convert.FromBase64String(data).GetString(); - } - - /// - /// Encodes a base-64 encoded string. - /// - /// The plain text string to decode. - /// Returns the string in plain text. - public static string Base64Encode(this string value) - { - return Convert.ToBase64String(value.GetBytes()); - } - - /// - /// Converts this string from one encoding to another. - /// - /// The input string. - /// The input encoding. - /// The output encoding. - /// - /// Returns a new with its data converted to - /// . - /// - /// - /// is - /// - or - - /// is - /// -or - /// is . - /// - public static string ChangeEncoding(this string str, Encoding from, Encoding to) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - if (from is null) - { - throw new ArgumentNullException(nameof(from)); - } - - if (to is null) - { - throw new ArgumentNullException(nameof(to)); - } - - return str.GetBytes(from).GetString(to); - } - - /// - /// Parses a into an . - /// - /// The type of the . - /// The value to parse. - /// The value corresponding to the . - /// - /// Credit for this method goes to Scott Dorman: - /// (http://geekswithblogs.net/sdorman/Default.aspx). - /// - public static T EnumParse(this string value) - { - return value.EnumParse(false); - } - - /// - /// Parses a into an . - /// - /// The type of the . - /// The value to parse. - /// Whether or not to ignore casing. - /// The value corresponding to the . - /// - /// Credit for this method goes to Scott Dorman: - /// (http://geekswithblogs.net/sdorman/Default.aspx). - /// - public static T EnumParse(this string value, bool ignoreCase) - { - if (value is null) - { - throw new ArgumentNullException(nameof(value)); - } - - value = value.Trim(); - - if (string.IsNullOrWhiteSpace(value)) - { - throw new ArgumentException(Resource.EnumParseEmptyStringException, nameof(value)); - } - - var t = typeof(T); - - if (!t.IsEnum) - { - throw new ArgumentException(Resource.EnumParseNotEnumException); - } - - return (T)Enum.Parse(t, value, ignoreCase); - } - - /// - /// Gets a [] representing the value the with - /// encoding. - /// - /// The string to convert. - /// Returns a []. - public static byte[] GetBytes(this string str) - { - return str.GetBytes(Encoding.UTF8); - } - - /// - /// Gets a [] representing the value the with the provided encoding. - /// - /// The string to convert. - /// The encoding to use. - /// Returns a []. - /// - /// or or both are - /// . - /// - public static byte[] GetBytes(this string str, Encoding encoding) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - if (encoding is null) - { - throw new ArgumentNullException(nameof(encoding)); - } - - return encoding.GetBytes(str); - } - - /// - /// Determines if all alpha characters in this string are considered lowercase. - /// - /// The input string. - /// - /// Returns if all alpha characters are lowercase, - /// otherwise. - /// - public static bool IsLower(this string str) - { - return str.Where(char.IsLetter).All(char.IsLower); - } - - /// - /// Determines if all alpha characters in this string are considered uppercase. - /// - /// The input string. - /// - /// Returns if all alpha characters are uppercase, - /// otherwise. - /// - public static bool IsUpper(this string str) - { - return str.Where(char.IsLetter).All(char.IsUpper); - } - - /// - /// Generates a new random string by filling it with characters found in . - /// - /// The character set. - /// The length of the string to generate. - /// Returns a containing characters. - public static string Random(this string str, int length) - { - return str.Random(length, RandomExtensions.Random); - } - - /// - /// Generates a new random string by filling it with characters found in . - /// - /// The character set. - /// The length of the string to generate. - /// The instance. - /// Returns a containing characters. - /// is . - public static string Random(this string str, int length, Random random) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - return str.ToCharArray().Random(length, random); - } - - /// - /// Repeats a string a specified number of times. - /// - /// The string to repeat. - /// The repeat count. - /// - /// Returns a whose value is repeated - /// times. - /// - /// is . - public static string Repeat(this string str, int count) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - var builder = new StringBuilder(str.Length * count); - - for (var i = 0; i < count; i++) - { - builder.Append(str); - } - - return builder.ToString(); - } - - /// - /// Shuffles the characters in the string. - /// - /// The string to shuffle. - /// Returns a containing the characters in , rearranged. - public static string Shuffle(this string str) - { - return str.Shuffle(RandomExtensions.Random); - } - - /// - /// Shuffles the characters in the string. - /// - /// The string to shuffle. - /// The instance. - /// Returns a containing the characters in , rearranged. - /// is . - public static string Shuffle(this string str, Random random) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - return new string(str.ToCharArray().Shuffle(random).ToArray()); - } - - /// - /// Splits the into chunks that are no greater than in length. - /// - /// The string to split. - /// The maximum length of each string in the returned result. - /// - /// Returns an containing instances which are no - /// greater than in length. - /// - /// is . - public static IEnumerable Split(this string str, int chunkSize) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - return SplitInternal(); - - IEnumerable SplitInternal() - { - for (var i = 0; i < str.Length; i += chunkSize) - { - yield return str.Substring(i, Math.Min(chunkSize, str.Length - i)); - } - } - } - - /// - /// Converts a to a . - /// - /// The string to convert. - /// Returns a . - /// is . - public static SecureString ToSecureString(this string str) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - if (string.IsNullOrWhiteSpace(str)) - { - return null; - } - - var result = new SecureString(); - foreach (var c in str) - { - result.AppendChar(c); - } - - return result; - } - - /// - /// Converts a to a . - /// - /// The to convert. - /// Whether or not to use this extension method. - /// Returns a . - /// is . - public static string ToString(this SecureString str, bool extension) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - return extension ? new NetworkCredential(string.Empty, str).Password : str.ToString(); - } - - /// - /// Parses a shorthand time span string (e.g. 3w 2d 1.5h) and converts it to an instance of - /// . - /// - /// The input string. - /// Returns an instance of . - /// is . - public static TimeSpan ToTimeSpan(this string str) - { - if (str is null) - { - throw new ArgumentNullException(nameof(str)); - } - - return TimeSpanParser.Parse(str); - } - } -} diff --git a/X10D/src/StructExtensions.cs b/X10D/src/StructExtensions.cs deleted file mode 100644 index cb9aac7..0000000 --- a/X10D/src/StructExtensions.cs +++ /dev/null @@ -1,56 +0,0 @@ -namespace X10D -{ - using System; - - /// - /// Extension methods for types. - /// - public static class StructExtensions - { - /// - /// Returns the next value in an using the specified value as a starting point. - /// - /// An . - /// An value. - /// - /// Optional. Whether or not to wrap to the to the start of the enum. Defaults to - /// true. - /// - /// Returns a value. - public static T Next(this T src, bool wrap = true) - where T : struct - { - if (!typeof(T).IsEnum) - { - throw new ArgumentException($"Argument {typeof(T).FullName} is not an Enum"); - } - - var arr = (T[])Enum.GetValues(src.GetType()); - var j = Array.IndexOf(arr, src) + 1; - return arr.Length == j ? arr[wrap ? 0 : j - 1] : arr[j]; - } - - /// - /// Returns the previous value in an using the specified value as a starting point. - /// - /// An . - /// An value. - /// - /// Optional. Whether or not to wrap to the to the end of the enum. Defaults to - /// true. - /// - /// Returns a value. - public static T Previous(this T src, bool wrap = true) - where T : struct - { - if (!typeof(T).IsEnum) - { - throw new ArgumentException($"Argument {typeof(T).FullName} is not an Enum"); - } - - var arr = (T[])Enum.GetValues(src.GetType()); - var j = Array.IndexOf(arr, src) - 1; - return j < 0 ? arr[wrap ? arr.Length - 1 : 0] : arr[j]; - } - } -} diff --git a/X10D/src/TimeSpanParser.cs b/X10D/src/TimeSpanParser.cs deleted file mode 100644 index 5f5a7aa..0000000 --- a/X10D/src/TimeSpanParser.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace X10D -{ - using System; - using System.Diagnostics; - using System.Text.RegularExpressions; - - /// - /// Represents a class which contains a parser which converts into . - /// - public static class TimeSpanParser - { - /// - /// Parses a shorthand time span string (e.g. 3w 2d 1.5h) and converts it to an instance of - /// . - /// - /// The input string. - /// The format provider. - /// Returns an instance of . - public static TimeSpan Parse(string input, IFormatProvider provider = null) - { - const string realNumberPattern = @"([0-9]*\.[0-9]+|[0-9]+)"; - var pattern = $"^(?:{realNumberPattern} *w)? *" + - $"(?:{realNumberPattern} *d)? *" + - $"(?:{realNumberPattern} *h)? *" + - $"(?:{realNumberPattern} *m)? *" + - $"(?:{realNumberPattern} *s)? *" + - $"(?:{realNumberPattern} *ms)?$"; - - var match = Regex.Match(input, pattern); - double weeks = 0, days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0; - - if (match.Groups[1].Success) - { - weeks = double.Parse(match.Groups[1].Value, provider); - } - - if (match.Groups[2].Success) - { - days = double.Parse(match.Groups[2].Value, provider); - } - - if (match.Groups[3].Success) - { - hours = double.Parse(match.Groups[3].Value, provider); - } - - if (match.Groups[4].Success) - { - minutes = double.Parse(match.Groups[4].Value, provider); - } - - if (match.Groups[5].Success) - { - seconds = double.Parse(match.Groups[5].Value, provider); - } - - if (match.Groups[6].Success) - { - milliseconds = double.Parse(match.Groups[6].Value, provider); - } - - Trace.WriteLine($"Input: {input}"); - Trace.WriteLine($"Parsed: {weeks}w {days}d {hours}h {minutes}m {seconds}s {milliseconds}ms"); - - var span = TimeSpan.Zero; - - span += TimeSpan.FromDays(weeks * 7); - span += TimeSpan.FromDays(days); - span += TimeSpan.FromHours(hours); - span += TimeSpan.FromMinutes(minutes); - span += TimeSpan.FromSeconds(seconds); - span += TimeSpan.FromMilliseconds(milliseconds); - - return span; - } - } -} diff --git a/X10D/src/WaitHandleExtensions.cs b/X10D/src/WaitHandleExtensions.cs deleted file mode 100644 index 9febee6..0000000 --- a/X10D/src/WaitHandleExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace X10D -{ - using System.Threading; - using System.Threading.Tasks; - - /// - /// Extension methods for . - /// - public static class WaitHandleExtensions - { - /// - /// Returns a which can be awaited until the current receives a signal. - /// - /// The instance. - /// Returns a task which wraps . - public static Task WaitOneAsync(this WaitHandle handle) - { - return new Task(() => handle.WaitOne()); - } - } -} diff --git a/_config.yml b/_config.yml deleted file mode 100644 index c741881..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-slate \ No newline at end of file diff --git a/icon.png b/icon.png deleted file mode 100644 index c8a172e062c0658a1638119111ac7e900677f71a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32695 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