{"id":26665319,"url":"https://github.com/elsehow/a-bit-of","last_synced_at":"2025-03-25T17:36:50.656Z","repository":{"id":57171543,"uuid":"46698817","full_name":"elsehow/a-bit-of","owner":"elsehow","description":"a functional-reactive approach to flow-based programming (a la max/msp, puredata, vvvv)","archived":false,"fork":false,"pushed_at":"2015-12-12T21:15:32.000Z","size":87,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-18T19:55:40.286Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elsehow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-11-23T05:33:41.000Z","updated_at":"2016-07-19T05:07:50.000Z","dependencies_parsed_at":"2022-08-24T14:41:16.768Z","dependency_job_id":null,"html_url":"https://github.com/elsehow/a-bit-of","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elsehow%2Fa-bit-of","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elsehow%2Fa-bit-of/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elsehow%2Fa-bit-of/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elsehow%2Fa-bit-of/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elsehow","download_url":"https://codeload.github.com/elsehow/a-bit-of/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245511365,"owners_count":20627375,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-25T17:36:49.932Z","updated_at":"2025-03-25T17:36:50.635Z","avatar_url":"https://github.com/elsehow.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# a bit of\n\na functional-reactive approach to flow-based programming\n\nmake chains of functions, a-la max/msp, puredata, vvvv, etc, to program with streaming sources of data\n\nupdate processing/output functions without disturbing your source streams.\n\n## components\n\ncomponents are attached together to process streams.\n\ncomponents are made out of a function. general pattern:\n\n```javascript\nvar c = new Component(e =\u003e \n  console.log('err', err)).update(myFunction)\n```\n\nthe component's consturctor takes an error callback. you can set the component's function by calling its `update` method.\n\nthere are three types of components:\n\n### origin\n\norigin's functions take nothing\n\nthey reutrn a list of [ [ emitter, 'event' ] ..]\n\n```javascript\nfunction originFn () {\n  // port is an EventEmitter\n  port = serialport('/dev/tty.MindWave')\n  socket = websocket('ws://some-server')\n  // we want to make a stream of its 'data' events\n  return [\n    [port, 'data'],\n    [socket, 'event'],\n  ]\n}\n\nvar o = new abitof.Origin(e =\u003e \n  console.log('err', e)).update(originFn)\n```\n\n### transform\n\ntransform function's take an arbitrary number of streams, and return a list of streams\n\n```javascript\nfunction transformFn (deviceStream, socketStream) {\n  // return a stream of fft'd buffers \n  return [\n    deviceStream.bufferWithCount(512).map(fft),\n    socketStream.filter(someFilterFn),\n  ]\n}\n\nvar t = new abitof.Transform(e =\u003e \n  console.log('err', e).update(trasnformFn)\n```\n\n\n### endpoints \n\nendpoint functions return a list of functions.\n\nthe functions handle values from inputs stream\n\n```javascript\nfunction endpointFn (fftStream) {\n  //  endpoints setup logic\n  midiServer.start()\n  // return handle(), and, optionally, a taredown () function\n  return [\n    function (x) { \n      midiServer.send(midiFromAlphaWaves(x));\n      midiServer.send(midiFromRoomEvents(x));\n    }\n  ]\n}\n\nvar e = new Endpoint (e =\u003e \n  console.log('err', e).update(endpointFn)\n```\n\noptionally, endpoint functions can return a `taredown()` method, which gets triggered when a new update() function is passed through\n\nuse it for, e.g., removing divs so that you can re-add them.\n\n```javascript\nfunction endpointFn (fftStream) {\n  //  endpoints setup logic\n  midiServer.start()\n  // return handle(), and, optionally, a taredown () function\n  return {\n    handlers: [\n      function (x) { \n        midiServer.send(midiFromAlphaWaves(x))\n      }\n    ],\n    // taredown\n    taredown: () =\u003e {\n      midiServer.stop()\n    }\n}\n```\n## attaching components together\n\n```javascript\nvar abitof = require('a-bit-of')\n\n// make components\nvar o = new abitof.Origin(someOriginFn)\nvar t = new abitof.Transform(someTransformFn)\nvar e = new abitof.Endpoint(someEndpointFn)\n\n// attach them together\no.attach(t).attach(e)\n```\n\n## api\n\n### origin\n\nupdate(originFn)\n\nattach(someDownstreamComponent)\n\n### transform\n\nupdate(transformFn)\n\nattach(someDownstreamComponent)\n\n## endpoint\n\nupdate(transformFn)\n\nNOTE: you can't attach anything to endpoints. nothing can be downstream from an endpoint.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felsehow%2Fa-bit-of","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felsehow%2Fa-bit-of","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felsehow%2Fa-bit-of/lists"}