rule :: Int -> (Point -> [Seat]) -> Point -> Seat -> Seat
rule n see xy p | p == Occupied && n <= ox xy             = Empty
                | p == Empty && notElem Occupied (see xy) = Occupied
                | otherwise                               = p
  where ox = length . filter (== Occupied) . see
rule :: Int -> (Point -> [Seat]) -> Point -> Seat -> Seat
rule n see xy p | p == Occupied && n <= ox xy             = Empty
                | p == Empty && notElem Occupied (see xy) = Occupied
                | otherwise                               = p
  where ox = length . filter (== Occupied) . see
rule n see xy p | p == Occupied && n <= ox xy             = Empty
                | p == Empty && notElem Occupied (see xy) = Occupied
                | otherwise                               = p
  where ox = length . filter (== Occupied) . see