1: { lib }: 2: 3: with lib; 4: with rec { 5: go = pred: l: 6: if l == [ ] then [ ] else if pred (head l) then go pred (tail l) else l; 7: }; 8: assert go (x: elem x [ 1 2 ]) [ 1 2 1 2 1 3 1 2 3 1 ] == [ 3 1 2 3 1 ]; 9: assert go (abort "fail") [ ] == [ ]; 10: assert go (x: x > 2) [ 5 4 3 2 1 ] == [ 2 1 ]; 11: go