You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.1 KiB

#another experiment
package require fileutil
set data [fileutil::cat [pwd]/sample1.json]
puts stdout $data
proc charP {ch} {
pipeset parser .= {
pipeswitch {
#puts "-->$input"
pipecase = $input |> \
,'${ch}'@1.= {list [string range $data 1 end] [string index $data 0] } |> {
set data
}
return nothing
}
} <ch/0,input/1| $ch
}
#generate a functor on a pipeline targeting a specific section of the 'value' in: ok {result value}
proc fmap {cmdlist pipeline {restructure ""}} {
pipeset functor .= {
pipeswitch {
pipecase .= list $cmd $p $s $input |cmd@,pipe@,s@,input@> \
,'result'@@ok/@0.= {
.= list $pipe $input |p@,i@> {{*}$p $i}
} |result@@ok/result> {
#todo - we need inverse of the destructure operation of pattern-matching
#i.e we need restructure - which puts the values in at the matched locations
#- (return the updated result without necessarily knowing its full specific structure)
}
return nothing-functor
}
} <cmd@,p@,s@,input@| $cmdlist $pipeline $restructure
}
#JSON Parser 100% From Scratch in Haskell (only 111 lines)
#https://www.youtube.com/watch?v=N9RUqGYuGfw
# see also: Understanding parser combinators: a deep dive - Scott Wlaschin https://www.youtube.com/watch?v=RDalzi7mhdY
#produce a pipeline for inner pipeline producing: ok {result {tailchars headchar}}
#where cmdlist is applied to headchar
proc charP_functor {cmdlist pipeline} {
pipeset functor .= {
pipeswitch {
pipecase .= list $p $input $cmd |pipe@0,input@1,cmd@2> \
,'result'@@ok/@0.= {
.= list $pipe $input |p@,i@> {{*}$p $i}
} |tail@@ok/result/@0,char@@ok/result/@1> {list $tail [{*}$cmd $char] } |
return nothing-functor
}
} <p@,cmd@,input/2| $pipeline $cmdlist
}
proc scanc {ch} {
scan $ch %c
}
p.= charP p
fc.= charP_functor scanc $p