Exemplo n.º 1
0
 public bool TryGetValue(string key, out KalkUnit value)
 {
     value = null;
     if (TryGetValue(null, new SourceSpan(), key, out var valueObj))
     {
         value = (KalkUnit)valueObj;
         return(true);
     }
     return(false);
 }
Exemplo n.º 2
0
        public KalkExpression RegisterUnit(KalkUnit unit, string description = null, string symbol = null, KalkExpression value = null, string plural = null, string prefix = null, bool isUser = false)
        {
            if (unit == null)
            {
                throw new ArgumentNullException(nameof(unit));
            }
            var name = unit.Name;

            symbol ??= name;

            // Override isUser
            if (_registerAsSystem)
            {
                isUser = false;
            }

            CheckVariableAvailable(name, nameof(name), false);

            var prefixList = new List <KalkUnitPrefix>();

            if (prefix != null)
            {
                var prefixes = prefix.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (var prefixItem in prefixes)
                {
                    if (prefixItem == "decimal")
                    {
                        prefixList.AddRange(KalkUnitPrefix.GetDecimals());
                    }
                    else if (prefixItem == "binary")
                    {
                        prefixList.AddRange(KalkUnitPrefix.GetBinaries());
                    }
                    else if (KalkUnitPrefix.TryGet(prefixItem, out var descriptor))
                    {
                        prefixList.Add(descriptor);
                    }
                    else
                    {
                        throw new ArgumentException($"The prefix `{prefixItem}` does not exist.", nameof(prefix));
                    }
                }
                prefixList = prefixList.Distinct().ToList();
            }

            // Pre-check all prefix with name/symbol
            foreach (var prefixDesc in prefixList)
            {
                var prefixWithName = $"{prefixDesc.Name}{name}";
                CheckVariableAvailable(prefixWithName, nameof(name), false);

                var prefixWithSymbol = $"{prefixDesc.Prefix}{symbol}";
                CheckVariableAvailable(prefixWithSymbol, nameof(name), false);
            }

            unit.Description = description;
            unit.Symbol      = symbol;
            unit.Value       = value;
            unit.IsUser      = isUser;
            unit.Prefix      = prefix;
            if (plural != null)
            {
                unit.Plural = plural;
            }

            if (unit.Symbol != unit.Name)
            {
                CheckVariableAvailable(unit.Symbol, nameof(symbol), false);
            }

            if (unit.Plural != unit.Name)
            {
                CheckVariableAvailable(unit.Plural, nameof(plural), false);
            }

            // Here we are all done after checking everything

            Units.Add(name, unit);


            if (unit.Symbol != unit.Name)
            {
                Units.Add(unit.Symbol, unit);
            }

            if (unit.Plural != unit.Name)
            {
                Units.Add(unit.Plural, unit);
            }

            // Register prefixes
            foreach (var prefixDesc in prefixList)
            {
                var prefixWithName   = $"{prefixDesc.Name}{unit.Name}";
                var prefixWithSymbol = $"{prefixDesc.Prefix}{unit.Symbol}";

                var unitPrefix = new KalkUnit(prefixWithName)
                {
                    Description = description,
                    Symbol      = prefixWithSymbol,
                    Value       = new KalkBinaryExpression(Math.Pow(prefixDesc.Base, prefixDesc.Exponent), ScriptBinaryOperator.Multiply, unit),
                    IsUser      = isUser,
                    Parent      = unit,
                };
                unit.Derived.Add(unitPrefix);

                Units.Add(prefixWithName, unitPrefix);
                Units.Add(prefixWithSymbol, unitPrefix);
            }

            return(unit);
        }