I have the following EF Core table:
[PrimaryKey(nameof(Name))]
public class Scope
{
public required string Name { get; set; }
public required IPNetwork Network { get; set; }
public required IPAddress From { get; set; }
public required IPAddress To { get; set; }
public required IPAddress Gateway { get; set; }
public required IPAddress Dns1 { get; set; }
public IPAddress? Dns2 { get; set; }
public required uint LeaseTimeInSeconds { get; set; }
[ConcurrencyCheck]
public DateTimeOffset LastUpdate { get; set; }
public ICollection<AddressReservation> Reservations { get; set; } = null!;
public ICollection<AddressLease> Leases { get; set; } = null!;
}
And I want to find the first IP address in this scope that is free and can be assigned to a client. This is what I wrote:
let rec checkAvailability ipAddress endIp =
match
(
s.Leases |> Seq.tryFind (fun l -> l.IpAddress = ipAddress),
s.Reservations |> Seq.tryFind (fun r -> r.IpAddress = ipAddress)
)
with
| (None, None) -> Some ipAddress
| _ when ipAddress.Equals(endIp) -> None
| _ -> checkAvailability (incrementIp ipAddress) endIp
checkAvailability s.From s.To