11"use strict" ;
22
33
4- // Ef a
4+ // Ef a
55// = () -> a
6- // | { tag: "PURE", _0 :: a, _1 :: Void }
7- // | { tag: "MAP", _0 :: b -> a, _1 :: Ef b }
8- // | { tag: "APPLY", _0 :: Ef b, _1 :: Ef (b -> a) }
9- // | { tag: "BIND", _0 :: b -> Ef a, _1 :: Ef b }
6+ // | { Ef a, tag: "PURE", _0 :: a, _1 :: Void }
7+ // | { Ef a, tag: "MAP", _0 :: b -> a, _1 :: Ef b }
8+ // | { Ef a, tag: "APPLY", _0 :: Ef b, _1 :: Ef (b -> a) }
9+ // | { Ef a, tag: "BIND", _0 :: b -> Ef a, _1 :: Ef b }
1010
1111// Operation a b
1212// = { tag: "MAP", _0 :: a -> b }
1515// | { tag: "BIND", _0 :: a -> Ef b }
1616
1717
18- function Ef ( tag , _0 , _1 ) {
19- this . tag = tag ;
20- this . _0 = _0 ;
21- this . _1 = _1 ;
22- }
23-
2418var PURE = "PURE" ;
2519var MAP = "MAP" ;
2620var APPLY = "APPLY" ;
2721var BIND = "BIND" ;
2822var APPLY_FUNC = "APPLY_FUNC" ;
2923
30- exports . liftEffE = function ( eff ) {
31- return eff ;
32- } ;
33-
3424exports . pureE = function ( x ) {
35- return new Ef ( PURE , x ) ;
25+ return mkEf ( PURE , x ) ;
3626} ;
3727
3828exports . mapE = function ( f ) {
3929 return function ( eff ) {
40- return new Ef ( MAP , f , eff ) ;
30+ return mkEf ( MAP , f , eff ) ;
4131 } ;
4232} ;
4333
4434exports . applyE = function ( effF ) {
4535 return function ( eff ) {
46- return new Ef ( APPLY , eff , effF ) ;
36+ return mkEf ( APPLY , eff , effF ) ;
4737 } ;
4838} ;
4939
5040exports . bindE = function ( eff ) {
5141 return function ( f ) {
52- return new Ef ( BIND , f , eff ) ;
42+ return mkEf ( BIND , f , eff ) ;
5343 } ;
5444} ;
5545
56- exports . toEff = function ( inputEff ) {
57- if ( typeof inputEff === "function" ) {
58- return inputEff ;
59- }
60- return function ( ) {
61- var operations = [ ] ;
62- var eff = inputEff ;
63- var res ;
64- var op ;
65- var tag ;
66- effLoop: for ( ; ; ) {
67- tag = eff . tag ;
68- if ( tag !== undefined ) {
69- if ( tag === MAP || tag === BIND || tag === APPLY ) {
70- operations . push ( eff ) ;
71- eff = eff . _1 ;
72- continue ;
73- }
74- // here `tag === PURE`
75- res = eff . _0 ;
76- } else {
77- // here `typeof eff == "function"`
78- res = eff ( ) ;
46+
47+ var mkEf = function ( tag , _0 , _1 ) {
48+ var eff = function eff_ ( ) { return toEff ( eff_ ) }
49+ eff . tag = tag
50+ eff . _0 = _0
51+ eff . _1 = _1
52+ return eff
53+ }
54+
55+ var toEff = function ( inputEff ) {
56+ var operations = [ ] ;
57+ var eff = inputEff ;
58+ var res ;
59+ var op ;
60+ var tag ;
61+ effLoop: for ( ; ; ) {
62+ tag = eff . tag ;
63+ if ( tag !== undefined ) {
64+ if ( tag === MAP || tag === BIND || tag === APPLY ) {
65+ operations . push ( eff ) ;
66+ eff = eff . _1 ;
67+ continue ;
7968 }
69+ // here `tag === PURE`
70+ res = eff . _0 ;
71+ } else {
72+ // here `typeof eff == "function"`
73+ res = eff ( ) ;
74+ }
8075
81- while ( ( op = operations . pop ( ) ) ) {
82- if ( op . tag === MAP ) {
83- res = op . _0 ( res ) ;
84- } else if ( op . tag === APPLY_FUNC ) {
85- res = op . _0 ( res ) ;
86- } else if ( op . tag === APPLY ) {
87- eff = op . _0 ;
88- operations . push ( new Ef ( APPLY_FUNC , res ) ) ;
89- continue effLoop;
90- } else { // op.tag === BIND
91- eff = op . _0 ( res ) ;
92- continue effLoop;
93- }
76+ while ( ( op = operations . pop ( ) ) ) {
77+ if ( op . tag === MAP ) {
78+ res = op . _0 ( res ) ;
79+ } else if ( op . tag === APPLY_FUNC ) {
80+ res = op . _0 ( res ) ;
81+ } else if ( op . tag === APPLY ) {
82+ eff = op . _0 ;
83+ operations . push ( new Ef ( APPLY_FUNC , res ) ) ;
84+ continue effLoop;
85+ } else { // op.tag === BIND
86+ eff = op . _0 ( res ) ;
87+ continue effLoop;
9488 }
95- return res ;
9689 }
97- } ;
90+ return res ;
91+ }
9892} ;
0 commit comments