Skip to content

Instantly share code, notes, and snippets.

@markandrus
Created February 4, 2014 01:11
Show Gist options
  • Save markandrus/8795723 to your computer and use it in GitHub Desktop.
Save markandrus/8795723 to your computer and use it in GitHub Desktop.
Do-notation
// 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