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: (
...