def get_all_friends(uid, client)
      friends = client.friendships.friends(uid: uid)
      total = friends.total_number
      get_friends(total, 0, uid, client)
    end

    def get_friends(total, cursor, uid, client)
      left = total
      count = [200, left].min

      friends = client.friendships.friends(uid: uid, count: count, cursor: cursor)
      left -= count
      next_cursor = friends.next_cursor

      return friends if (left == 0 || next_cursor == 0)

      more_firends = get_friends(left, next_cursor, uid, client)
      more_firends.users << friends.users
      return more_firends
    end

    get_all_friends(uid, observer.client).users.map do |info|
      user = User.find_or_create_by_uid_and_name(uid: info.id, name: info.name)
      follow(user)
      user
    end

This code is written in a functional style. Maybe there is a more natural way to structure it with Block.

And how can I reuse the code when `client.friendships.friends(uid: uid, count: count, cursor: cursor)` differs?