rvion / CushyStudio

πŸ›‹ The AI and Generative Art platform for everyone
https://docs.cushystudio.com/
GNU Affero General Public License v3.0
645 stars 45 forks source link

publish/subscribe api as an alternative to shared widgets #214

Closed Globidev closed 3 months ago

Globidev commented 3 months ago

API

// simple "pubsub" using a topic name
const num = ui.int()
    .publish('num', (self) => self.value)
const numPlusOne = ui.int()
    .subscribe<number>('num', (num, self) => self.setValue(num + 1))

// or with an explicit handle for type safety
//                          πŸ‘‡ contract
const channel = new Channel<{ text: string }>() // πŸ“ ideally, it should be created in a more global scope
const text = ui.text()
    .publish(channel, (self) => ({ text: self.value }))
const textRepeatedTwice = ui.text()
    .subscribe(channel, (val, self) => self.setValue(val.text.repeat(2)))
//                       πŸ‘† inferred correctly

// or fetching channel values manually, possibly combining them
const textRepeatedNumTimes = ui.text()
    .addReaction(
        (self) => ({ 
            text: self.consume(channel)?.text ?? '',
            times: self.consume<number>('num') ?? 1
        }),
        (val, self) => self.setValue(val.text.repeat(val.times))
    )

return ui.fields({
    num,
    numPlusOne,
    text,
    textRepeatedTwice,
    textRepeatedNumTimes
})

https://github.com/rvion/CushyStudio/assets/2079561/84d0d4c0-f879-4d9f-b874-0e274d2d3345

Possible improvements

rvion commented 3 months ago

amazing work πŸ”₯πŸ”₯