JSFiddle - React, Tailwind, and code Playground

by dimitrs_papadimitriou

JavaScript

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using LanguageExt;
using Traversable24;

namespace Rose
{

    public abstract class Tree<T> //: IFunctor<T>
    {
        public abstract Tree<T1> Map<T1>(Func<T, T1> f);
        public abstract T1 Cata<T1>((Func<Leaf<T>, T1> Leaf, Func<List<Tree<T>>, T1> Nodes) algebra);
    }


    public class Node<T> : Tree<T>
    {
        private List<Tree<T>> list;

        public Node(List<Tree<T>> nodes)
        {
            Nodes = nodes;
        }


        public override Tree<T1> Map<T1>(Func<T, T1> f) => new Node<T1>(Nodes.Select(n => n.Map(f)).ToList());

        public override T1 Cata<T1>((Func<Leaf<T>, T1> Leaf, Func<List<Tree<T>>, T1> Nodes) algebra) => algebra.Nodes(Nodes);


        public List<Tree<T>> Nodes { get; set; }

    }

    public class Leaf<T> : Tree<T>
    {
        public Leaf(T v)
        {
            V = v;
        }
        public override T1 Cata<T1>((Func<Leaf<T>, T1> Leaf, Func<List<Tree<T>>, T1> Nodes) algebra) => algebra.Leaf(this);

        public T V { get; }

        public override Tree<T1> Map<T1>(Func<T, T1> f) => new Leaf<T1>(f(V));

    }
    public interface Monoid<M>
    {
        M Value { get; set; }
        Monoid<M> Empty();
        Monoid<M> Concat(Monoid<M> m);
    }

    public static partial class funcEtxnesion
    {

        //public static TM FoldMap<T, T1>(this ITuple @this,Func<T,T1> f) =>  {}
        //public static T1 Cata<T, T1>(this Leaf<T> @this, (Func<Leaf<T>, T1> leaf, Func<Tree<T>, Tree<T>, T1> node) algebra) => algebra.leaf(@this);
        //public static T1 Cata<T,T1>(this Node<T> @this, (Func<Leaf<T>, T1> leaf, Func<Tree<T>, Tree<T>, T1> node) algebra) => algebra.node(@this.Left, @this.Right);
        //public static string Show<T>(this Tree<T> @this) =>
        //    @this.Cata(algebra: (
     ...