sam
05/31/2019, 2:22 AMDerek Berner
05/31/2019, 1:40 PMDerek Berner
05/31/2019, 1:43 PMsam
05/31/2019, 1:43 PMsam
05/31/2019, 1:43 PMDerek Berner
05/31/2019, 1:43 PMtransaction { /* do your thing */ }
is better 😉sam
05/31/2019, 1:44 PMDerek Berner
05/31/2019, 1:44 PMsam
05/31/2019, 1:44 PMDerek Berner
05/31/2019, 1:44 PMsam
05/31/2019, 1:44 PMDerek Berner
05/31/2019, 1:45 PMDerek Berner
05/31/2019, 1:45 PMDerek Berner
05/31/2019, 1:46 PMsam
05/31/2019, 1:47 PMsam
05/31/2019, 1:47 PMsam
05/31/2019, 1:47 PMDerek Berner
05/31/2019, 1:48 PM@Transaction
is that some runtime engine must identify the method reflectively, wrap it in a dynamic proxy that handles transaction management, and then hand the proxy to the consumer, at boot timesam
05/31/2019, 1:49 PMsam
05/31/2019, 1:49 PMsam
05/31/2019, 1:49 PMsam
05/31/2019, 1:49 PMDerek Berner
05/31/2019, 1:50 PMsam
05/31/2019, 1:50 PMsam
05/31/2019, 1:51 PMDerek Berner
05/31/2019, 1:51 PMDerek Berner
05/31/2019, 1:52 PMDerek Berner
05/31/2019, 1:56 PMDerek Berner
05/31/2019, 1:56 PMDerek Berner
05/31/2019, 1:56 PMDerek Berner
05/31/2019, 2:00 PMfun <R,A> transaction(suspend f: (R) -> A): (R) -> IO<A>
which tells you from its signature alone about what it's doing and won't let you get away with anything stupidDerek Berner
05/31/2019, 2:00 PM