Add erase function (#2641)
This commit is contained in:
parent
3cace734c7
commit
00d79487cd
|
@ -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…
Reference in New Issue