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}