Skip to content

Instantly share code, notes, and snippets.

View tomliversidge's full-sized avatar

Tom Liversidge tomliversidge

  • Tallinn, Estonia
View GitHub Profile
@tomliversidge
tomliversidge / errors.txt
Created April 8, 2017 16:42
Build errors
Protos.proto(1,8): error CS1022: Type or namespace definition, or end-of-file expected [C:\Code\tomliversidge\protoactor-dotnet\tests\Proto.Remote.Tests.Messages\Proto.Remote.Tests.Messages.csproj]
Protos.proto(1,1): error CS0116: A namespace cannot directly contain members such as fields or methods [C:\Code\tomliversidge\protoactor-dotnet\tests\Proto.Remote.Tests.Messages\Proto.Remote.Tests.Messages.csproj]
Protos.proto(4,1): error CS0116: A namespace cannot directly contain members such as fields or methods [C:\Code\tomliversidge\protoactor-dotnet\tests\Proto.Remote.Tests.Messages\Proto.Remote.Tests.Messages.csproj]
Protos.proto(4,8): error CS1022: Type or namespace definition, or end-of-file expected [C:\Code\tomliversidge\protoactor-dotnet\tests\Proto.Remote.Tests.Messages\Proto.Remote.Tests.Messages.csproj]
Protos.proto(8,2): error CS1014: A get or set accessor expected [C:\Code\tomliversidge\protoactor-dotnet\tests\Proto.Remote.Tests.Messages\Proto.Remote.Tests.Messages.csproj]
Protos.proto(8,7): error
@tomliversidge
tomliversidge / Proto.Remote.Tests.Messages.csproj
Created April 9, 2017 04:26
Proto.Remote.Tests.Messages
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.5</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.2.0" />
</ItemGroup>
@tomliversidge
tomliversidge / test.cs
Created April 10, 2017 20:33
watch_test
[Fact]
public async void CanWatchRemoteActor()
{
var props = Actor.FromProducer(() => new LocalActor());
var localActor = Actor.SpawnNamed(props, "local watcher");
var remoteActorName = Guid.NewGuid().ToString();
var remoteActor = await Remote.SpawnNamedAsync("127.0.0.1:12000", remoteActorName, "remote", TimeSpan.FromSeconds(5));
remoteActor.Tell(new Watch { Watcher = localActor });
await Task.Delay(TimeSpan.FromSeconds(3));
remoteActor.Stop();
var props1 = Actor.FromProducer(() => new DoNothingActor())
.WithMailbox(() => new TestMailbox());
var localActor1 = Actor.SpawnNamed(props1, "local");
var props2 = Actor.FromProducer(() => new LocalActor(localActor1))
.WithMailbox(() => new TestMailbox());
var watcher = Actor.SpawnNamed(props2, "watcher");
localActor1.Stop();
@tomliversidge
tomliversidge / Persistence.cs
Created April 21, 2017 06:49
Example strategy usage
public async Task PersistEventAsync(object @event)
{
Index++;
await _state.PersistEventAsync(ActorId, Index, @event);
_actor.UpdateState(new PersistedEvent(@event, Index));
if (_snapshotStrategy.ShouldTakeSnapshot(Index))
{
await PersistSnapshotAsync(_actor.GetState());
}
}
@tomliversidge
tomliversidge / strategies.cs
Created April 21, 2017 06:50
example strategies
public interface ISnapshotStrategy
{
bool ShouldTakeSnapshot(long index);
}
public class EventsCountStrategy : ISnapshotStrategy
{
private readonly int _eventsPerSnapshot;
@tomliversidge
tomliversidge / example.cs
Created May 7, 2017 13:31
Utter madness, or great implementation of interface segregation principal?
namespace Proto.Persistence
{
public interface IProvider : IEventSourcingProvider, ISnapshotProvider { }
public interface IEventSourcingProvider : IModifyEvents, IGetEvents { }
public interface IModifyEvents
{
Task PersistEventAsync(string actorName, long index, object @event);
Task DeleteEventsAsync(string actorName, long inclusiveToIndex);
using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
/**
* Auto-generated code below aims at helping you parse
* the standard input according to the problem statement.
public Task ReceiveAsync(IContext context)
{
switch (context.Message)
{
// ...
case Credit msg:
return AdjustBalance(msg.ReplyTo, msg.Amount);
case Debit msg when msg.Amount + _balance >= 0:
return AdjustBalance(msg.ReplyTo, msg.Amount);
// ...
private Task AdjustBalance(PID replyTo, decimal amount)
{
if (RefusePermanently())
{
_processedMessages.Add(replyTo, new Refused());
replyTo.Tell(new Refused());
}
if (Busy())
replyTo.Tell(new ServiceUnavailable());