Ejemplo n.º 1
0
 public static DataType Cons(T x, DataType ts)
 {
     if (IsEmpty(ts))
     {
         return(new One(x, RList <Tuple <T, T> > .Empty));
     }
     if (ts is Zero zero)
     {
         return(new One(x, zero.RList));
     }
     if (ts is One one)
     {
         return(new Zero(RList <Tuple <T, T> > .Cons(new Tuple <T, T>(x, one.Alpha), one.RList)));
     }
     throw new ArgumentException("must be null, Zero or One", nameof(ts));
 }
Ejemplo n.º 2
0
        public static DataType Fupdate(Del f, int i, DataType ts)
        {
            if (ts is One one)
            {
                if (i == 0)
                {
                    return(new One(f(one.Alpha), one.RList));
                }
                return(Cons(one.Alpha, Fupdate(f, i - 1, new Zero(one.RList))));
            }

            if (ts is Zero zero)
            {
                RList <Tuple <T, T> > .Del fp0 = value => new Tuple <T, T>(f(value.Item1), value.Item2);
                RList <Tuple <T, T> > .Del fp1 = value => new Tuple <T, T>(value.Item1, f(value.Item2));
                var fp = i % 2 == 0 ? fp0 : fp1;
                return(new Zero(RList <Tuple <T, T> > .Fupdate(fp, i / 2, zero.RList)));
            }

            throw new ArgumentException("must be Zero or One", nameof(ts));
        }
Ejemplo n.º 3
0
        private static Tuple <T, DataType> Uncons(DataType dataType)
        {
            if (dataType is One one)
            {
                if (RList <Tuple <T, T> > .IsEmpty(one.RList))
                {
                    return(new Tuple <T, DataType>(one.Alpha, Empty));
                }
                return(new Tuple <T, DataType>(one.Alpha, new Zero(one.RList)));
            }

            if (dataType is Zero zero)
            {
                var xy = RList <Tuple <T, T> > .Head(zero.RList);

                var psp = RList <Tuple <T, T> > .Tail(zero.RList);

                return(new Tuple <T, DataType>(xy.Item1, new One(xy.Item2, psp)));
            }

            throw new ArgumentException("must be Zero or One", nameof(dataType));
        }
Ejemplo n.º 4
0
        public static T Lookup(int i, DataType ts)
        {
            if (ts is One one)
            {
                if (i == 0)
                {
                    return(one.Alpha);
                }
                return(Lookup(i - 1, new Zero(one.RList)));
            }

            if (ts is Zero zero)
            {
                var node = RList <Tuple <T, T> > .Lookup(i / 2, zero.RList);

                if (i % 2 == 0)
                {
                    return(node.Item1);
                }
                return(node.Item2);
            }

            throw new ArgumentException("must be Zero or One", nameof(ts));
        }
Ejemplo n.º 5
0
 public One(T alpha, RList <Tuple <T, T> > .Node list)
     : base(list)
 {
     Alpha = alpha;
 }
Ejemplo n.º 6
0
 public Zero(RList <Tuple <T, T> > .Node list)
     : base(list)
 {
 }
Ejemplo n.º 7
0
 protected DataType(RList <Tuple <T, T> > .Node list)
 {
     RList = list;
 }