public virtual T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) where T : class { if (this is T context) { return(context); } if (PayloadCache.TryGetPayload <T>(out var payload)) { return(PayloadCache.AddOrUpdatePayload(addFactory, updateFactory)); } if (_context.TryGetPayload(out payload)) { T Add() { return(updateFactory(payload)); } return(PayloadCache.AddOrUpdatePayload(Add, updateFactory)); } return(PayloadCache.AddOrUpdatePayload(addFactory, updateFactory)); }
T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { if (_right is T context) { return(context); } return(_left.AddOrUpdatePayload(addFactory, updateFactory)); }
/// <summary> /// Either adds a new payload, or updates an existing payload /// </summary> /// <param name="addFactory">The payload factory called if the payload is not present</param> /// <param name="updateFactory">The payload factory called if the payload already exists</param> /// <typeparam name="T">The payload type</typeparam> /// <returns></returns> public override T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { if (this is T context) { return(context); } return(ReceiveContext.AddOrUpdatePayload(addFactory, updateFactory)); }
T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { if (_payloadCache != null) { return(_payloadCache.AddOrUpdatePayload(addFactory, updateFactory)); } return(_context.AddOrUpdatePayload(addFactory, updateFactory)); }
/// <summary> /// Either adds a new payload, or updates an existing payload /// </summary> /// <param name="addFactory">The payload factory called if the payload is not present</param> /// <param name="updateFactory">The payload factory called if the payload already exists</param> /// <typeparam name="T">The payload type</typeparam> /// <returns></returns> public virtual T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) where T : class { if (this is T context) { return(context); } return(PayloadCache.AddOrUpdatePayload(addFactory, updateFactory)); }
T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { // can't modify implicit payload types var context = _sourceContext as T; if (context != null) { return(context); } return(_context.AddOrUpdatePayload(addFactory, updateFactory)); }
/// <summary> /// Either adds a new payload, or updates an existing payload /// </summary> /// <param name="addFactory">The payload factory called if the payload is not present</param> /// <param name="updateFactory">The payload factory called if the payload already exists</param> /// <typeparam name="T">The payload type</typeparam> /// <returns></returns> public virtual T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) where T : class { // can't modify implicit payload types var context = this as T; if (context != null) { return(context); } return(PayloadCache.AddOrUpdatePayload(addFactory, updateFactory)); }
T IPayloadCache.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { if (_payloadCache.TryGetPayload(out T existingPayload)) { return(_payloadCache.AddOrUpdatePayload(addFactory, updateFactory)); } if (_parentCache.TryGetPayload(out existingPayload)) { T Add() => updateFactory(existingPayload); return(_payloadCache.AddOrUpdatePayload(Add, updateFactory)); } return(_payloadCache.AddOrUpdatePayload(addFactory, updateFactory)); }
T IPayloadCache.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { try { T previousValue = null; IPayloadValue <T> context = null; IPayloadCollection currentCollection; do { if (_collection.TryGetPayload(out T existingValue)) { if (context == null || previousValue != existingValue) { context = new PayloadValue <T>(updateFactory(existingValue)); } previousValue = existingValue; currentCollection = Volatile.Read(ref _collection); Interlocked.CompareExchange(ref _collection, currentCollection.Add(context), currentCollection); } else { if (context == null) { context = new PayloadValue <T>(addFactory()); } currentCollection = Volatile.Read(ref _collection); Interlocked.CompareExchange(ref _collection, currentCollection.Add(context), currentCollection); } }while (currentCollection == Volatile.Read(ref _collection)); return(context.Value); } catch (Exception exception) { throw new PayloadFactoryException($"The payload factory faulted: {TypeCache<T>.ShortName}", exception); } }
public override T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { if (base.TryGetPayload <T>(out var existing) || _context.TryGetPayload(out existing)) { T Update(T _) { return(updateFactory(existing)); } T Add() { return(updateFactory(existing)); } return(base.AddOrUpdatePayload(Add, Update)); } return(base.AddOrUpdatePayload(addFactory, updateFactory)); }
public override T AddOrUpdatePayload<T>(PayloadFactory<T> addFactory, UpdatePayloadFactory<T> updateFactory) { if (this is T context) return context; if (PayloadCache.TryGetPayload<T>(out var payload)) return PayloadCache.AddOrUpdatePayload(addFactory, updateFactory); if (_context.TryGetPayload(out payload)) { T Add() { return updateFactory(payload); } return PayloadCache.AddOrUpdatePayload(Add, updateFactory); } return PayloadCache.AddOrUpdatePayload(addFactory, updateFactory); }
public T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) where T : class { lock (this) { if (_cache != null) { for (int i = _cache.Count - 1; i >= 0; i--) { if (_cache[i] is T result) { var updated = updateFactory(result); _cache[i] = updated; return(updated); } } } T payload = addFactory(); if (_cache != null) { _cache.Add(payload); } else { _cache = new List <object>(1) { payload } }; return(payload); } } }
public override T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { if (this is T context) { return(context); } if (_context.TryGetPayload <T>(out var payload)) { return(_context.AddOrUpdatePayload(addFactory, updateFactory)); } if (base.TryGetPayload(out payload)) { T Add() { return(updateFactory(payload)); } return(_context.AddOrUpdatePayload(Add, updateFactory)); } return(_context.AddOrUpdatePayload(addFactory, updateFactory)); }
public abstract T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) where T : class;
T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { return(_context.AddOrUpdatePayload(addFactory, updateFactory)); }
public T AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) where T : class { return(_context.AddOrUpdatePayload(addFactory, updateFactory)); }
T PipeContext.AddOrUpdatePayload <T>(PayloadFactory <T> addFactory, UpdatePayloadFactory <T> updateFactory) { throw new ConsumeContextNotAvailableException(); }