Skip to content

Instantly share code, notes, and snippets.

@dkgndianko
Created October 24, 2019 18:17
Show Gist options
  • Save dkgndianko/1b770328cb0ead241d17eb7a77fcb7fe to your computer and use it in GitHub Desktop.
Save dkgndianko/1b770328cb0ead241d17eb7a77fcb7fe to your computer and use it in GitHub Desktop.
This is a method for updating a list of elements.
def updator(initial_list: Set[T], new_list: Set[T], creator: Callable[T, U], getter: Callable[T, U], deleter: Callable[T]) -> List[U]:
result = []
for e in new_list:
element = getter(e)
if not element:
element = creator(e)
result.append(element)
to_delete = initial_list.difference(new_list)
for e in to_delete:
deleter(e)
return result
@dkgndianko
Copy link
Author

This is very useful when updating sub-elements.

Sample:
We have a user resource (main element) that have permissions (sub-elements). We can use a similar thing to update user permission.

class UserPermission:
    def __init__(self, user: User):
        self.user = user
    def get_permissions(self):
        # ...
        pass
    def create_permission(self, permission: Permission):
        # ...
        pass
    def get_permission(self, permission: Permission):
        # ...
        pass
    def remove_permission(self, permission: Permission):
        # ...
        pass

A function that will update user permission could be defined like this:

def update_user_permissions(user: User, permissions: List[Permission]):
    user_resource = UserPermission(user)
    actual_permissions = user_resource.get_permissions()
    return updator(actual_permissions, permissions, user_resource.create_permission, user_resource.get_permission, user_resource.remove_permission)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment