import {
  FOLLOWERS_FETCH_SUCCESS,
  FOLLOWERS_EXPAND_SUCCESS,
  FOLLOWING_FETCH_SUCCESS,
  FOLLOWING_EXPAND_SUCCESS,
  FOLLOW_REQUESTS_FETCH_SUCCESS,
  FOLLOW_REQUESTS_EXPAND_SUCCESS,
  FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
  FOLLOW_REQUEST_REJECT_SUCCESS,
} from '../actions/accounts';
import {
  SUGGESTED_ACCOUNTS_FETCH_SUCCESS,
  SUGGESTED_ACCOUNTS_EXPAND_SUCCESS
} from '../actions/suggested_accounts';
import {
  REBLOGS_FETCH_SUCCESS,
  FAVOURITES_FETCH_SUCCESS,
} from '../actions/interactions';
import {
  BLOCKS_FETCH_SUCCESS,
  BLOCKS_EXPAND_SUCCESS,
} from '../actions/blocks';
import {
  MUTES_FETCH_SUCCESS,
  MUTES_EXPAND_SUCCESS,
} from '../actions/mutes';
import Immutable from 'immutable';

const initialState = Immutable.Map({
  followers: Immutable.Map(),
  following: Immutable.Map(),
  reblogged_by: Immutable.Map(),
  favourited_by: Immutable.Map(),
  follow_requests: Immutable.Map(),
  blocks: Immutable.Map(),
  mutes: Immutable.Map(),
<<<<<<< HEAD:app/assets/javascripts/components/reducers/user_lists.jsx
  suggested_accounts: Immutable.Map()
=======
>>>>>>> 8963f8c3c2630bfcc377a5ca0513eef5a6b2a4bc:app/javascript/mastodon/reducers/user_lists.js
});

const normalizeList = (state, type, id, accounts, next) => {
  return state.setIn([type, id], Immutable.Map({
    next,
    items: Immutable.List(accounts.map(item => item.id)),
  }));
};

const appendToList = (state, type, id, accounts, next) => {
  return state.updateIn([type, id], map => {
    return map.set('next', next).update('items', list => list.concat(accounts.map(item => item.id)));
  });
};

const normalizeSuggestedAccountsList = (state, type, accounts, next) => {
  return state.setIn([type], Immutable.Map({
    next,
    items: Immutable.List(accounts.map(item => item.id))
  }));
};

const appendToSuggestedAccountsList = (state, type, accounts, next) => {
  return state.updateIn([type], map => {
    return map.set('next', next).update('items', list => list.push(...accounts.map(item => item.id)));
  });
};

export default function userLists(state = initialState, action) {
  switch(action.type) {
  case FOLLOWERS_FETCH_SUCCESS:
    return normalizeList(state, 'followers', action.id, action.accounts, action.next);
  case FOLLOWERS_EXPAND_SUCCESS:
    return appendToList(state, 'followers', action.id, action.accounts, action.next);
  case FOLLOWING_FETCH_SUCCESS:
    return normalizeList(state, 'following', action.id, action.accounts, action.next);
  case FOLLOWING_EXPAND_SUCCESS:
    return appendToList(state, 'following', action.id, action.accounts, action.next);
  case REBLOGS_FETCH_SUCCESS:
    return state.setIn(['reblogged_by', action.id], Immutable.List(action.accounts.map(item => item.id)));
  case FAVOURITES_FETCH_SUCCESS:
    return state.setIn(['favourited_by', action.id], Immutable.List(action.accounts.map(item => item.id)));
  case FOLLOW_REQUESTS_FETCH_SUCCESS:
    return state.setIn(['follow_requests', 'items'], Immutable.List(action.accounts.map(item => item.id))).setIn(['follow_requests', 'next'], action.next);
  case FOLLOW_REQUESTS_EXPAND_SUCCESS:
    return state.updateIn(['follow_requests', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['follow_requests', 'next'], action.next);
  case FOLLOW_REQUEST_AUTHORIZE_SUCCESS:
  case FOLLOW_REQUEST_REJECT_SUCCESS:
    return state.updateIn(['follow_requests', 'items'], list => list.filterNot(item => item === action.id));
  case BLOCKS_FETCH_SUCCESS:
    return state.setIn(['blocks', 'items'], Immutable.List(action.accounts.map(item => item.id))).setIn(['blocks', 'next'], action.next);
  case BLOCKS_EXPAND_SUCCESS:
    return state.updateIn(['blocks', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['blocks', 'next'], action.next);
  case MUTES_FETCH_SUCCESS:
    return state.setIn(['mutes', 'items'], Immutable.List(action.accounts.map(item => item.id))).setIn(['mutes', 'next'], action.next);
  case MUTES_EXPAND_SUCCESS:
<<<<<<< HEAD:app/assets/javascripts/components/reducers/user_lists.jsx
    return state.updateIn(['mutes', 'items'], list => list.push(...action.accounts.map(item => item.id))).setIn(['mutes', 'next'], action.next);
  case SUGGESTED_ACCOUNTS_FETCH_SUCCESS:
    return normalizeSuggestedAccountsList(state, 'suggested_accounts', action.accounts, action.next);
  case SUGGESTED_ACCOUNTS_EXPAND_SUCCESS:
    return appendToSuggestedAccountsList(state, 'suggested_accounts', action.accounts, action.next);
=======
    return state.updateIn(['mutes', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['mutes', 'next'], action.next);
>>>>>>> 8963f8c3c2630bfcc377a5ca0513eef5a6b2a4bc:app/javascript/mastodon/reducers/user_lists.js
  default:
    return state;
  }
};

@@ -957,220 +957,45 @@
 (),%0A
-%3C%3C%3C%3C%3C%3C%3C HEAD:app/assets/javascripts/components/reducers/user_lists.jsx%0A  suggested_accounts: Immutable.Map()%0A=======%0A%3E%3E%3E%3E%3E%3E%3E 8963f8c3c2630bfcc377a5ca0513eef5a6b2a4bc:app/javascript/mastodon/reducers/user_lists.js
+  suggested_accounts: Immutable.Map()
 %0A%7D);
@@ -3795,79 +3795,8 @@
 SS:%0A
-%3C%3C%3C%3C%3C%3C%3C HEAD:app/assets/javascripts/components/reducers/user_lists.jsx%0A
     
@@ -3850,24 +3850,23 @@
 =%3E list.
-push(...
+concat(
 action.a
@@ -4225,256 +4225,8 @@
 t);%0A
-=======%0A    return state.updateIn(%5B'mutes', 'items'%5D, list =%3E list.concat(action.accounts.map(item =%3E item.id))).setIn(%5B'mutes', 'next'%5D, action.next);%0A%3E%3E%3E%3E%3E%3E%3E 8963f8c3c2630bfcc377a5ca0513eef5a6b2a4bc:app/javascript/mastodon/reducers/user_lists.js%0A
   de

Resolve a merged conflict - app/javascript/mastodon/reducers/user_lists.js