proc p_digit str {
    if {[string is digit -strict [string index $str 0]]} {
        return [list [string index $str 0] [string range $str 1 end]]
    } else {
        return [list]
    }
}

proc p_char {str ch} {
    if {[string index $str 0] eq $ch} {
        return [list [string index $str 0] [string range $str 1 end]]
    } else {
        return [list]
    }
}

proc parser_of_char {ch} {
    pipeset outparser @@ok/result.= {
        pipeswitch {
            pipecase .= list $input $ch |data/0,char/1> \
            ,'${ch}'@0.= {p_char $data $char}

            return  [list ok [list result [list]]]
        }
    } <ch/0,input/1| $ch
}

proc some {parser} {


}


#generate a functor on a pipeline targeting a specific section of the 'value' in: ok {result value}
proc fmap {cmdlist pipeline} {
    pipeset functor .= {
        pipeswitch {
            pipecase .= list $cmd $p $input |cmd@,pipe@,input@> \
            ,'result'@@ok/@0.= { 
                .= list $pipe $input |p@,i@> {{*}$p $i} 
            } |result@@ok/result>  =result>1/1  
        
            return nothing-functor
        }
    } <cmd@,p@,input@| $cmdlist $pipeline
}



proc charP {ch} {
    pipeset parser .=  {
        pipeswitch {
            #puts "-->$input"
            pipecase = $input |> \
            ,'${ch}'@0.= {list [string index $data 0] [string range $data 1 end] } |> {
                set data
            }
            return nothing
        } 
    }   <ch/0,input/1| $ch
}