Add getSubFeeds to feeds

This commit is contained in:
Jon Staab
2024-04-15 17:19:29 -07:00
parent 0ae07735a9
commit efa5307df1
6 changed files with 28 additions and 30 deletions
+6 -13
View File
@@ -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
View File
@@ -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 -1
View File
@@ -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.",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@coracle.social/network",
"version": "0.0.7",
"version": "0.0.8",
"author": "hodlbod",
"license": "MIT",
"description": "Utilities for connecting with nostr relays.",