Add getSubFeeds to feeds
This commit is contained in:
@@ -2,31 +2,24 @@ import {uniq, now, isNil} from '@coracle.social/lib'
|
||||
import type {Rumor, Filter} from '@coracle.social/util'
|
||||
import {Tags, getIdFilters, mergeFilters} from '@coracle.social/util'
|
||||
import type {RequestItem, DVMItem, Scope, Feed, DynamicFilter, FeedOptions} from './core'
|
||||
import {FeedType} from './core'
|
||||
import {FeedType, getSubFeeds} from './core'
|
||||
|
||||
export class FeedCompiler<E extends Rumor> {
|
||||
constructor(readonly options: FeedOptions<E>) {}
|
||||
|
||||
walk([type, ...feed]: Feed, visit: (feed: Feed) => void) {
|
||||
visit([type, ...feed] as Feed)
|
||||
walk(feed: Feed, visit: (feed: Feed) => void) {
|
||||
visit(feed)
|
||||
|
||||
switch(type) {
|
||||
case FeedType.Difference:
|
||||
case FeedType.Intersection:
|
||||
case FeedType.SymmetricDifference:
|
||||
case FeedType.Union:
|
||||
for (const subFeed of feed) {
|
||||
this.walk(subFeed as Feed, visit)
|
||||
}
|
||||
for (const subFeed of getSubFeeds(feed)) {
|
||||
this.walk(subFeed, visit)
|
||||
}
|
||||
}
|
||||
|
||||
canCompile([type, ...feed]: Feed): boolean {
|
||||
switch(type) {
|
||||
case FeedType.Relay:
|
||||
return (feed.slice(1) as Feed[]).every(this.canCompile)
|
||||
case FeedType.Union:
|
||||
return (feed as Feed[]).every(this.canCompile)
|
||||
return getSubFeeds([type, ...feed] as Feed).every(this.canCompile)
|
||||
case FeedType.Filter:
|
||||
case FeedType.List:
|
||||
case FeedType.LOL:
|
||||
|
||||
+18
-3
@@ -13,10 +13,11 @@ export enum FeedType {
|
||||
}
|
||||
|
||||
export enum Scope {
|
||||
Self = "self",
|
||||
Global = "global",
|
||||
Follows = "follows",
|
||||
Followers = "followers",
|
||||
Follows = "follows",
|
||||
Global = "global",
|
||||
Network = "network",
|
||||
Self = "self",
|
||||
}
|
||||
|
||||
export type DynamicFilter = Filter & {
|
||||
@@ -59,6 +60,20 @@ export const listFeed = (...addresses: string[]) => [FeedType.List, ...addresses
|
||||
export const lolFeed = (...addresses: string[]) => [FeedType.LOL, ...addresses] as Feed
|
||||
export const dvmFeed = (...requests: DVMItem[]) => [FeedType.DVM, ...requests] as Feed
|
||||
|
||||
export const getSubFeeds = ([type, ...feed]: Feed): Feed[] => {
|
||||
switch (type) {
|
||||
case FeedType.Relay:
|
||||
return feed.slice(1) as Feed[]
|
||||
case FeedType.Difference:
|
||||
case FeedType.Intersection:
|
||||
case FeedType.SymmetricDifference:
|
||||
case FeedType.Union:
|
||||
return feed as Feed[]
|
||||
default:
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
export type RequestItem = {
|
||||
relays: string[]
|
||||
filters: Filter[]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@coracle.social/feeds",
|
||||
"version": "0.0.1",
|
||||
"version": "0.0.2",
|
||||
"author": "hodlbod",
|
||||
"license": "MIT",
|
||||
"description": "Utilities for building dynamic nostr feeds.",
|
||||
|
||||
Reference in New Issue
Block a user