A game about forced loneliness, made by TACStudios
1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5namespace Unity.VisualScripting 6{ 7 public sealed class ValueOutput : UnitPort<ValueInput, IUnitInputPort, ValueConnection>, IUnitValuePort, IUnitOutputPort 8 { 9 public ValueOutput(string key, Type type, Func<Flow, object> getValue) : base(key) 10 { 11 Ensure.That(nameof(type)).IsNotNull(type); 12 Ensure.That(nameof(getValue)).IsNotNull(getValue); 13 14 this.type = type; 15 this.getValue = getValue; 16 } 17 18 public ValueOutput(string key, Type type) : base(key) 19 { 20 Ensure.That(nameof(type)).IsNotNull(type); 21 22 this.type = type; 23 } 24 25 internal readonly Func<Flow, object> getValue; 26 27 internal Func<Flow, bool> canPredictValue; 28 29 public bool supportsPrediction => canPredictValue != null; 30 31 public bool supportsFetch => getValue != null; 32 33 public Type type { get; } 34 35 public override IEnumerable<ValueConnection> validConnections => unit?.graph?.valueConnections.WithSource(this) ?? Enumerable.Empty<ValueConnection>(); 36 37 public override IEnumerable<InvalidConnection> invalidConnections => unit?.graph?.invalidConnections.WithSource(this) ?? Enumerable.Empty<InvalidConnection>(); 38 39 public override IEnumerable<ValueInput> validConnectedPorts => validConnections.Select(c => c.destination); 40 41 public override IEnumerable<IUnitInputPort> invalidConnectedPorts => invalidConnections.Select(c => c.destination); 42 43 public override bool CanConnectToValid(ValueInput port) 44 { 45 var source = this; 46 var destination = port; 47 48 return source.type.IsConvertibleTo(destination.type, false); 49 } 50 51 public override void ConnectToValid(ValueInput port) 52 { 53 var source = this; 54 var destination = port; 55 56 destination.Disconnect(); 57 58 unit.graph.valueConnections.Add(new ValueConnection(source, destination)); 59 } 60 61 public override void ConnectToInvalid(IUnitInputPort port) 62 { 63 ConnectInvalid(this, port); 64 } 65 66 public override void DisconnectFromValid(ValueInput port) 67 { 68 var connection = validConnections.SingleOrDefault(c => c.destination == port); 69 70 if (connection != null) 71 { 72 unit.graph.valueConnections.Remove(connection); 73 } 74 } 75 76 public override void DisconnectFromInvalid(IUnitInputPort port) 77 { 78 DisconnectInvalid(this, port); 79 } 80 81 public ValueOutput PredictableIf(Func<Flow, bool> condition) 82 { 83 Ensure.That(nameof(condition)).IsNotNull(condition); 84 85 canPredictValue = condition; 86 87 return this; 88 } 89 90 public ValueOutput Predictable() 91 { 92 canPredictValue = (flow) => true; 93 94 return this; 95 } 96 97 public override IUnitPort CompatiblePort(IUnit unit) 98 { 99 if (unit == this.unit) return null; 100 101 return unit.CompatibleValueInput(type); 102 } 103 } 104}