JSFiddle - React, Tailwind, and code Playground

by kentaromiura

HTML

<script src="https://rawgit.com/kentaromiura/4531883/raw/954e971e0ce4e87fc1d5dea6444583906ea2b829/Monad.js"></script>

JavaScript

var Query = function(data){
  if (data instanceof Monad) {
    this.data = data;
  }else{
    this.data = new Monad(function(){return data});
  }
};

Query.learn = function(feature, action){
       
        Query.prototype[feature] = function(){ 
            var me = this;
            var params = Array.prototype.slice.call(arguments);

            var monad = me.data.bind(function(getdata){
                params.unshift(getdata);
              
                return function(){
                    return action.apply(me, params);
                }   
            });
            
            return new Query(monad);
        };
        
};

var object = {
    a:{
        b:{
            c: 1
        }
    },
    b: {
        'foo': 'hello'
    }
};

var ValueSymbol = "@@value"
Query.learn('firstChild', function(getdata){
    var result = {}
    result[ValueSymbol] = null
    var object = getdata()    
    if(object[ValueSymbol]) object = object[ValueSymbol]
    
    for(var x in object){
        if(object.hasOwnProperty(x)){
            result = {
                parent: object,
                name: x
            }
            result[ValueSymbol] = object[x]
            return result //optimization
        }
    }
    return result
})

Query.learn('lastChild', function(getdata){
    var result = {}
    result[ValueSymbol] = null
    var object = getdata()    
    if(object[ValueSymbol]) object = object[ValueSymbol]
    
    for(var x in object){
        if(object.hasOwnProperty(x)){
            result = {
                parent: object,
                name: x
            }
            result[ValueSymbol] = object[x]
        }
    }
    return result
})
Query.learn('childNodes', function(getdata){
    var result = {}
    var list = result[ValueSymbol] = []

    var object = getdata()    
    if(object[ValueSymbol]) object = object[ValueSymbol]

    for(var x in object){
        if(object.hasOwnProperty(x)){
            list.push(object[x])
        }
    }
   ...