Created
February 4, 2014 01:11
-
-
Save markandrus/8795723 to your computer and use it in GitHub Desktop.
Do-notation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This supports more cases but removes support for if-statements. | |
macro $do { | |
// Base Cases | |
case {_ { $ma:expr } } => { | |
return #{ | |
function() { | |
return $ma | |
}() | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } var $($x:ident = $y:expr) (var) ... return $do { $retDo ... } } } => { | |
return #{ | |
($do { $rhsDo ... }).map(function($a) { | |
$(var $x = $y;) ... | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } return $do { $retDo ... } } } => { | |
return #{ | |
($do { $rhsDo ... }).map(function($a) { | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } var $($x:ident = $y:expr) (var) ... return $do { $retDo ... } } } => { | |
return #{ | |
($do { $rhsDo ... }).map(function() { | |
$(var $x = $y;) ... | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } return $do { $retDo ... } } } => { | |
return #{ | |
($do { $rhsDo ... }).map(function() { | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr var $($x:ident = $y:expr) (var) ... return $do { $retDo ... } } } => { | |
return #{ | |
$ma.map(function($a) { | |
$(var $x = $y;) ... | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr return $do { $retDo ... } } } => { | |
return #{ | |
$ma.map(function($a) { | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $ma:expr var $($x:ident = $y:expr) (var) ... return $do { $retDo ... } } } => { | |
return #{ | |
$ma.map(function() { | |
$(var $x = $y;) ... | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $ma:expr return $do { $retDo ... } } } => { | |
return #{ | |
$ma.map(function() { | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } var $($x:ident = $y:expr) (var) ... $do { $retDo ... } } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function($a) { | |
$(var $x = $y;) ... | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } $do { $retDo ... } } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function($a) { | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } var $($x:ident = $y:expr) (var) ... $do { $retDo ... } } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function() { | |
$(var $x = $y;) ... | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } $do { $retDo ... } } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function() { | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr var $($x:ident = $y:expr) (var) ... $do { $retDo ... } } } => { | |
return #{ | |
$ma.chain(function($a) { | |
$(var $x = $y;) ... | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr $do { $retDo ... } } } => { | |
return #{ | |
$ma.chain(function($a) { | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $ma:expr var $($x:ident = $y:expr) (var) ... $do { $retDo ... } } } => { | |
return #{ | |
$ma.chain(function() { | |
$(var $x = $y;) ... | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $ma:expr $do { $retDo ... } } } => { | |
return #{ | |
$ma.chain(function() { | |
return $do { $retDo ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } var $($x:ident = $y:expr) (var) ... return $mb:expr } } => { | |
return #{ | |
($do { $rhsDo ... }).map(function($a) { | |
$(var $x = $y;) ... | |
return $mb | |
}) | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } return $mb:expr } } => { | |
return #{ | |
($do { $rhsDo ... }).map(function($a) { | |
return $mb | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } var $($x:ident = $y:expr) (var) ... return $mb:expr } } => { | |
return #{ | |
($do { $rhsDo ... }).map(function() { | |
$(var $x = $y;) ... | |
return $mb | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } return $mb:expr } } => { | |
return #{ | |
($do { $rhsDo ... }).map(function() { | |
return $mb | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr var $($x:ident = $y:expr) (var) ... return $mb:expr } } => { | |
return #{ | |
$ma.map(function($a) { | |
$(var $x = $y;) ... | |
return $mb | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr return $mb:expr } } => { | |
return #{ | |
$ma.map(function($a) { | |
return $mb | |
}) | |
} | |
} | |
case {_ { $ma:expr var $($x:ident = $y:expr) (var) ... return $mb:expr } } => { | |
return #{ | |
$ma.map(function() { | |
$(var $x = $y;) ... | |
return $mb | |
}) | |
} | |
} | |
case {_ { $ma:expr return $mb:expr } } => { | |
return #{ | |
$ma.map(function() { | |
return $mb | |
}) | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } var $($x:ident = $y:expr) (var) ... $b:expr } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function($a) { | |
$(var $x = $y;) ... | |
return $b | |
}) | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } $b:expr } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function($a) { | |
return $b | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } var $($x:ident = $y:expr) (var) ... $b:expr } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function() { | |
$(var $x = $y;) ... | |
return $b | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } $b:expr } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function() { | |
return $b | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr var $($x:ident = $y:expr) (var) ... $b:expr } } => { | |
return #{ | |
$ma.chain(function($a) { | |
$(var $x = $y;) ... | |
return $b | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr $b:expr } } => { | |
return #{ | |
$ma.chain(function($a) { | |
return $b | |
}) | |
} | |
} | |
case {_ { $ma:expr var $($x:ident = $y:expr) (var) ... $b:expr } } => { | |
return #{ | |
$ma.chain(function() { | |
$(var $x = $y;) ... | |
return $b | |
}) | |
} | |
} | |
case {_ { $ma:expr $b:expr } } => { | |
return #{ | |
$ma.chain(function() { | |
return $b | |
}) | |
} | |
} | |
// Recursive Cases | |
case {_ { var $x:ident = $y:expr $rest ... } } => { | |
return #{ | |
function() { | |
var $x = $y | |
return $do { $rest ... } | |
}() | |
} | |
} | |
case {_ { $a:ident <- $do { $rhsDo ... } $rest ... } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function($a) { | |
return $do { $rest ... } | |
}) | |
} | |
} | |
case {_ { $a:ident <- $ma:expr $rest ... } } => { | |
return #{ | |
$ma.chain(function($a) { | |
return $do { $rest ... } | |
}) | |
} | |
} | |
case {_ { $do { $rhsDo ... } $rest ... } } => { | |
return #{ | |
($do { $rhsDo ... }).chain(function() { | |
return $do { $rest ... } | |
}) | |
} | |
} | |
case {_ { $ma:expr $rest ... } } => { | |
return #{ | |
$ma.chain(function() { | |
return $do { $rest ... } | |
}) | |
} | |
} | |
} | |
export $do; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment