# https://github.com/tidyverse/purrr/issues/194

conv_pois_norm = function(x, l = l, mean = mean, sd = sd) { 
  
  return(x + sum(rnorm(n = rpois(n = 1, lambda = l), mean = mean, sd = sd)))
  
}
test_func<-function(x,y,z){
  return(x*y+z)
}

suppressPackageStartupMessages(library(purrr))
suppressPackageStartupMessages(library(future))
suppressPackageStartupMessages(library(tibble))
suppressPackageStartupMessages(library(dplyr))

n_simul = 20
mean = 10
sd = 20
l = 10

conv_pois_norm(10, l, mean, sd)
## [1] 178.7025
x <-  tibble(x = rep(0, n_simul))

x%>%mutate(myFuture=map(x,~future(conv_pois_norm(.x,l,mean,sd))))
## # A tibble: 20 x 2
##        x               myFuture
##    <dbl>                 <list>
##  1     0 <S3: SequentialFuture>
##  2     0 <S3: SequentialFuture>
##  3     0 <S3: SequentialFuture>
##  4     0 <S3: SequentialFuture>
##  5     0 <S3: SequentialFuture>
##  6     0 <S3: SequentialFuture>
##  7     0 <S3: SequentialFuture>
##  8     0 <S3: SequentialFuture>
##  9     0 <S3: SequentialFuture>
## 10     0 <S3: SequentialFuture>
## 11     0 <S3: SequentialFuture>
## 12     0 <S3: SequentialFuture>
## 13     0 <S3: SequentialFuture>
## 14     0 <S3: SequentialFuture>
## 15     0 <S3: SequentialFuture>
## 16     0 <S3: SequentialFuture>
## 17     0 <S3: SequentialFuture>
## 18     0 <S3: SequentialFuture>
## 19     0 <S3: SequentialFuture>
## 20     0 <S3: SequentialFuture>
plan(multiprocess)

x1 <- x %>% 
  mutate(myFuture = map(x, ~future(conv_pois_norm(.x, l, mean, sd)))) %>% 
  mutate(myResult = map_dbl(myFuture, ~value(.x)))   # Wait for Resolved


x2=x %>% 
  mutate(myFuture = map(x, function(x) future(conv_pois_norm(x, l, mean, sd)))) %>%
  mutate(myResult = map_dbl(myFuture, function(x) value(x)))   # Wait for Resolved
x1
## # A tibble: 20 x 3
##        x                 myFuture   myResult
##    <dbl>                   <list>      <dbl>
##  1     0 <S3: MultisessionFuture>  24.124709
##  2     0 <S3: MultisessionFuture> 133.147279
##  3     0 <S3: MultisessionFuture>  77.259909
##  4     0 <S3: MultisessionFuture>  62.006424
##  5     0 <S3: MultisessionFuture> 167.232376
##  6     0 <S3: MultisessionFuture> 126.943235
##  7     0 <S3: MultisessionFuture> 235.647280
##  8     0 <S3: MultisessionFuture> 117.916664
##  9     0 <S3: MultisessionFuture> 147.930188
## 10     0 <S3: MultisessionFuture> 133.506784
## 11     0 <S3: MultisessionFuture>   6.515277
## 12     0 <S3: MultisessionFuture>  -1.225545
## 13     0 <S3: MultisessionFuture>  42.013199
## 14     0 <S3: MultisessionFuture> 183.825905
## 15     0 <S3: MultisessionFuture> 197.375499
## 16     0 <S3: MultisessionFuture> 231.904820
## 17     0 <S3: MultisessionFuture> 220.305353
## 18     0 <S3: MultisessionFuture>  77.828652
## 19     0 <S3: MultisessionFuture> 164.860559
## 20     0 <S3: MultisessionFuture> -41.279588
x2
## # A tibble: 20 x 3
##        x                 myFuture   myResult
##    <dbl>                   <list>      <dbl>
##  1     0 <S3: MultisessionFuture> 146.600732
##  2     0 <S3: MultisessionFuture>  15.558313
##  3     0 <S3: MultisessionFuture>  46.501116
##  4     0 <S3: MultisessionFuture>  69.797726
##  5     0 <S3: MultisessionFuture>   8.218662
##  6     0 <S3: MultisessionFuture> 105.904728
##  7     0 <S3: MultisessionFuture>  86.445021
##  8     0 <S3: MultisessionFuture>  36.705090
##  9     0 <S3: MultisessionFuture> 118.391865
## 10     0 <S3: MultisessionFuture>  58.969942
## 11     0 <S3: MultisessionFuture>  56.994735
## 12     0 <S3: MultisessionFuture>  94.765904
## 13     0 <S3: MultisessionFuture>  97.925786
## 14     0 <S3: MultisessionFuture> -12.531112
## 15     0 <S3: MultisessionFuture>  67.223406
## 16     0 <S3: MultisessionFuture>  33.575923
## 17     0 <S3: MultisessionFuture>  75.709936
## 18     0 <S3: MultisessionFuture>  23.637841
## 19     0 <S3: MultisessionFuture> 112.495822
## 20     0 <S3: MultisessionFuture>  40.463457
df<-tibble(x=seq(1,10),y=seq(10,19),z=seq(3,12))
df1=df%>%mutate(ff=pmap(list(x,y,z),function(x,y,z) test_func(x,y,z) ))%>%mutate(ff=as.numeric(ff))

df2=df%>%mutate(myFuture=pmap(list(x,y,z), function(x,y,z) future(test_func(x,y,z)) ))%>%
  mutate(myResult=map_dbl(myFuture, function(x) value(x) ))

df1
## # A tibble: 10 x 4
##        x     y     z    ff
##    <int> <int> <int> <dbl>
##  1     1    10     3    13
##  2     2    11     4    26
##  3     3    12     5    41
##  4     4    13     6    58
##  5     5    14     7    77
##  6     6    15     8    98
##  7     7    16     9   121
##  8     8    17    10   146
##  9     9    18    11   173
## 10    10    19    12   202
df2
## # A tibble: 10 x 5
##        x     y     z                 myFuture myResult
##    <int> <int> <int>                   <list>    <dbl>
##  1     1    10     3 <S3: MultisessionFuture>       13
##  2     2    11     4 <S3: MultisessionFuture>       26
##  3     3    12     5 <S3: MultisessionFuture>       41
##  4     4    13     6 <S3: MultisessionFuture>       58
##  5     5    14     7 <S3: MultisessionFuture>       77
##  6     6    15     8 <S3: MultisessionFuture>       98
##  7     7    16     9 <S3: MultisessionFuture>      121
##  8     8    17    10 <S3: MultisessionFuture>      146
##  9     9    18    11 <S3: MultisessionFuture>      173
## 10    10    19    12 <S3: MultisessionFuture>      202