Skip to content

Instantly share code, notes, and snippets.

View adamw's full-sized avatar

Adam Warski adamw

View GitHub Profile
pragma solidity ^0.4.18;
import "./ERC20Interface.sol";
/**
* Contract that will forward any incoming Ether to the creator of the contract
*/
contract Forwarder {
// Address to which any funds sent to this contract will be forwarded
address public parentAddress;
event EthForwarded(address indexed from, address indexed to, uint256 value);
contract Sender {
function () payable {}
function transfer(address _receiver) payable {
_receiver.transfer(100);
}
}
Feature Akka Akka Typed Monix ZIO
Effect wrapper Future Future Task IO
Evaluation Eager Hybrid: lazy behavior & eager Futures Lazy Lazy
Communication channel type-safety No Yes Yes Yes including errors
Communication channel ActorRef ActorRef[T] MVar[T]/MQueue[T] IOQueue[T]
def handleMessage(msg: CrawlerMessage,
data: CrawlerData
): IO[Nothing, CrawlerData] = msg match {
case Start(url) =>
crawlUrl(data, url)
case CrawlResult(url, links) =>
val data2 = data.copy(inProgress = data.inProgress - url)
links.foldM(data2) {
def handleMessage(msg: CrawlerMessage,
data: CrawlerData
): IO[Nothing, CrawlerData] = msg match {
case Start(url) =>
crawlUrl(data, url)
case CrawlResult(url, links) =>
val data2 = data.copy(inProgress = data.inProgress - url)
links.foldM(data2) {
def crawlUrl(data: CrawlerData, url: Url): IO[Nothing, CrawlerData] = {
if (!data.visitedLinks.contains(url)) {
workerFor(data, url.host).flatMap {
case (data2, workerQueue) =>
workerQueue.offer(url).map { _ =>
data2.copy(
visitedLinks = data.visitedLinks + url,
inProgress = data.inProgress + url
)
}
override def receive: Receive = {
case Crawl(url) =>
// ...
case HttpGetResult(url, Success(body)) =>
getInProgress = false
startHttpGetIfPossible()
val links = parseLinks(body)
master ! CrawlResult(url, links)
override def receive: Receive = {
case Crawl(url) =>
urlsPending = urlsPending :+ url
startHttpGetIfPossible()
// ...
}
private def startHttpGetIfPossible(): Unit = {
urlsPending match {
override def receive: Receive = {
case Start(start) =>
crawlUrl(start)
case CrawlResult(url, links) =>
inProgress -= url
links.foreach { link =>
crawlUrl(link)
referenceCount = referenceCount.updated(link.host,
private def crawlUrl(url: Url): Unit = {
if (!visitedLinks.contains(url)) {
visitedLinks += url
inProgress += url
actorFor(url.host) ! Crawl(url)
}
}
private def actorFor(host: Host): ActorRef = {
workers.get(host) match {