feat: add random and shuffle.
This commit is contained in:
parent
81184c23a7
commit
f73f501642
2 changed files with 29 additions and 1 deletions
|
@ -78,6 +78,23 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp {
|
|||
(sort fc list00)))
|
||||
"""
|
||||
);
|
||||
this["rand"] = e.eval(
|
||||
"""
|
||||
(lambda
|
||||
(. a)
|
||||
(cond
|
||||
((null a) (random))
|
||||
((null (cdr a)) (% (random) (car a)))
|
||||
(t (+
|
||||
(car a)
|
||||
(%
|
||||
(random)
|
||||
(-
|
||||
(car (cdr a))
|
||||
(car a)))))))
|
||||
"""
|
||||
);
|
||||
this["shuf"] = new Symbol("shuffle");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -114,8 +131,10 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp {
|
|||
public class Builtins : Dictionary<string, Function> {
|
||||
|
||||
private static Dictionary<string, Type?> ResolvedTypes = new Dictionary<string, Type?>();
|
||||
private Random Random;
|
||||
|
||||
public Builtins() : base() {
|
||||
Random = new Random();
|
||||
this["atom"] = _atom;
|
||||
this["eq"] = _eq;
|
||||
this["car"] = _car;
|
||||
|
@ -146,11 +165,17 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp {
|
|||
this["string<"] = (x) => _cmp((String a, String b) => a < b, x);
|
||||
this["string<="] = (x) => _cmp((String a, String b) => a <= b, x);
|
||||
|
||||
|
||||
this["haskeys"] = _haskeys;
|
||||
this["getitems"] = _getitems;
|
||||
this["invoke"] = _invoke;
|
||||
this["invoke-generic"] = _invoke_generic;
|
||||
|
||||
this["random"] = (x) => new Lisp.Integer(Random.Next());
|
||||
this["shuffle"] = (x) => {
|
||||
var newx = ((Lisp.Cons) x.First()).ToList().ToArray();
|
||||
Random.Shuffle<Expression>(newx);
|
||||
return Lisp.Cons.FromList(newx);
|
||||
};
|
||||
}
|
||||
private static T _agg<T>(Func<T, T, T> op, IEnumerable<Expression> args) where T : Expression {
|
||||
T agg = (T) args.First();
|
||||
|
|
|
@ -233,6 +233,9 @@ namespace Tests
|
|||
Assert.Equal("10", e.eval("(fold (lambda (a b) (+ a b)) 0 (list 1 2 3 4))").ToString());
|
||||
Assert.Equal("(2 3 4 5 6 7)", e.eval("(append (list 2 3 4) (list 5 6 7))").ToString());
|
||||
Assert.Equal("(1 2 3 4 5 6 7)", e.eval("(qsort (lambda (a b) (> a b)) (list 5 4 7 3 2 6 1))").ToString());
|
||||
|
||||
//Assert.Equal("", e.eval("(rand)").ToString());
|
||||
//Assert.Equal("", e.eval("(shuf (list 0 1 2 3 4 5 6))").ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue