Add erase function (#2641)
This commit is contained in:
		
							parent
							
								
									3cace734c7
								
							
						
					
					
						commit
						00d79487cd
					
				
					 11 changed files with 31 additions and 19 deletions
				
			
		| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
import { EventEmitter } from 'eventemitter3';
 | 
					import { EventEmitter } from 'eventemitter3';
 | 
				
			||||||
import * as uuid from 'uuid';
 | 
					import * as uuid from 'uuid';
 | 
				
			||||||
import Connection from './stream';
 | 
					import Connection from './stream';
 | 
				
			||||||
 | 
					import { erase } from '../../../../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * ストリーム接続を管理するクラス
 | 
					 * ストリーム接続を管理するクラス
 | 
				
			||||||
| 
						 | 
					@ -89,7 +90,7 @@ export default abstract class StreamManager<T extends Connection> extends EventE
 | 
				
			||||||
	 * @param userId use で発行したユーザーID
 | 
						 * @param userId use で発行したユーザーID
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public dispose(userId) {
 | 
						public dispose(userId) {
 | 
				
			||||||
		this.users = this.users.filter(id => id != userId);
 | 
							this.users = erase(userId, this.users);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this._connection.user = `Managed (${ this.users.length })`;
 | 
							this._connection.user = `Managed (${ this.users.length })`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import Vue from 'vue';
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import { erase } from '../../../../../prelude/array';
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	data() {
 | 
						data() {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
| 
						 | 
					@ -53,7 +54,7 @@ export default Vue.extend({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		get() {
 | 
							get() {
 | 
				
			||||||
			return {
 | 
								return {
 | 
				
			||||||
				choices: this.choices.filter(choice => choice != '')
 | 
									choices: erase('', this.choices)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,6 +62,7 @@ import getFace from '../../../common/scripts/get-face';
 | 
				
			||||||
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
 | 
					import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
 | 
				
			||||||
import parse from '../../../../../mfm/parse';
 | 
					import parse from '../../../../../mfm/parse';
 | 
				
			||||||
import { host } from '../../../config';
 | 
					import { host } from '../../../config';
 | 
				
			||||||
 | 
					import { erase } from '../../../../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
| 
						 | 
					@ -346,7 +347,7 @@ export default Vue.extend({
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		removeVisibleUser(user) {
 | 
							removeVisibleUser(user) {
 | 
				
			||||||
			this.visibleUsers = this.visibleUsers.filter(u => u != user);
 | 
								this.visibleUsers = erase(user, this.visibleUsers);
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		post() {
 | 
							post() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@ import Err from './common/views/components/connect-failed.vue';
 | 
				
			||||||
import { LocalTimelineStreamManager } from './common/scripts/streaming/local-timeline';
 | 
					import { LocalTimelineStreamManager } from './common/scripts/streaming/local-timeline';
 | 
				
			||||||
import { HybridTimelineStreamManager } from './common/scripts/streaming/hybrid-timeline';
 | 
					import { HybridTimelineStreamManager } from './common/scripts/streaming/hybrid-timeline';
 | 
				
			||||||
import { GlobalTimelineStreamManager } from './common/scripts/streaming/global-timeline';
 | 
					import { GlobalTimelineStreamManager } from './common/scripts/streaming/global-timeline';
 | 
				
			||||||
 | 
					import { erase } from '../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#region api requests
 | 
					//#region api requests
 | 
				
			||||||
let spinner = null;
 | 
					let spinner = null;
 | 
				
			||||||
| 
						 | 
					@ -537,7 +538,7 @@ export default class MiOS extends EventEmitter {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public unregisterStreamConnection(connection: Connection) {
 | 
						public unregisterStreamConnection(connection: Connection) {
 | 
				
			||||||
		this.connections = this.connections.filter(c => c != connection);
 | 
							this.connections = erase(connection, this.connections);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,6 +59,7 @@ import MkVisibilityChooser from '../../../common/views/components/visibility-cho
 | 
				
			||||||
import getFace from '../../../common/scripts/get-face';
 | 
					import getFace from '../../../common/scripts/get-face';
 | 
				
			||||||
import parse from '../../../../../mfm/parse';
 | 
					import parse from '../../../../../mfm/parse';
 | 
				
			||||||
import { host } from '../../../config';
 | 
					import { host } from '../../../config';
 | 
				
			||||||
 | 
					import { erase } from '../../../../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
| 
						 | 
					@ -262,7 +263,7 @@ export default Vue.extend({
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		removeVisibleUser(user) {
 | 
							removeVisibleUser(user) {
 | 
				
			||||||
			this.visibleUsers = this.visibleUsers.filter(u => u != user);
 | 
								this.visibleUsers = erase(user, this.visibleUsers);
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		clear() {
 | 
							clear() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@ import * as nestedProperty from 'nested-property';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import MiOS from './mios';
 | 
					import MiOS from './mios';
 | 
				
			||||||
import { hostname } from './config';
 | 
					import { hostname } from './config';
 | 
				
			||||||
 | 
					import { erase } from '../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultSettings = {
 | 
					const defaultSettings = {
 | 
				
			||||||
	home: null,
 | 
						home: null,
 | 
				
			||||||
| 
						 | 
					@ -195,7 +196,7 @@ export default (os: MiOS) => new Vuex.Store({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				removeDeckColumn(state, id) {
 | 
									removeDeckColumn(state, id) {
 | 
				
			||||||
					state.deck.columns = state.deck.columns.filter(c => c.id != id);
 | 
										state.deck.columns = state.deck.columns.filter(c => c.id != id);
 | 
				
			||||||
					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
 | 
										state.deck.layout = state.deck.layout.map(ids => erase(id, ids));
 | 
				
			||||||
					state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
 | 
										state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -266,7 +267,7 @@ export default (os: MiOS) => new Vuex.Store({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				stackLeftDeckColumn(state, id) {
 | 
									stackLeftDeckColumn(state, id) {
 | 
				
			||||||
					const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
 | 
										const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
 | 
				
			||||||
					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
 | 
										state.deck.layout = state.deck.layout.map(ids => erase(id, ids));
 | 
				
			||||||
					const left = state.deck.layout[i - 1];
 | 
										const left = state.deck.layout[i - 1];
 | 
				
			||||||
					if (left) state.deck.layout[i - 1].push(id);
 | 
										if (left) state.deck.layout[i - 1].push(id);
 | 
				
			||||||
					state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
 | 
										state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
 | 
				
			||||||
| 
						 | 
					@ -274,7 +275,7 @@ export default (os: MiOS) => new Vuex.Store({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				popRightDeckColumn(state, id) {
 | 
									popRightDeckColumn(state, id) {
 | 
				
			||||||
					const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
 | 
										const i = state.deck.layout.findIndex(ids => ids.indexOf(id) != -1);
 | 
				
			||||||
					state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
 | 
										state.deck.layout = state.deck.layout.map(ids => erase(id, ids));
 | 
				
			||||||
					state.deck.layout.splice(i + 1, 0, [id]);
 | 
										state.deck.layout.splice(i + 1, 0, [id]);
 | 
				
			||||||
					state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
 | 
										state.deck.layout = state.deck.layout.filter(ids => ids.length > 0);
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import composeNotification from './common/scripts/compose-notification';
 | 
					import composeNotification from './common/scripts/compose-notification';
 | 
				
			||||||
 | 
					import { erase } from '../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// キャッシュするリソース
 | 
					// キャッシュするリソース
 | 
				
			||||||
const cachee = [
 | 
					const cachee = [
 | 
				
			||||||
| 
						 | 
					@ -24,8 +25,7 @@ self.addEventListener('activate', ev => {
 | 
				
			||||||
	// Clean up old caches
 | 
						// Clean up old caches
 | 
				
			||||||
	ev.waitUntil(
 | 
						ev.waitUntil(
 | 
				
			||||||
		caches.keys().then(keys => Promise.all(
 | 
							caches.keys().then(keys => Promise.all(
 | 
				
			||||||
			keys
 | 
								erase(_VERSION_, keys)
 | 
				
			||||||
				.filter(key => key != _VERSION_)
 | 
					 | 
				
			||||||
				.map(key => caches.delete(key))
 | 
									.map(key => caches.delete(key))
 | 
				
			||||||
		))
 | 
							))
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,3 +13,7 @@ export function concat<T>(xss: T[][]): T[] {
 | 
				
			||||||
export function intersperse<T>(sep: T, xs: T[]): T[] {
 | 
					export function intersperse<T>(sep: T, xs: T[]): T[] {
 | 
				
			||||||
	return concat(xs.map(x => [sep, x])).slice(1);
 | 
						return concat(xs.map(x => [sep, x])).slice(1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function erase<T>(x: T, xs: T[]): T[] {
 | 
				
			||||||
 | 
						return xs.filter(y => x !== y);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
import Note from '../../../../models/note';
 | 
					import Note from '../../../../models/note';
 | 
				
			||||||
 | 
					import { erase } from '../../../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要
 | 
					トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要
 | 
				
			||||||
| 
						 | 
					@ -85,8 +86,7 @@ export default () => new Promise(async (res, rej) => {
 | 
				
			||||||
	//#endregion
 | 
						//#endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// タグを人気順に並べ替え
 | 
						// タグを人気順に並べ替え
 | 
				
			||||||
	let hots = (await Promise.all(hotsPromises))
 | 
						let hots = erase(null, await Promise.all(hotsPromises))
 | 
				
			||||||
		.filter(x => x != null)
 | 
					 | 
				
			||||||
		.sort((a, b) => b.count - a.count)
 | 
							.sort((a, b) => b.count - a.count)
 | 
				
			||||||
		.map(tag => tag.name)
 | 
							.map(tag => tag.name)
 | 
				
			||||||
		.slice(0, max);
 | 
							.slice(0, max);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@ import Mute from '../../../../models/mute';
 | 
				
			||||||
import { getFriendIds } from '../../common/get-friends';
 | 
					import { getFriendIds } from '../../common/get-friends';
 | 
				
			||||||
import { pack } from '../../../../models/note';
 | 
					import { pack } from '../../../../models/note';
 | 
				
			||||||
import getParams from '../../get-params';
 | 
					import getParams from '../../get-params';
 | 
				
			||||||
 | 
					import { erase } from '../../../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const meta = {
 | 
					export const meta = {
 | 
				
			||||||
	desc: {
 | 
						desc: {
 | 
				
			||||||
| 
						 | 
					@ -103,23 +104,23 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
 | 
				
			||||||
	if (psErr) throw psErr;
 | 
						if (psErr) throw psErr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ps.includeUserUsernames != null) {
 | 
						if (ps.includeUserUsernames != null) {
 | 
				
			||||||
		const ids = (await Promise.all(ps.includeUserUsernames.map(async (username) => {
 | 
							const ids = erase(null, await Promise.all(ps.includeUserUsernames.map(async (username) => {
 | 
				
			||||||
			const _user = await User.findOne({
 | 
								const _user = await User.findOne({
 | 
				
			||||||
				usernameLower: username.toLowerCase()
 | 
									usernameLower: username.toLowerCase()
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
			return _user ? _user._id : null;
 | 
								return _user ? _user._id : null;
 | 
				
			||||||
		}))).filter(id => id != null);
 | 
							})));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ids.forEach(id => ps.includeUserIds.push(id));
 | 
							ids.forEach(id => ps.includeUserIds.push(id));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ps.excludeUserUsernames != null) {
 | 
						if (ps.excludeUserUsernames != null) {
 | 
				
			||||||
		const ids = (await Promise.all(ps.excludeUserUsernames.map(async (username) => {
 | 
							const ids = erase(null, await Promise.all(ps.excludeUserUsernames.map(async (username) => {
 | 
				
			||||||
			const _user = await User.findOne({
 | 
								const _user = await User.findOne({
 | 
				
			||||||
				usernameLower: username.toLowerCase()
 | 
									usernameLower: username.toLowerCase()
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
			return _user ? _user._id : null;
 | 
								return _user ? _user._id : null;
 | 
				
			||||||
		}))).filter(id => id != null);
 | 
							})));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ids.forEach(id => ps.excludeUserIds.push(id));
 | 
							ids.forEach(id => ps.excludeUserIds.push(id));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,7 @@ import isQuote from '../../misc/is-quote';
 | 
				
			||||||
import { TextElementMention } from '../../mfm/parse/elements/mention';
 | 
					import { TextElementMention } from '../../mfm/parse/elements/mention';
 | 
				
			||||||
import { TextElementHashtag } from '../../mfm/parse/elements/hashtag';
 | 
					import { TextElementHashtag } from '../../mfm/parse/elements/hashtag';
 | 
				
			||||||
import { updateNoteStats } from '../update-chart';
 | 
					import { updateNoteStats } from '../update-chart';
 | 
				
			||||||
 | 
					import { erase } from '../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
 | 
					type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,7 +104,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
 | 
				
			||||||
	if (data.viaMobile == null) data.viaMobile = false;
 | 
						if (data.viaMobile == null) data.viaMobile = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (data.visibleUsers) {
 | 
						if (data.visibleUsers) {
 | 
				
			||||||
		data.visibleUsers = data.visibleUsers.filter(x => x != null);
 | 
							data.visibleUsers = erase(null, data.visibleUsers);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (data.reply && data.reply.deletedAt != null) {
 | 
						if (data.reply && data.reply.deletedAt != null) {
 | 
				
			||||||
| 
						 | 
					@ -547,13 +548,13 @@ async function extractMentionedUsers(tokens: ReturnType<typeof parse>): Promise<
 | 
				
			||||||
	)];
 | 
						)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const mentionedUsers = [...new Set(
 | 
						const mentionedUsers = [...new Set(
 | 
				
			||||||
		(await Promise.all(mentionTokens.map(async m => {
 | 
							erase(null, await Promise.all(mentionTokens.map(async m => {
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
				return await resolveUser(m.username, m.host);
 | 
									return await resolveUser(m.username, m.host);
 | 
				
			||||||
			} catch (e) {
 | 
								} catch (e) {
 | 
				
			||||||
				return null;
 | 
									return null;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}))).filter(x => x != null)
 | 
							})))
 | 
				
			||||||
	)];
 | 
						)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return mentionedUsers;
 | 
						return mentionedUsers;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue