type Government = {
Id : int;
Name : string;
Abbreviation : string;
ParentId : string option;
}
type GovernmentStructure<'gov> =
| Root of Government : 'gov * GovernmentStructure<'gov> list
| Node of Government : 'gov * GovernmentStructure<'gov> list
| Leaf of Government : 'gov
let rec findGovernment (gov : Government)
(governmentStructure : GovernmentStructure<Government> list) =
[
for x in governmentStructure do
match x with
| Root(gov', subGov) ->
if gov = gov' then yield gov' else yield findGovernment gov subGov
| Node(gov', subGov) ->
if gov = gov' then yield gov' else yield findGovernment gov subGov
| Leaf(gov') ->
if gov = gov' then yield gov'
] |> List.head
dHlwZSBHb3Zlcm5tZW50ID0gewogICAgSWQgOiBpbnQ7CiAgICBOYW1lIDogc3RyaW5nOwogICAgQWJicmV2aWF0aW9uIDogc3RyaW5nOwogICAgUGFyZW50SWQgOiBzdHJpbmcgb3B0aW9uOwp9Cgp0eXBlIEdvdmVybm1lbnRTdHJ1Y3R1cmU8J2dvdj4gPQogICAgfCBSb290IG9mIEdvdmVybm1lbnQgOiAnZ292ICogR292ZXJubWVudFN0cnVjdHVyZTwnZ292PiBsaXN0CiAgICB8IE5vZGUgb2YgR292ZXJubWVudCA6ICdnb3YgKiBHb3Zlcm5tZW50U3RydWN0dXJlPCdnb3Y+IGxpc3QKICAgIHwgTGVhZiBvZiBHb3Zlcm5tZW50IDogJ2dvdgoKbGV0IHJlYyBmaW5kR292ZXJubWVudCAoZ292IDogR292ZXJubWVudCkKICAgICAgICAgICAgICAgICAgICAgICAoZ292ZXJubWVudFN0cnVjdHVyZSA6IEdvdmVybm1lbnRTdHJ1Y3R1cmU8R292ZXJubWVudD4gbGlzdCkgPQogICAgWwogICAgICAgIGZvciB4IGluIGdvdmVybm1lbnRTdHJ1Y3R1cmUgZG8KICAgICAgICAgICAgbWF0Y2ggeCB3aXRoCiAgICAgICAgICAgIHwgUm9vdChnb3YnLCBzdWJHb3YpIC0+CiAgICAgICAgICAgICAgICBpZiBnb3YgPSBnb3YnIHRoZW4geWllbGQgZ292JyBlbHNlIHlpZWxkIGZpbmRHb3Zlcm5tZW50IGdvdiBzdWJHb3YKICAgICAgICAgICAgfCBOb2RlKGdvdicsIHN1YkdvdikgLT4KICAgICAgICAgICAgICAgIGlmIGdvdiA9IGdvdicgdGhlbiB5aWVsZCBnb3YnIGVsc2UgeWllbGQgZmluZEdvdmVybm1lbnQgZ292IHN1YkdvdgogICAgICAgICAgICB8IExlYWYoZ292JykgLT4KICAgICAgICAgICAgICAgIGlmIGdvdiA9IGdvdicgdGhlbiB5aWVsZCBnb3YnCiAgICBdIHw+IExpc3QuaGVhZA==