( expr: &Arc<IxonExpr>, sharing: &[Arc<IxonExpr>], )
| 868 | results.push(e.clone()); |
| 869 | } |
| 870 | }, |
| 871 | IxonExpr::App(f, a) => { |
| 872 | stack.push(UnshareFrame::BuildApp); |
| 873 | stack.push(UnshareFrame::Visit(a)); |
| 874 | stack.push(UnshareFrame::Visit(f)); |
| 875 | }, |
| 876 | IxonExpr::Lam(t, b) => { |
| 877 | stack.push(UnshareFrame::BuildLam); |
| 878 | stack.push(UnshareFrame::Visit(b)); |
| 879 | stack.push(UnshareFrame::Visit(t)); |
| 880 | }, |
| 881 | IxonExpr::All(t, b) => { |
| 882 | stack.push(UnshareFrame::BuildAll); |
| 883 | stack.push(UnshareFrame::Visit(b)); |
| 884 | stack.push(UnshareFrame::Visit(t)); |
| 885 | }, |
| 886 | IxonExpr::Let(nd, t, v, b) => { |
| 887 | stack.push(UnshareFrame::BuildLet(*nd)); |
| 888 | stack.push(UnshareFrame::Visit(b)); |
| 889 | stack.push(UnshareFrame::Visit(v)); |
| 890 | stack.push(UnshareFrame::Visit(t)); |
| 891 | }, |
| 892 | IxonExpr::Prj(ti, fi, v) => { |
| 893 | stack.push(UnshareFrame::BuildPrj(*ti, *fi)); |
| 894 | stack.push(UnshareFrame::Visit(v)); |
| 895 | }, |
| 896 | // Leaf nodes - no children to unshare |
| 897 | _ => results.push(e.clone()), |
| 898 | }, |
| 899 | UnshareFrame::BuildApp => { |
| 900 | let a = results.pop().unwrap(); |
| 901 | let f = results.pop().unwrap(); |
| 902 | results.push(Arc::new(IxonExpr::App(f, a))); |
| 903 | }, |
| 904 | UnshareFrame::BuildLam => { |
| 905 | let b = results.pop().unwrap(); |
| 906 | let t = results.pop().unwrap(); |
| 907 | results.push(Arc::new(IxonExpr::Lam(t, b))); |
| 908 | }, |
| 909 | UnshareFrame::BuildAll => { |
| 910 | let b = results.pop().unwrap(); |
| 911 | let t = results.pop().unwrap(); |
| 912 | results.push(Arc::new(IxonExpr::All(t, b))); |
| 913 | }, |
| 914 | UnshareFrame::BuildLet(nd) => { |
| 915 | let b = results.pop().unwrap(); |
| 916 | let v = results.pop().unwrap(); |
| 917 | let t = results.pop().unwrap(); |
| 918 | results.push(Arc::new(IxonExpr::Let(nd, t, v, b))); |
| 919 | }, |
| 920 | UnshareFrame::BuildPrj(ti, fi) => { |
| 921 | let v = results.pop().unwrap(); |
| 922 | results.push(Arc::new(IxonExpr::Prj(ti, fi, v))); |
| 923 | }, |
| 924 | } |
| 925 | } |
| 926 | |
| 927 | results.pop().unwrap() |
no test coverage detected