UNPKG

@wordpress/compose

Version:
8 lines (7 loc) 2.63 kB
{ "version": 3, "sources": ["../../../src/utils/observable-map/index.ts"], "sourcesContent": ["export type ObservableMap< K, V > = {\n\tget: ( name: K ) => V | undefined;\n\tset: ( name: K, value: V ) => void;\n\tdelete: ( name: K ) => void;\n\tsubscribe: ( name: K, listener: () => void ) => () => void;\n};\n\n/**\n * A constructor (factory) for `ObservableMap`, a map-like key/value data structure\n * where the individual entries are observable: using the `subscribe` method, you can\n * subscribe to updates for a particular keys. Each subscriber always observes one\n * specific key and is not notified about any unrelated changes (for different keys)\n * in the `ObservableMap`.\n *\n * @template K The type of the keys in the map.\n * @template V The type of the values in the map.\n * @return A new instance of the `ObservableMap` type.\n */\nexport function observableMap< K, V >(): ObservableMap< K, V > {\n\tconst map = new Map< K, V >();\n\tconst listeners = new Map< K, Set< () => void > >();\n\n\tfunction callListeners( name: K ) {\n\t\tconst list = listeners.get( name );\n\t\tif ( ! list ) {\n\t\t\treturn;\n\t\t}\n\t\tfor ( const listener of list ) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\treturn {\n\t\tget( name ) {\n\t\t\treturn map.get( name );\n\t\t},\n\t\tset( name, value ) {\n\t\t\tmap.set( name, value );\n\t\t\tcallListeners( name );\n\t\t},\n\t\tdelete( name ) {\n\t\t\tmap.delete( name );\n\t\t\tcallListeners( name );\n\t\t},\n\t\tsubscribe( name, listener ) {\n\t\t\tlet list = listeners.get( name );\n\t\t\tif ( ! list ) {\n\t\t\t\tlist = new Set();\n\t\t\t\tlisteners.set( name, list );\n\t\t\t}\n\t\t\tlist.add( listener );\n\n\t\t\treturn () => {\n\t\t\t\tlist.delete( listener );\n\t\t\t\tif ( list.size === 0 ) {\n\t\t\t\t\tlisteners.delete( name );\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t};\n}\n"], "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBO,SAAS,gBAA+C;AAC9D,QAAM,MAAM,oBAAI,IAAY;AAC5B,QAAM,YAAY,oBAAI,IAA4B;AAElD,WAAS,cAAe,MAAU;AACjC,UAAM,OAAO,UAAU,IAAK,IAAK;AACjC,QAAK,CAAE,MAAO;AACb;AAAA,IACD;AACA,eAAY,YAAY,MAAO;AAC9B,eAAS;AAAA,IACV;AAAA,EACD;AAEA,SAAO;AAAA,IACN,IAAK,MAAO;AACX,aAAO,IAAI,IAAK,IAAK;AAAA,IACtB;AAAA,IACA,IAAK,MAAM,OAAQ;AAClB,UAAI,IAAK,MAAM,KAAM;AACrB,oBAAe,IAAK;AAAA,IACrB;AAAA,IACA,OAAQ,MAAO;AACd,UAAI,OAAQ,IAAK;AACjB,oBAAe,IAAK;AAAA,IACrB;AAAA,IACA,UAAW,MAAM,UAAW;AAC3B,UAAI,OAAO,UAAU,IAAK,IAAK;AAC/B,UAAK,CAAE,MAAO;AACb,eAAO,oBAAI,IAAI;AACf,kBAAU,IAAK,MAAM,IAAK;AAAA,MAC3B;AACA,WAAK,IAAK,QAAS;AAEnB,aAAO,MAAM;AACZ,aAAK,OAAQ,QAAS;AACtB,YAAK,KAAK,SAAS,GAAI;AACtB,oBAAU,OAAQ,IAAK;AAAA,QACxB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;", "names": [] }