ig-types 6.20.4 → 6.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/Date.js +9 -0
  2. package/Promise.js +16 -0
  3. package/README.md +185 -14
  4. package/package.json +1 -1
package/Date.js CHANGED
@@ -15,6 +15,15 @@ var object = require('ig-object')
15
15
  var DateMixin =
16
16
  module.DateMixin =
17
17
  object.Mixin('DateMixin', 'soft', {
18
+ hires: function(){
19
+ return typeof(process) != 'undefined' ?
20
+ performance.timeOrigin + performance.now()
21
+ : performance.timing.navigationStart + performance.now() },
22
+ hiresTimeStamp: function(){
23
+ var t = this.hires()
24
+ var date = new this(t)
25
+ return date.getTimeStamp(true) + (''+(t-date.getTime())).slice(1) },
26
+
18
27
  timeStamp: function(...args){
19
28
  return (new this()).getTimeStamp(...args) },
20
29
  fromTimeStamp: function(ts){
package/Promise.js CHANGED
@@ -801,6 +801,22 @@ object.Mixin('PromiseMixin', 'soft', {
801
801
  iter: IterablePromise,
802
802
  interactive: InteractivePromise,
803
803
  cooperative: CooperativePromise,
804
+
805
+ awaitOrRun: function(data, func){
806
+ data = [...arguments]
807
+ func = data.pop()
808
+ // ceck if we need to await...
809
+ return data
810
+ .reduce(function(res, e){
811
+ return res
812
+ || e instanceof Promise }, false) ?
813
+ // NOTE: we will not reach this on empty data...
814
+ (data.length > 1 ?
815
+ Promise.all(data)
816
+ .then(function(res){
817
+ return func(...res) })
818
+ : data[0].then(func))
819
+ : func(...data) },
804
820
  })
805
821
 
806
822
  PromiseMixin(Promise)
package/README.md CHANGED
@@ -94,6 +94,8 @@ Library of JavaScript type extensions, types and utilities.
94
94
  - [Promise proxies](#promise-proxies)
95
95
  - [`<promise>.as(..)`](#promiseas)
96
96
  - [`<promise-proxy>.<method>(..)`](#promise-proxymethod)
97
+ - [Promise utilities](#promise-utilities)
98
+ - [`Promise.awaitOrRun(..)`](#promiseawaitorrun)
97
99
  - [Generator extensions and utilities](#generator-extensions-and-utilities)
98
100
  - [The basics](#the-basics)
99
101
  - [`generator.Generator`](#generatorgenerator)
@@ -160,6 +162,7 @@ Library of JavaScript type extensions, types and utilities.
160
162
  - [Event](#event)
161
163
  - [`event.Eventfull(..)`](#eventeventfull)
162
164
  - [`event.Event(..)`](#eventevent)
165
+ - [`event.PureEvent(..)`](#eventpureevent)
163
166
  - [`event.TRIGGER`](#eventtrigger)
164
167
  - [`event.EventHandlerMixin`](#eventeventhandlermixin)
165
168
  - [`<obj>.on(..)`](#objon)
@@ -635,11 +638,17 @@ Compare to arrays ignoring element order and count.
635
638
  Sort array as a different array.
636
639
  ```bnf
637
640
  <array>.sortAs(<other>)
641
+ <array>.sortAs(<other>, 'head')
642
+ -> <array>
643
+
644
+ <array>.sortAs(<other>, 'tail')
638
645
  -> <array>
639
646
  ```
640
647
 
641
648
  Elements not present in `<other>` retain their relative order and are
642
- placed after the sorted elements.
649
+ placed after the sorted elements if `'head'` (i.e. _"sorted at head of
650
+ array"_) is passed as second argument (default) and before them if
651
+ `'tail'` (_"sorted at tail"_) is passed.
643
652
 
644
653
  Example:
645
654
  ```javascript
@@ -1992,6 +2001,22 @@ the main `<promise>` is resolved.
1992
2001
 
1993
2002
 
1994
2003
 
2004
+ ### Promise utilities
2005
+
2006
+ #### `Promise.awaitOrRun(..)`
2007
+
2008
+ Await for inputs if any of them is a promise and then run a function with
2009
+ the results, otherwise run the function in sync.
2010
+
2011
+ ```dnf
2012
+ Promise.awaitOrRun(<value>, <func>)
2013
+ Promise.awaitOrRun(<value>, .. , <func>)
2014
+ -> <promise(value)>
2015
+ -> <value>
2016
+ ```
2017
+
2018
+
2019
+
1995
2020
  ## Generator extensions and utilities
1996
2021
 
1997
2022
  ```javascript
@@ -2829,6 +2854,9 @@ otherwise [`.unorderedRename(..)`](#unique-key-mapunorderedrename) is called.
2829
2854
 
2830
2855
  ## Event
2831
2856
 
2857
+ This module defines a set of pure-JavaScript event-like method constructors
2858
+ and utilities.
2859
+
2832
2860
  ```javascript
2833
2861
  var event = require('ig-types/event')
2834
2862
  ```
@@ -2836,60 +2864,199 @@ var event = require('ig-types/event')
2836
2864
 
2837
2865
  ### `event.Eventfull(..)`
2838
2866
 
2839
- <!-- XXX -->
2867
+ Create and eventful method.
2868
+ ```dnf
2869
+ event.Eventfull(<name>[, <options>])
2870
+ event.Eventfull(<name>, <func>[, <options>])
2871
+ -> <method>
2872
+ ```
2873
+
2874
+ An eventful method is a method that can be called either directly or via
2875
+ `.trigger(<method-name>, ..)`.
2876
+
2877
+
2878
+ Calling an eventful method will call `<func>(..)` if defined and will
2879
+ trigger the eventful method's handlers trigger, either after `<func>(..)`
2880
+ returns or when `<hander>(..)` is called within `<func>(..)`.
2881
+ ```dnf
2882
+ <method>(..)
2883
+ -> <value>
2884
+ ```
2885
+
2886
+ Note that if `<func>(..)` returns `undefined` then `<method>(..)` will
2887
+ return either `this` or `undefined` depending on `<options>.defaultReturn`
2888
+ being set to `'context'` (default) or `undefined` resp.
2889
+
2890
+
2891
+ Handlers can be bound to an eventful method via `.on(<method-name>, ...)`,
2892
+ unbound via `.off(<method-name>)`,
2893
+ see: [`event.EventHandlerMixin`](#eventeventhandlermixin) for more info.
2894
+
2895
+ ```dnf
2896
+ <handler>(<event-name>, ...)
2897
+ ```
2898
+
2899
+
2900
+ The event `<func>(..)` gets the `<handle-func>(..)` as first argument
2901
+ followed by the arguments passed to `<method>(..)` when called.
2902
+ ```dnf
2903
+ <func>(<handle-func>, ...)
2904
+ -> <value>
2905
+ ```
2906
+
2907
+ `<handle-func>(..)` controls when the event handlers are called.
2908
+ ```dnf
2909
+ <handle-func>()
2910
+ <handle-func>(true)
2911
+ -> true
2912
+ -> false
2913
+
2914
+ <handle-func>(true, ...)
2915
+ -> true
2916
+ -> false
2917
+ ```
2918
+
2919
+ Calling `<handle-func>(..)` is optional, if not called the handlers will
2920
+ get triggered after `<func>(..)` returns.
2921
+
2922
+
2923
+ Passing `false` to `<handle-func>(..)` will prevent the event handlers
2924
+ from being called.
2925
+ ```dnf
2926
+ <handle-func>(false)
2927
+ -> undefined
2928
+ ```
2929
+
2930
+ Note that for `async` event `<func>(..)` it might be useful to trigger
2931
+ the handlers after the promise resolves, this can be done by first calling
2932
+ `<handle-func>(false)` to prevent the handlers from being triggered as soon
2933
+ as the promise is returned and after an appropriate `await`ing calling
2934
+ `<handle-func>()` to actually trigger the handlers.
2935
+
2936
+ Example:
2937
+ ```javascript
2938
+ var evt = event.Event('evt', async function(handler, ...args){
2939
+ handler(false)
2940
+ var value = await something()
2941
+ handler()
2942
+ return value })
2943
+ ```
2944
+
2945
+
2946
+ **Special case: `<event-commands>`**
2947
+
2948
+ `<event-command>`s are instances of `EventCommand` that are handled by
2949
+ event methods in a special way.
2950
+
2951
+ ```dnf
2952
+ <method>(<event-command>, ...)
2953
+ -> <value>
2954
+
2955
+ <func>(<handle-func>, <event-command>, ...)
2956
+ -> <value>
2957
+ ```
2958
+
2959
+ `EventCommand` instance can be passed as the first argument of `<method>(..)`,
2960
+ in this case the event function will get it but the event handlers
2961
+ will not.
2962
+
2963
+ This is done to be able to externally pass commands to event methods
2964
+ that get handled in a special way by the function but not passed to
2965
+ the event handlers.
2966
+
2967
+ For an example of a built-in `<event-command>` see: [`event.TRIGGER`](#eventtrigger)
2968
+
2840
2969
 
2841
2970
 
2842
2971
  ### `event.Event(..)`
2843
2972
 
2844
- <!-- XXX -->
2973
+ Extends `Eventful(..)` adding ability to bind events via the resulting
2974
+ method directly by passing it a function.
2975
+
2976
+ ```dnf
2977
+ <method>(<handler>)
2978
+ -> <this>
2979
+ ```
2980
+
2981
+
2982
+ ### `event.PureEvent(..)`
2983
+
2984
+ Like `Event(..)` but produces an event method that can only be triggered
2985
+ via .trigger(name, ...), calling this is a no-op.
2986
+
2845
2987
 
2846
2988
 
2847
2989
  ### `event.TRIGGER`
2848
2990
 
2849
- <!-- XXX -->
2991
+ Special value (`<event-command>`) that when passed to an event method as
2992
+ first argument will force it to trigger event if the first argument was
2993
+ a function.
2850
2994
 
2851
2995
 
2852
- Special value when passed to an event method as first argument will force it
2853
- to trigger event if the first argument was a function.
2854
2996
 
2855
2997
  ### `event.EventHandlerMixin`
2856
2998
 
2857
- <!-- XXX -->
2999
+ A _mixin_ defining the basic event API.
3000
+
3001
+ For more info on mixins see:
3002
+ https://github.com/flynx/object.js#mixin
2858
3003
 
2859
3004
 
2860
3005
  #### `<obj>.on(..)`
2861
3006
 
2862
- <!-- XXX -->
3007
+ Bind a handler to an _event_ or an _eventful_ method.
3008
+ ```dnf
3009
+ <obj>.on(<event-name>, <handler>)
3010
+ -> <obj>
3011
+ ```
2863
3012
 
2864
3013
 
2865
3014
  #### `<obj>.one(..)`
2866
3015
 
2867
- <!-- XXX -->
3016
+ Like `<obj>.on(..)` but the `<handler>` will be called only once.
3017
+ ```dnf
3018
+ <obj>.one(<event-name>, <handler>)
3019
+ -> <obj>
3020
+ ```
2868
3021
 
2869
3022
 
2870
3023
  #### `<obj>.off(..)`
2871
3024
 
2872
- <!-- XXX -->
3025
+ Unbind `<handler>` from _event_.
3026
+ ```dnf
3027
+ <obj>.off(<event-name>, <handler>)
3028
+ -> <obj>
3029
+ ```
2873
3030
 
2874
3031
 
2875
3032
  #### `<obj>.trigger(..)`
2876
3033
 
2877
- <!-- XXX -->
3034
+ Trigger an _event_.
3035
+ ```dnf
3036
+ <obj>.trigger(<event-name>)
3037
+ <obj>.trigger(<event-name>, ...)
3038
+ -> <obj>
3039
+ ```
3040
+
2878
3041
 
2879
3042
 
2880
3043
  ### `event.EventDocMixin`
2881
3044
 
2882
- <!-- XXX -->
3045
+ A _mixin_ defining the basic event introspection API.
3046
+
3047
+ For more info on mixins see:
3048
+ https://github.com/flynx/object.js#mixin
2883
3049
 
2884
3050
 
2885
3051
  #### `<obj>.eventfull`
2886
3052
 
2887
- <!-- XXX -->
3053
+ Property listing the _eventful_ method names in the current context.
2888
3054
 
2889
3055
 
2890
3056
  #### `<obj>.events`
2891
3057
 
2892
- <!-- XXX -->
3058
+ Property listing the _event_ method names in the current context, this
3059
+ also will include _eventful_ method names.
2893
3060
 
2894
3061
 
2895
3062
  ### `event.EventMixin`
@@ -2897,6 +3064,10 @@ to trigger event if the first argument was a function.
2897
3064
  Combines [`event.EventHandlerMixin`](#eventeventhandlermixin) and
2898
3065
  [`event.EventDocMixin`](#eventeventdocmixin).
2899
3066
 
3067
+ For more info on mixins see:
3068
+ https://github.com/flynx/object.js#mixin
3069
+
3070
+
2900
3071
  ## Runner
2901
3072
 
2902
3073
  ```javascript
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ig-types",
3
- "version": "6.20.4",
3
+ "version": "6.22.0",
4
4
  "description": "Generic JavaScript types and type extensions...",
5
5
  "main": "main.js",
6
6
  "scripts": {