{"id":5142,"date":"2021-06-24T15:08:20","date_gmt":"2021-06-24T14:08:20","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=5142"},"modified":"2024-04-23T13:27:36","modified_gmt":"2024-04-23T12:27:36","slug":"flatten-time-periods","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/flatten-time-periods\/","title":{"rendered":"Flatten time periods"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class TimeRange {\n    public DateTime? Start { get; set; }\n    public DateTime? End { get; set; }\n\n    public static IEnumerable&lt;T> Select&lt;T> (params T[] args) => args;\n\n        \/\/ [---------------]     [----------] &lt;= children\n        \/\/            [---------------]       &lt;= children  \n        \/\/ ==>\n        \/\/     [-------------------------]    &lt;= parent\n        \/\/     [-----][----][---][-------]\n        public static IEnumerable&lt;TimeRange> GetPeriodsFlattened(ITimeRange parent, IEnumerable&lt;ITimeRange> children)\n        {\n            if (!children.Any())\n            {\n                yield return new TimeRange(parent.Start, parent.End);\n                yield break;\n            }\n\n            var allTimesInParent = children.SelectMany(x => LinqHelper.Select(x.Start, x.End))\n                .Concat(LinqHelper.Select(parent.Start, parent.End))\n                .Where(x => x.HasValue &amp;&amp; x >= parent.Start &amp;&amp; x &lt;= parent.End)\n                .OrderBy(x => x).Distinct().ToList();\n\n            if (allTimesInParent.Count &lt; 2)\n            {\n                yield return new TimeRange(parent.Start, parent.End);\n                yield break;\n            }\n\n            DateTime? prev = null;\n            foreach (var curr in allTimesInParent)\n            {\n                if (prev != null)\n                    yield return new TimeRange(prev, curr);\n                prev = curr;\n            }\n        }\n}\n\nvoid Main () {\n    var ranges = new List&lt;TimeRange> () {\n        new TimeRange {\n            Start = null,\n            End = new DateTime (2020, 1, 15)\n        },\n        new TimeRange {\n            Start = new DateTime (2020, 1, 14),\n            End = new DateTime (2020, 1, 18)\n        },\n        new TimeRange {\n            Start = new DateTime (2020, 1, 20),\n            End = null\n        }\n    };\n\n    var parentRange = new TimeRange () {\n        Start = new DateTime (2020, 1, 12),\n        End = new DateTime (2020, 2, 28)\n    };\n\n    var flattened = TimeRange.GetPeriodsFlattened (parentRange, ranges);\n    foreach (var range in flattened) {\n        Console.WriteLine (range.Start.ToString () + \" - \" + range.End.ToString ());\n    }\n}\n\/* CONSOLE OUTPUT:\n12-1-2020 00:00:00 - 14-1-2020 00:00:00\n14-1-2020 00:00:00 - 15-1-2020 00:00:00\n15-1-2020 00:00:00 - 18-1-2020 00:00:00\n18-1-2020 00:00:00 - 20-1-2020 00:00:00\n20-1-2020 00:00:00 - 28-2-2020 00:00:00\n*\/<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5142","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/5142","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=5142"}],"version-history":[{"count":6,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/5142\/revisions"}],"predecessor-version":[{"id":8463,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/5142\/revisions\/8463"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=5142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=5142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=5142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}