Merge branch 'master' into typedclay

Conflicts:
	n/t.c
	urb/urbit.pill
	urb/zod/main/app/reload/core.hook
	urb/zod/main/app/shell/core.hook
	urb/zod/main/app/solid/core.hook
	urb/zod/main/arvo/dill.hoon
	urb/zod/main/arvo/eyre.hoon
	urb/zod/main/arvo/ford.hoon
	urb/zod/main/arvo/gall.hoon
	urb/zod/main/arvo/hoon.hoon
	urb/zod/main/mar/json/door.hook
	urb/zod/main/mar/md/door.hook
	urb/zod/main/mar/txt/door.hook
	v/raft.c
	v/unix.c
This commit is contained in:
Philip C Monk 2015-04-22 20:18:19 -04:00
commit dd0716eb72
93 changed files with 11370 additions and 9135 deletions

View File

@ -33,7 +33,6 @@
[ust %pass / %c %plug our.hid %try (sein our.hid) %try] [ust %pass / %c %plug our.hid %try (sein our.hid) %try]
[ust %give %nice ~] [ust %give %nice ~]
== ==
:: ::
++ pour ++ pour
|= [ost=bone pax=path sih=*] |= [ost=bone pax=path sih=*]
@ -45,4 +44,15 @@
%went ~ %went ~
== ==
:: ::
++ poke-will
|= [ost=bone you=ship wil=(unit will)]
:_ +>.$
?~ wil
[ust %give %mean ~ %rejected ~]~
:~ [ust %pass / %a %cash his mac u.wil]
[ust %pass / %c %plug our.hid %main (sein our.hid) %main]
[ust %pass / %c %plug our.hid %arvo (sein our.hid) %arvo]
[ust %pass / %c %plug our.hid %try (sein our.hid) %try]
[ust %give %nice ~]
==
-- --

View File

@ -221,12 +221,12 @@
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs". ;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs".
"/jquery/2.1.1/jquery.min.js"); "/jquery/2.1.1/jquery.min.js");
;script:'try{Typekit.load();}catch(e){}' ;script:'try{Typekit.load();}catch(e){}'
;link(rel "stylesheet", type "text/css", href "/gen/main/pub/src/chat/main.css"); ;link(rel "stylesheet", type "text/css", href "/main/pub/src/chat/main.css");
== ==
;body ;body
;div#c; ;div#c;
;script(type "text/javascript", src "/gen/main/lib/urb.js"); ;script(type "text/javascript", src "/main/lib/urb.js");
;script(type "text/javascript", src "/gen/main/pub/src/chat/main.js"); ;script(type "text/javascript", src "/main/pub/src/chat/main.js");
== ==
== ==
:: ::

736
main/app/dojo/core.hook Normal file
View File

@ -0,0 +1,736 @@
:: :: ::
:::: /hook/core/dojo/app :: ::::
:: :: ::
/? 314 :: arvo kelvin
/- *sole :: console structures
/+ sole :: console library
:: :: ::
:::: :: ::::
!: :: ::
=> |% :: external structures
++ house :: all state
$: hoc=(map bone session) :: conversations
== ::
++ session :: per conversation
$: say=sole-share :: command-line state
syd=desk :: active desk
luc=(unit case) :: special case
poy=(unit dojo-project) :: working
var=(map term cage) :: variable state
old=(set term) :: used TLVs
== ::
++ dojo-command ::
$% [%flat p=path q=dojo-source] :: noun to unix atom
[%pill p=path q=dojo-source] :: noun to unix pill
:: [%tree p=path q=dojo-source] :: noun to unix tree
[%poke p=goal q=dojo-source] :: make and poke
[%show p=dojo-source] :: print
[%verb p=term q=dojo-source] :: store variable
== ::
++ dojo-source :: construction node
$: p=@ud :: assembly index
q=dojo-build :: general build
== ::
++ dojo-build :: one ford step
$% [%ex p=twig] :: hoon expression
[%di p=dojo-model] :: dialog
[%dv p=path] :: gate from source
[%fi p=dojo-filter q=dojo-source] :: filter
[%ge p=dojo-model] :: generator
[%sc p=dojo-model] :: script
[%tu p=(list dojo-source)] :: tuple
[%va p=term] :: dojo variable
== ::
++ dojo-filter :: pipeline filter
$% [%a p=twig] :: function gate
[%b p=mark] :: simple transmute
[%c p=dojo-model] :: formal filter
== ::
++ dojo-model :: data construction
$: p=dojo-server :: core source
q=dojo-config :: configuration
== ::
++ dojo-server :: numbered device
$: p=@ud :: assembly index
q=path :: gate path
== ::
++ dojo-config :: configuration
$: p=(list dojo-source) :: by order
q=(map term (unit dojo-source)) :: by keyword
== ::
++ dojo-project :: construction state
$: mad=dojo-command :: operation
num=@ud :: number of tasks
cud=(unit dojo-source) :: now solving
pux=(unit path) :: ford working
pro=(unit vase) :: prompting loop
per=(unit sole-edit) :: pending reverse
job=(map ,@ud dojo-build) :: problems
rez=(map ,@ud cage) :: results
== ::
++ bead ,[p=(set beam) q=cage] :: computed result
++ goal ,[p=ship q=term] :: flat application
++ gift :: out result <-$
$% [%mean p=ares] :: error
[%nice ~] :: acknowledge
[%rush %sole-effect sole-effect] ::
== ::
++ hapt ,[p=ship q=path] ::
++ move ,[p=bone q=(mold note gift)] ::
++ hood :: assembly plan
$: zus=@ud :: zuse kelvin
sur=(list hoot) :: structures
lib=(list hoof) :: libraries
fan=(list horn) :: resources
src=(list hoop) :: program
== ::
++ hoof (pair term (unit (pair case ship))) :: resource reference
++ hoot (pair bean hoof) :: structure gate/core
++ hoop :: source in hood
$% [%& p=twig] :: direct twig
[%| p=beam] :: resource location
== ::
++ horn :: resource tree
$% [%ape p=twig] :: /~ twig by hand
[%arg p=twig] :: /$ argument
[%day p=horn] :: /| list by @dr
[%dub p=term q=horn] :: /= apply face
[%fan p=(list horn)] :: /. list
[%for p=path q=horn] :: /, descend
[%hel p=@ud q=horn] :: /% propagate heel
[%hub p=horn] :: /@ list by @ud
[%man p=(map span horn)] :: /* hetero map
[%nap p=horn] :: /_ homo map
[%now p=horn] :: /& list by @da
[%saw p=twig q=horn] :: /; operate on
[%see p=beam q=horn] :: /: relative to
[%sic p=tile q=horn] :: /^ cast
[%toy p=mark] :: /mark/ static
== ::
++ silk :: construction layer
$& [p=silk q=silk] :: cons
$% [%bake p=mark q=beam r=path] :: local synthesis
[%boil p=mark q=beam r=path] :: general synthesis
[%call p=silk q=silk] :: slam
[%cast p=mark q=silk] :: translate
[%done p=(set beam) q=cage] :: literal
[%dude p=tank q=silk] :: error wrap
[%dune p=(set beam) q=(unit cage)] :: unit literal
[%mute p=silk q=(list (pair wing silk))] :: mutant
[%plan p=beam q=spur r=hood] :: structured assembly
[%reef ~] :: kernel reef
[%ride p=twig q=silk] :: silk thru twig
[%vale p=mark q=ship r=*] :: validate [our his]
== ::
++ note-ford :: note to ford
$% [%exec p=@p q=beak r=(unit silk)] :: make / kill
== ::
++ note-gall :: note to %gall
$% [%mess p=[p=ship q=path] q=ship r=cage] ::
== ::
++ sign-gall :: sign from %gall
$% [%mean p=ares] ::
[%nice ~] ::
== ::
++ sign-ford :: sign from ford
$% [%made p=@uvH q=(each gage tang)] :: computed result
== ::
++ note :: out request $->
$% [%f note-ford] ::
[%g note-gall] ::
== ::
++ sign :: in result $<-
$% [%f sign-ford] ::
[%g sign-gall] ::
== ::
-- ::
:: ::
:::: ::
:: ::
|_ $: hid=hide :: system state
house :: program state
== ::
++ he :: per session
|_ [[ost=bone moz=(list move)] session] ::
++ dp :: dojo parser
|%
++ dp-command :: ++dojo-command
%+ knee *dojo-command |. ~+
;~ pose
%+ stag %poke
;~ pfix col
%+ cook
|= [a=goal b=(each dojo-source (trel term path dojo-config))]
^- (pair goal dojo-source)
:- a
?- -.b
%& p.b
%| ?+ p.p.b !!
%di [0 %di [0 [%dog q.a q.p.b]] r.p.b]
%ge [0 %ge [0 [%cat q.a q.p.b]] r.p.b]
%sc [0 %sc [0 [%pig q.a q.p.b]] r.p.b]
==
==
;~ plug
dp-goal
;~ pose
(stag %& ;~(pfix ace dp-source))
%+ stag %|
;~ plug
;~ pose
(cold %di wut)
(cold %ge lus)
(cold %sc pam)
==
(most fas sym)
dp-config
==
==
==
==
::
%+ stag %verb
;~ pfix tis
;~(plug sym ;~(pfix ace dp-source))
==
::
%+ stag %flat
;~ pfix pat
;~(plug (most fas sym) ;~(pfix ace dp-source))
==
::
%+ stag %pill
;~ pfix dot
;~(plug (most fas sym) ;~(pfix ace dp-source))
==
::
(stag %show dp-source)
==
++ dp-source (stag 0 dp-build) :: ++dojo-source
++ dp-build :: ++dojo-build
%+ knee *dojo-build |. ~+
;~ pose
;~(pfix lus (stag %ge dp-model-cat))
;~(pfix wut (stag %di dp-model-dog))
;~(pfix pam (stag %sc dp-model-pig))
;~(pfix buc (stag %va sym))
(stag %ex dp-twig)
(ifix [sel ser] (stag %tu (most ace dp-source)))
==
::
++ dp-goal :: ++goal
%+ cook |=(a=goal a)
;~ pose
;~ plug
;~(pfix sig fed:ag)
;~(pfix fas sym)
==
(cook |=(a=term `goal`[our.hid a]) sym)
==
++ dp-model-cat ;~(plug dp-server-cat dp-config) :: ++dojo-model
++ dp-model-dog ;~(plug dp-server-dog dp-config) :: ++dojo-model
++ dp-model-pig ;~(plug dp-server-pig dp-config) :: ++dojo-model
++ dp-server-cat (stag 0 (stag %cat dp-device)) :: ++dojo-server
++ dp-server-dog (stag 0 (stag %dog dp-device)) :: ++dojo-server
++ dp-server-pig (stag 0 (stag %pig dp-device)) :: ++dojo-server
++ dp-twig wide:(vang | ~) :: ++twig
++ dp-device (most fas sym) :: ++dojo-device
++ dp-value :: ++dojo-source
%+ cook |=(a=dojo-source a)
%+ stag 0
;~ pose
(ifix [kel ker] (stag %tu (most ace dp-source)))
(stag %va ;~(pfix buc sym))
(stag %ex dp-twig)
==
::
++ dp-config :: ++dojo-config
%+ cook |=(a=dojo-config a)
;~ plug
(star ;~(pfix ace dp-value))
%+ cook
~(gas by *(map term (unit dojo-source)))
%+ more
;~(plug com ace)
;~ plug
;~(pfix tis sym)
;~ pose
;~(pfix ace (stag ~ dp-value))
(easy ~)
==
==
==
--
::
++ dy :: project work
|_ dojo-project ::
++ dy-abet +>(poy `+<) :: resolve
++ dy-amok +>(poy ~) :: terminate
++ dy-ford :: send work to ford
|= [pax=path kas=silk]
^+ +>+>
?> ?=(~ pux)
=+ bek=[our.hid %main %da lat.hid]
(he-pass(poy `+>+<.$(pux `pax)) pax %f %exec our.hid bek `kas)
::
++ dy-stop :: stop work
^+ +>
?~ pux +>
=+ bek=[our.hid %main %da lat.hid]
(he-pass(poy ~) u.pux %f %exec our.hid bek ~)
::
++ dy-slam :: call by ford
|= [pax=path gat=vase sam=vase]
^+ +>+>
(dy-ford pax %call [%done ~ %noun gat] [%done ~ %noun sam])
::
++ dy-rush :: send effects, abet
|= fec=sole-effect
^+ +>+>
(he-rush(poy `+>+<) fec)
::
++ dy-rash :: send effects, amok
|= fec=sole-effect
^+ +>+>
(he-rush(poy ~) fec)
::
++ dy-init-command :: ++dojo-command
|= mad=dojo-command
^+ [mad +>]
?- -.mad
%flat =^(src +>.$ (dy-init-source q.mad) [[%flat p.mad src] +>.$])
%pill =^(src +>.$ (dy-init-source q.mad) [[%pill p.mad src] +>.$])
%poke =^(src +>.$ (dy-init-source q.mad) [[%poke p.mad src] +>.$])
%show =^(src +>.$ (dy-init-source p.mad) [[%show src] +>.$])
%verb =^(src +>.$ (dy-init-source q.mad) [[%verb p.mad src] +>.$])
==
::
++ dy-init-source-unit :: (unit dojo-source)
|= urc=(unit dojo-source)
^+ [urc +>]
?~ urc [~ +>]
=^ src +> (dy-init-source u.urc)
[`src +>.$]
::
++ dy-init-source :: ++dojo-source
|= src=dojo-source
^+ [src +>]
=^ bul +> (dy-init-build q.src)
=: p.src num
q.src bul
==
[src +>.$(num +(num), job (~(put by job) num q.src))]
::
++ dy-init-build :: ++dojo-build
|= bul=dojo-build
^+ [bul +>]
?- -.bul
%ex [bul +>.$]
%di =^(mod +>.$ (dy-init-model p.bul) [[%di mod] +>.$])
%dv [bul +>.$]
%fi !!
%ge =^(mod +>.$ (dy-init-model p.bul) [[%ge mod] +>.$])
%sc !!
%tu =^ dof +>.$
|- ^+ [p.bul +>.^$]
?~ p.bul [~ +>.^$]
=^ dis +>.^$ (dy-init-source i.p.bul)
=^ mor +>.^$ $(p.bul t.p.bul)
[[dis mor] +>.^$]
[[%tu dof] +>.$]
%va [bul +>.$]
==
::
++ dy-init-model :: ++dojo-model
|= mol=dojo-model
^+ [mol +>]
=^ one +>.$ (dy-init-server p.mol)
=^ two +>.$ (dy-init-config q.mol)
[[one two] +>.$]
::
++ dy-init-server :: ++dojo-server
|= srv=dojo-server
=. p.srv num
[srv +>.$(num +(num), job (~(put by job) num [%dv q.srv]))]
::
++ dy-init-config :: prepare config
|= cig=dojo-config
^+ [cig +>]
=^ ord +>.$ (dy-init-ordered p.cig)
=^ key +>.$ (dy-init-named q.cig)
[[ord key] +>.$]
::
++ dy-init-ordered :: (list dojo-source)
|= ord=(list dojo-source)
^+ [ord +>]
?~ ord [~ +>.$]
=^ fir +>.$ (dy-init-source i.ord)
=^ mor +>.$ $(ord t.ord)
[[fir mor] +>.$]
::
++ dy-init-named :: (map @tas dojo-src)
|= key=(map term (unit dojo-source))
^+ [key +>.$]
?~ key [~ +>.$]
=^ top +>.$ (dy-init-source-unit q.n.key)
=^ lef +>.$ $(key l.key)
=^ rit +>.$ $(key r.key)
[[[p.n.key top] lef rit] +>.$]
::
++ dy-init :: full initialize
^+ .
=^(dam . (dy-init-command mad) +(mad dam))
::
++ dy-hand :: complete step
|= cag=cage
^+ +>+>
?> ?=(^ cud)
(dy-step(cud ~, rez (~(put by rez) p.u.cud cag)) +(p.u.cud))
::
++ dy-meal :: vase to cage
|= vax=vase
?. &(?=(@ -.q.vax) ((sane %tas) -.q.vax))
~& %dy-meal-cage
(dy-rash %bel ~)
(dy-hand -.q.vax (slot 3 vax))
::
++ dy-made-edit :: sole edit
|= cag=cage
^+ +>+>
?> ?=(^ per)
?: ?| ?=(^ q.q.cag)
=((lent buf.say) q.q.cag)
!&(?=(%del -.u.per) =(+(p.u.per) (lent buf.say)))
==
dy-abet(per ~)
=^ lic say (~(transmit cs say) u.per)
(dy-rush(per ~) %mor [%det lic] [%err q.q.cag] ~)
::
++ dy-done :: dialog submit
|= txt=tape
?> ?=(^ pro)
(dy-slam /dial u.pro !>(txt))
::
++ dy-over :: finish construction
^+ +>
?- -.mad
%poke
%- he-pass(poy ~)
:* /poke
%g
%mess
[p.p.mad [q.p.mad ~]]
our.hid
(~(got by rez) p.q.mad)
==
::
%flat
=+ out=q.q:(~(got by rez) p.q.mad)
?^ out
(dy-rash %tan [%leaf "not an atom"]~)
(dy-rash %sav p.mad out)
::
%pill
(dy-rash %sag p.mad q.q:(~(got by rez) p.q.mad))
::
%verb
dy-amok(var (~(put by var) p.mad (~(got by rez) p.q.mad)))
::
%show
(dy-rash %tan (sell q:(~(got by rez) p.p.mad)) ~)
==
::
++ dy-edit :: handle edit
|= cal=sole-change
^+ +>+>
=^ dat say (~(transceive cs say) cal)
?: |(?=(^ per) ?=(^ pux) ?=(~ pro))
~& %dy-edit-busy
=^ lic say (~(transmit cs say) dat)
(dy-rush %mor [%det lic] [%bel ~] ~)
(dy-slam(per `dat) /edit u.pro !>((tufa buf.say)))
::
++ dy-type :: sole action
|= act=sole-action
?- -.act
%det (dy-edit +.act)
%ret (dy-done (tufa buf.say))
==
::
++ dy-cage |=(num=@ud (~(got by rez) num)) :: known cage
++ dy-vase |=(num=@ud q:(dy-cage num)) :: known vase
++ dy-silk-vase |=(vax=vase [%done ~ %noun vax]) :: vase to silk
++ dy-silk-config :: configure
|= [cag=cage cig=dojo-config]
^- silk
:+ %ride [%cnzy %$]
:+ %mute [%done ~ cag]
^- (list (pair wing silk))
:* :- [[~ 12] ~]
(dy-silk-vase !>([now=lat.hid eny=eny.hid bec=he-beak]))
::
:- [[~ 26] ~]
%- dy-silk-vase
|- ^- vase
?~ p.cig !>(~)
(slop (dy-vase p.i.p.cig) $(p.cig t.p.cig))
::
%+ turn (~(tap by q.cig))
|= [a=term b=(unit dojo-source)]
^- (pair wing silk)
:- [a [~ 27] ~]
%- dy-silk-vase
?~(b !>([~ ~]) (dy-vase p.u.b))
==
::
++ dy-silk-init-modo :: init and config
|= [cag=cage cig=dojo-config]
^- silk
(dy-silk-config cag cig)
::
++ dy-silk-device :: device to silk
|= pax=path
^- silk
[%boil %gate [he-beak (flop pax)] ~]
::
++ dy-made-dial :: dialog product
|= cag=cage
^+ +>+>
?. ?=(^ q.q.cag)
(dy-rush %err q.q.cag)
=+ tan=((list tank) +2.q.q.cag)
=. +>+>.$ (he-rush %tan tan)
=+ vax=(spec (slot 3 q.cag))
?+ -.q.vax !!
%&
?~ +.q.vax
~& %dy-made-dial-abort
(dy-rash %bel ~)
(dy-meal (slot 7 vax))
::
%|
=< he-pone
%- dy-rush(pro `(slap (slot 7 vax) [%cnzy %q]))
=+ pom=(sole-prompt +<.q.vax)
[%pro pom(cad [':' ' ' cad.pom])]
==
::
++ dy-made-gent :: generator product
|= cag=cage
(dy-meal q.cag)
::
++ dy-make :: build step
^+ +>
?> ?=(^ cud)
%- dy-ford
^- (pair path silk)
?+ -.q.u.cud !!
%di [/dial (dy-silk-init-modo (dy-cage p.p.p.q.u.cud) q.p.q.u.cud)]
%ge [/gent (dy-silk-init-modo (dy-cage p.p.p.q.u.cud) q.p.q.u.cud)]
%dv [/hand (dy-silk-device p.q.u.cud)]
%ex [/hand [%ride p.q.u.cud [%reef ~]]]
%tu :- /hand
:+ %done ~
:- %noun
|- ^- vase
?~ p.q.u.cud !!
=+ hed=(dy-vase p.i.p.q.u.cud)
?~ t.p.q.u.cud hed
(slop hed $(p.q.u.cud t.p.q.u.cud))
==
::
++ dy-step :: advance project
|= nex=@ud
^+ +>+>
?> ?=(~ cud)
?: =(nex num)
dy-over
dy-make(cud `[nex (~(got by job) nex)])
--
::
++ he-dope :: sole user of ++dp
|= txt=tape ::
^- (each (unit dojo-command) hair) :: prefix/result
=+ vex=(dp-command:dp [1 1] txt) ::
?. =(+((lent txt)) q.p.vex) :: fully parsed
[%| p.p.vex (dec q.p.vex)] :: syntax error
[%& ?~(q.vex ~ `p.u.q.vex)] :: prefix/complete
::
++ he-duke :: ++he-dope variant
|= txt=tape
^- (each dojo-command ,@ud)
=+ foy=(he-dope txt)
?- -.foy
%| [%| q.p.foy]
%& ?~(p.foy [%| (lent txt)] [%& u.p.foy])
==
::
++ he-abet :: resolve
[(flop moz) %_(+> hoc (~(put by hoc) ost +<+))]
::
++ he-beak :: logical beam
^- beak
[our.hid syd ?^(luc u.luc [%da lat.hid])]
::
++ he-give :: emit gift
|= git=gift
^+ +>
%_(+> moz [[ost %give git] moz])
::
++ he-pass
|= [pax=path noy=note]
%_(+> moz [[ost %pass pax noy] moz])
::
++ he-rush :: emit update
|= fec=sole-effect
^+ +>
(he-give %rush %sole-effect fec)
::
++ he-stop :: abort work
^+ .
?~(poy . ~(dy-stop dy u.poy))
::
++ he-peer :: subscribe to
he-prom
::
++ he-pine :: restore prompt
^+ .
?^ poy .
he-prom:he-pone
::
++ he-pone :: clear prompt
^+ .
=^ cal say (~(transmit cs say) [%set ~])
(he-rush %mor [%det cal] ~)
::
++ he-prom :: send prompt
%- he-rush
:- %pro
[& %$ "> "]
::
++ he-made :: result from ford
|= [pax=path dep=@uvH rey=(each gage tang)]
^+ +>
?> ?=(^ poy)
=< he-pine
?- -.rey
%& ?> ?=(@ p.p.rey)
%. p.rey
=+ dye=~(. dy u.poy(pux ~))
?+ pax !!
[%hand ~] dy-hand:dye
[%dial ~] dy-made-dial:dye
[%gent ~] dy-made-gent:dye
[%edit ~] dy-made-edit:dye
==
%| ~& [%he-made-fail pax]
(he-rush(poy ~) %tan p.rey)
==
::
++ he-like :: accept line
|= buf=(list ,@c)
=(%& -:(he-dope (tufa buf)))
::
++ he-stir :: apply change
|= cal=sole-change
^+ +>
:: ~& [%his-clock ler.cal]
:: ~& [%our-clock ven.say]
=^ dat say (~(transceive cs say) cal)
?. ?& ?=(%del -.dat)
=(+(p.dat) (lent buf.say))
==
+>.$
=+ foy=(he-dope (tufa buf.say))
?: ?=(%& -.foy) +>.$
:: ~& [%bad-change dat ted.cal]
=^ lic say (~(transmit cs say) dat)
:: ~& [%our-leg leg.say]
(he-rush %mor [%det lic] [%err q.p.foy] ~)
::
++ he-plan :: execute command
|= mad=dojo-command
^+ +>
?> ?=(~ poy)
he-pine:(dy-step:~(dy-init dy mad [0 ~ ~ ~ ~ ~ ~]) 0)
::
++ he-done :: parse command
|= txt=tape
^+ +>
?~ txt
%- he-rush
:~ %mor
[%txt "> "]
[%nex ~]
==
=+ doy=(he-duke txt)
?- -.doy
%| (he-rush [%err p.doy])
%&
=+ old=(weld "> " (tufa buf.say))
=^ cal say (~(transmit cs say) [%set ~])
%. p.doy
=< he-plan
%- he-rush
:~ %mor
[%txt old]
[%nex ~]
[%det cal]
==
==
::
++ he-type :: apply input
|= act=sole-action
^+ +>
?^ poy
he-pine:(~(dy-type dy u.poy) act)
?- -.act
%det (he-stir +.act)
%ret (he-done (tufa buf.say))
==
--
::
++ peer
|= [ost=bone her=ship pax=path]
^- [(list move) _+>]
~? !=(her our.hid) [%dojo-peer ost her pax]
?< (~(has by hoc) ost)
?> =(/sole pax)
:: ?> =(her our.hid)
=< he-abet
%~ he-peer he
:- [ost ~]
^- session
:* *sole-share :: say=sole-share
%main :: syd=desk
~ :: luc=(unit case)
~ :: poy=(unit dojo-project)
~ :: var=(map term cage)
~ :: old=(set term)
==
::
++ poke-sole-action
|= [ost=bone her=ship act=sole-action]
^- [(list move) _+>]
:: ~? !=(her our.hid) [%dojo-poke ost her]
he-abet:(~(he-type he [ost [ost %give %nice ~]~] (~(got by hoc) ost)) act)
::
++ pour
|= [ost=bone pax=path sih=sign]
^- [(list move) _+>]
:: ~& [%dojo-pour pax]
?- -.sih
%f
he-abet:(~(he-made he [[ost ~] (~(got by hoc) ost)]) pax +>.sih)
::
%g
[~ +>.$]
==
::
++ pull
|= ost=bone
^- [(list move) _+>]
=^ moz +>
he-abet:~(he-stop he [[ost ~] (~(got by hoc) ost)])
[moz +>.$(hoc (~(del by hoc) ost))]
--

201
main/app/helm/core.hook Normal file
View File

@ -0,0 +1,201 @@
:: :: ::
:::: /hook/core/helm/app :: ::
:: :: ::
/? 314 :: zuse version
/- *sole :: structures
/+ sole :: libraries
:: :: ::
:::: :: ::
!: :: ::
=> |% :: principal structures
++ helm-house :: all state
$: %0 :: state version
bur=(unit (pair ship mace)) :: requesting ticket
hoc=(map bone helm-session) :: consoles
== ::
++ helm-session ::
$: say=sole-share ::
mud=(unit (sole-dialog ,@ud)) ::
== ::
++ funk (pair ,@ ,@) ::
++ begs ,[his=@p tic=@p eny=@t ges=gens] :: begin data
++ helm-wish ::
$| $? %reset :: reset kernel
%verb :: verbose mode
== ::
$% [%reload p=(list term)] :: reload vanes
[%sync p=@tas q=@p r=@tas ~] ::
== ::
++ dill-flog :: sent to %dill
$% [%crud p=%hax-init [%leaf p=tape] ~] :: initialize ship
[%veer p=@ta q=path r=@t] :: install vane
[%vega p=path] :: reboot by path
[%verb ~] :: verbose mode
== ::
:: ::
++ gift :: out result <-$
$% [%mean p=ares] :: error
[%nice ~] :: acknowledge
[%rush %sole-effect sole-effect] :: effect
== ::
++ hapt ,[p=ship q=path] ::
++ move ,[p=bone q=(mold note gift)] ::
++ note-gall :: note to %gall
$% [%mess p=[p=ship q=path] q=ship r=cage] ::
[%show p=[p=ship q=path] q=ship r=path] ::
[%took p=[p=ship q=path] q=ship] ::
== ::
++ note-dill :: system command
$% [%flog p=dill-flog] ::
== ::
++ note-clay :: filesystem command
$% [%font p=@p q=@tas r=@p s=@tas] ::
== ::
++ note :: out request $->
$% [%c note-clay] ::
[%d note-dill] ::
[%g note-gall] ::
== ::
-- ::
:: ::
:::: ::
:: ::
|_ $: hid=hide :: system state
helm-house :: program state
== ::
++ he :: per session
|_ [[ost=bone moz=(list move)] helm-session] ::
++ he-abet :: resolve
[(flop moz) %_(+> hoc (~(put by hoc) ost +<+))] ::
:: ::
++ he-give :: emit gift
|= git=gift
%_(+> moz [[ost %give git] moz])
::
++ he-wish-reset
^+ .
=- %_(+ moz (weld zum moz))
^= zum %- flop ^- (list move)
=+ top=`path`/(scot %p our.hid)/main/(scot %da lat.hid)/arvo
:- [ost %pass /reset %d %flog %vega (weld top `path`/hoon)]
%+ turn
^- (list ,[p=@tas q=@tas])
:~ [%$ %zuse]
[%a %ames]
[%c %clay]
[%d %dill]
[%e %eyre]
[%f %ford]
[%g %gall]
[%t %time]
==
|= [p=@tas q=@tas]
=+ pax=`path`(welp top /[q])
=+ txt=((hard ,@) .^(%cx (welp pax /hoon)))
[ost %pass /reset %d %flog %veer p pax txt]
::
++ he-wish-reload
|= all=(list term)
%_ +>.$
moz
%- weld
:_ moz
%+ turn all
=+ ark=(arch .^(%cy /(scot %p our.hid)/main/(scot %da lat.hid)/arvo))
=+ van=(~(tap by r.ark))
|= nam=@tas
=. nam
?. =(1 (met 3 nam))
nam
=+ ^- zaz=(list ,[p=span ~])
(skim van |=([a=term ~] =(nam (end 3 1 a))))
?> ?=([[@ ~] ~] zaz)
`term`p.i.zaz
=+ tip=(end 3 1 nam)
=+ pax=[(scot %p our.hid) %main (scot %da lat.hid) %arvo nam %hoon ~]
:* ost
%pass
/reload
%d
%flog
[%veer ?:(=('z' tip) %$ tip) pax (,@ .^(%cx pax))]
==
==
::
++ he-wish-sync
|= [syd=@tas her=@p sud=@tas ~]
%_ .
moz
:_ moz
[ost %pass /sync %c %font our.hid syd her sud]
==
::
++ he-wish-verb
%_ .
moz
:_ moz
[ost %pass /verb %d %flog %verb ~]
==
++ he-wish-init
|= him=ship
%_ +>.$
moz
:_ moz
[ost %pass /init %d %flog %crud %hax-init leaf/(scow %p him) ~]
==
--
::
++ hake :: poke core
|= [ost=bone her=ship]
?> =(her our.hid)
~(. he [ost [ost %give %nice ~]~] (fall (~(get by hoc) ost) *helm-session))
::
++ poke-helm-reset
|= [ost=bone her=ship ~]
~& %poke-helm-reset
he-abet:he-wish-reset:(hake ost her)
::
++ poke-helm-verb
|= [ost=bone her=ship ~]
~& %poke-helm-verb
he-abet:he-wish-verb:(hake ost her)
::
++ poke-helm-init
|= [ost=bone her=ship him=ship]
~& %poke-helm-init
he-abet:(he-wish-init:(hake ost her) him)
::
++ poke-helm-reload
|= [ost=bone her=ship all=(list term)]
~& %poke-helm-reload
he-abet:(he-wish-reload:(hake ost her) all)
::
++ poke-helm-sync
|= [ost=bone her=ship all=[@tas @p @tas ~]]
~& %poke-helm-sync
he-abet:(he-wish-sync:(hake ost her) all)
::
++ poke-helm-begin
|= [ost=bone you=ship begs]
~& %poke-helm-begin
?> ?=(~ bur)
=+ buz=(shax :(mix (jam ges) eny))
=+ loy=(bruw 2.048 buz)
:_ +>.$(bur `[his [0 sec:ex:loy]~])
:~ :* ost %pass /ticketing %a %want [our.hid (sein his)] /q/ta
his tic ges pub:ex:loy
==
[ost %give %nice ~]
==
::
++ poke-will
|= [ost=bone you=ship wil=(unit will)]
?> ?=(^ bur)
:_ +>.$(bur ~)
?~ wil
[ost %give %mean ~ %rejected ~]~
:~ [ost %pass / %a %cash p.u.bur q.u.bur u.wil]
[ost %pass / %c %plug our.hid %main (sein our.hid) %main]
[ost %give %nice ~]
==
--

View File

@ -1,46 +0,0 @@
:: Hi, send optional message to a ship
::
:::: /hook/core/hi/bin
::
/+ sh-utils
::
::::
::
|%
++ sign ::
$% $: %g ::
$% [%nice ~] ::
[%mean p=ares] ::
== == ==
++ flog :: sent to %dill
$% [%crud p=@tas q=(list tank)] ::
[%text p=tape] ::
== ::
--
!:
::::
::
|_ [hid=hide ~]
++ peer ,_`.
++ poke--args
|= [bone you=ship her=ship mes=?(~ [tex=tape ~])]
%. +<
%+ add-resp
=+ mez=[%txt !>(?~(mes '' (crip tex.mes)))]
[%pass /hi/(scot %p her) %g %mess [her /hi] you mez]
(add-nice ,_`+>.$)
::
++ poke-txt
%- add-nice
|= [ost=bone him=ship cor=@t]
:_ +>.$
[ost %pass /di %d %flog %text "< {<him>}: {(trip cor)}"]~
::
++ pour
|= [ost=bone pax=path sih=sign]
?> ?=([%hi @t ~] pax)
%. +<
=+ ack=?+(+<.sih "unsuccesful" %nice "succesful")
(add-exit (print +>.$ "hi {(trip i.t.pax)} {ack}"))
::
--

165
main/app/matrix/hymn.hook Normal file
View File

@ -0,0 +1,165 @@
:: Matrix GUI
::
:::: /hook/hymn/matr/app
::
/? 310
|%
++ cdnj |=(a=tape ;script(src "//cdnjs.cloudflare.com/ajax/libs/{a}");)
--
::
::::
::
^- manx
;html
;head
;title: Matrix
;* %- turn :_ cdnj ^- wall
:~ "jquery/2.1.1/jquery.min.js"
"mousetrap/1.4.6/mousetrap.js"
"react/0.11.0/react.js"
==
;script(src "/~/at/main/lib/urb.js");
;script: urb.appl = 'sole'
;style:'''
#term {
width: 100%;
}
#term * {
margin: 0px;
}
'''
==
;body
;div#err;
;div#term:""
;script(type "text/coffeescript") ;- %- trip
'''
[DOM,recl,rend] = [React.DOM, React.createClass, React.renderComponent]
[div, pre] = [DOM.div, DOM.pre]
Matr = recl render: ->
[pro,cur] = [@props.prompt + " ", @props.cursor + 1]
prompt = "#{pro.slice(0,cur)}\u0332#{pro.slice(cur)}"
lines = [prompt, @props.rows...]
div {}, lines.slice().reverse().map (lin)->
pre {}, lin
$ ->
termRev = 0
pressed = []
deltim = null
met = $('<pre>').text('m').css(display: 'none').appendTo(term).width()
subs = ""
# $(window).resize ->
# window.termWif = ($(term).width() / met).toFixed()
# path = "/new/#{termWif}"
# if path is subs
# return
# if subs
# urb.unsubscribe {path:subs}
# subs = path
# urb.subscribe {path}, (err,dat)->
# if err or dat.data.ok
# return;
# syncRev = dat.data.rev
# unless termRev > syncRev
# termRev = syncRev
# matr.setProps rows: dat.data.stak
# document.title = "Matrix" # XX debug
# $(window).resize()
matr = rend (Matr rows:[], prompt:"", cursor:1), term
flash = ($el, background)->
$el.css {background}
if background
setTimeout (()-> flash $el,''), 50
peer = (ruh) ->
switch false
when !ruh.map then ruh.map peer
when !ruh.pro then matr.setProps prompt: ruh.pro
when !ruh.hop then matr.setProps cursor: ruh.hop
when !ruh.out
matr.setProps rows: [ruh.out, matr.props.rows...]
when !ruh.act then switch ruh.act
when 'clr' then matr.setProps rows:[]
when 'bel' then flash ($ 'body'), 'black'
else throw "Unknown "+(JSON.stringify ruh)
else console.log ruh
urb.bind "", (err,d)->
if d.data then peer d.data
#later = (data)->
# if data
# pressed.push data
# clearTimeout deltim
# setTimeout (->
# if urb.reqq.length > 0
# return deltim = later()
# urb.send data: pressed
# pressed = []
# ), 500
Mousetrap.handleKey = (char, mod, e)->
norm = {
capslock: 'caps'
pageup: 'pgup'
pagedown: 'pgdn'
backspace: 'baxp'
enter: 'entr'
}
key =
if char.length is 1
if e.type is 'keypress'
str: char
else if e.type is 'keydown'
if char isnt 'space'
act: norm[char] ? char
else if e.type is 'keyup' and norm[key] is 'caps'
act: 'uncap'
if key
e.preventDefault()
urb.send mark: 'dill-belt', data: {mod,key}
# amod = (arr)->
# for i in arr
# unless mod.indexOf(i) < 0
# return yes
# no
# if key.str or key.act is 'baxp' or key.act is 'entr'
# termRev++
# [bot, rest...] = old = matr.props.rows
# matr.setProps rows:(
# switch key.act
# when 'baxp'
# if amod ['ctrl', 'meta']
# ['', rest...]
# else if amod ['alt']
# [(bot.replace /\ *[^ ]*$/, ''), rest...]
# else if bot and bot.length
# [bot.slice(0, -1), rest...]
# else if rest[0] and rest[0].length
# res = rest.slice()
# res[0] = res[0].slice(0, -1)
# res
# else rest
# when 'entr'
# ['', old...]
# when undefined
# if mod.length > 1 or (mod.length and !amod ['shift'])
# old
# else unless old and bot isnt null
# [key.str]
# #else if bot.length is termWif
# # [key.str, old...]
# else [bot + key.str, rest...]
# )
# document.title = "Matri" # XX debug
# later {mod, key}
'''
==
;+ (cdnj "coffee-script/1.7.1/coffee-script.min.js")
== ==

View File

@ -1,94 +0,0 @@
/- mess,user,users,zing,zong
!:
=> |%
++ axle
$% [%0 p=(map path ,[p=(list zong) q=(map ship ,?)])]
==
++ blitz
$% [%zong p=zong]
[%user p=user]
==
++ iron
$% [%zongs p=(list zong)]
[%users p=users]
==
++ gift
$% [%rush blitz]
[%rust iron]
[%mean ares]
[%nice ~]
==
++ move ,[p=bone q=(mold note gift)]
++ note ,[%c %info p=@p q=@tas r=nori] :: internal edit
--
|_ [hid=hide vat=axle]
++ grab
|= sta=path
(fall (~(get by p.vat) sta) *[p=(list zong) q=(map ship ,?)])
::
++ ident
|= you=ship
%- (hard ,@t)
.^(%a (scot %p our.hid) %name (scot %da lat.hid) (scot %p you) ~)
::
++ peer
|= [ost=bone you=ship pax=path]
^- [(list move) _+>]
?~ pax
[[ost %give %mean ~ %radio-bad-path ~]~ +>.$]
=+ ya=(grab t.pax)
?+ -.pax [~ +>.$]
%mensajes
[[ost %give %rust %zongs p.ya]~ +>.$]
%amigos
=. q.ya (~(put by q.ya) you %.y)
:_ +>.$(p.vat (~(put by p.vat) t.pax ya))
:_ (send pax %give %rush %user %in you (ident you))
:* ost %give %rust %users
%+ murn (~(tap by q.ya))
|= [shi=ship liv=?]
?. liv
~
(some [shi (ident shi)])
==
==
::
++ poke-zing
|= [ost=bone you=ship zig=zing]
^- [(list move) _+>]
=+ ya=(grab p.zig)
?. (~(has by q.ya) you)
[[ost %give %mean ~ %no-te-conozco ~]~ +>.$]
=+ zog=`zong`[%mess lat.hid you q.zig]
=. p.vat (~(put by p.vat) p.zig [[zog p.ya] q.ya])
:_ +>.$
:- [ost %give %nice ~]
(send mensajes/p.zig %give %rush %zong zog)
::
++ poke-bit
|= [ost=bone you=ship ~]
^- [(list move) _+>]
:_ +>.$
=+ paf=/(scot %p our.hid)/try/(scot %da lat.hid)/radio/backlog/jam
[ost %pass /jamfile %c %info our.hid (foal paf (jam +<+.+>.$))]~
::
++ pull
|= ost=bone
^- [(list move) _+>]
=+ ^- (unit ,[his=ship pax=path])
(~(get by sup.hid) ost)
?~ - ~& %strange-pull [~ +>.$]
?. ?=([%mensajes *] pax.u)
[~ +>.$]
=+ sta=(~(got by p.vat) t.pax.u)
=. q.sta %+ ~(put by q.sta) his.u %.n
=. p.vat %+ ~(put by p.vat) t.pax.u sta
[(send amigos/t.pax.u %give %rush %user %out his.u (ident his.u)) +>.$]
::
++ send
|= [pax=path msg=(mold note gift)]
^- (list move)
:: ~& [%radi-sub pus.hid]
%+ turn (~(tap in (~(get ju pus.hid) pax)))
|=(ost=bone [ost msg])
--

View File

@ -25,6 +25,6 @@
?> ?=([[@ ~] ~] zaz) ?> ?=([[@ ~] ~] zaz)
`term`p.i.zaz `term`p.i.zaz
=+ tip=(end 3 1 nam) =+ tip=(end 3 1 nam)
=+ pax=[(scot %p our.hid) %main (scot %da lat.hid) %arvo nam %hoon ~] =+ pax=[(scot %p our.hid) %main (scot %da lat.hid) %arvo nam ~]
[%veer ?:(=('z' tip) %$ tip) pax (,@ .^(%cx pax))] [%veer ?:(=('z' tip) %$ tip) pax (,@ .^(%cx (welp pax /hoon)))]
-- --

View File

@ -1,763 +0,0 @@
::
:::: /hook/core/rodeo/app
::
/? 314
/- *rodeo, *twitter
/+ rodeo
::
::::
::
!:
=> |% :: data structures
++ house ,[%1 house-1] :: full state
++ house-any :: app history
$% [%1 house-1] :: 1: rodeo
[%0 house-0] :: 0: initial version
== ::
++ house-1 ::
$: stories=(map span story) :: conversations
general=(set bone) :: meta-subscribe
outbox=(pair ,@ud (map ,@ud thought)) :: urbit outbox
folks=(map ship human) :: human identities
== ::
++ house-0 :: legacy state
%+ map path ::
,[p=(list zong) q=(map ship ,?)] ::
:: ::
++ zong :: legacy messages
$% $: %mess p=@da q=ship ::
$= r ::
$% [%do p=@t] ::
[%exp p=@t q=tank] ::
[%say p=@t] ::
== == == ::
++ story :: wire content
$: count=@ud :: (lent grams)
grams=(list telegram) :: all history
locals=(map ship (pair ,@da status)) :: local presence
remotes=(map partner atlas) :: remote presence
sequence=(map partner ,@ud) :: partners heard
shape=config :: configuration
known=(map serial ,@ud) :: messages heard
guests=(map bone river) :: message followers
viewers=(set bone) :: presence followers
owners=(set bone) :: config followers
== ::
++ river (pair point point) :: stream definition
++ point :: stream endpoint
$% [%ud p=@ud] :: by number
[%da p=@da] :: by date
== ::
++ gift :: result
$% [%rush %rodeo-report report] :: refresh
[%mean ares] :: cancel
[%nice ~] :: accept
== ::
++ sign :: response
$% $: %e :: from %eyre
$% [%thou p=httr] :: HTTP response
== == ::
$: %g :: application
$% [%mean p=ares] :: cancel
[%nice ~] :: acknowledge
[%rush p=silt] :: subs data
== == ::
$: %t ::
$% [%wake ~] :: timer wakeup
== == == ::
++ silt
$% [%rodeo-report p=report] :: refresh
[%twit-stat p=twit-stat] :: tweet reciept
[%twit-feed p=(list twit-stat)] :: tweet reciept
==
++ move ,[p=bone q=(mold note gift)] :: all actions
++ hapt ,[p=ship q=path] :: app instance
++ note :: requests
$% $: %c ::
$% [%info p=@p q=@tas r=nori] ::
== == ::
$: %e :: through %eyre
$% [%them p=(unit hiss)] :: HTTP request
== == ::
$: %g :: network
$% [%mess p=hapt q=ship r=cage] :: message
[%nuke p=hapt q=ship] :: cancel
[%show p=hapt q=ship r=path] :: subscribe
[%took p=hapt q=ship] :: acknowledge
== == ::
$: %t ::
$% [%wait p=@da] ::
== == == ::
--
|_ [hid=hide house]
++ ra :: transaction core
|_ [ost=bone moves=(list move)]
++ ra-abet :: resolve core
^- [(list move) _+>]
[(flop moves) +>]
::
++ ra-emil :: ra-emit move list
|= mol=(list move)
%_(+> moves (welp (flop mol) moves))
::
++ ra-emit :: emit a move
|= mov=move
%_(+> moves [mov moves])
::
++ ra-ever :: emit success
(ra-emit ost %give %nice ~)
::
++ ra-evil :: emit error
|= msg=cord
~& [%ra-evil msg]
(ra-emit ost %give %mean ~ msg ~)
::
++ ra-hiss :: emit http request
|= [pax=path hiz=hiss]
(ra-emit ost %pass pax %e %them ~ hiz)
::
++ ra-house :: emit partners
|= ost=bone
%+ ra-emit ost
:^ %give %rush %rodeo-report
:- %house
%- ~(gas in *(map span (pair posture cord)))
%+ turn (~(tap by stories))
|=([a=span b=story] [a p.cordon.shape.b caption.shape.b])
::
++ ra-homes :: update partners
=+ gel=general
|- ^+ +>
?~ gel +>
=. +> $(gel l.gel)
=. +> $(gel r.gel)
(ra-house n.gel)
::
++ ra-init :: initialize rodeo
=+ sir=(sein our.hid)
%+ ra-apply our.hid
:+ %design (main our.hid)
:- ~
:_ [%default ?:((gte our.hid 65.536) %brown %black) ~]
?:(=(sir our.hid) ~ [[%& sir (main sir)] ~ ~])
::
++ ra-apply :: apply command
|= [her=ship cod=command]
^+ +>
~& [%ra-apply cod]
?- -.cod
%design
?. =(her our.hid)
(ra-evil %rodeo-no-owner)
?~ q.cod
?. (~(has by stories) p.cod)
(ra-evil %rodeo-no-story)
=. +>.$ (ra-config p.cod *config)
ra-ever(stories (~(del by stories) p.cod))
=. +>.$ (ra-config p.cod u.q.cod)
ra-ever
::
%review ra-ever:(ra-think | her +.cod)
%publish ra-ever:(ra-think & her +.cod)
==
::
++ ra-config :: configure story
|= [man=span con=config]
^+ +>
=+ :- neu=(~(has by stories) man)
pur=(fall (~(get by stories) man) *story)
=. +>.$ pa-abet:(~(pa-reform pa man pur) con)
?:(neu +>.$ ra-homes)
::
++ ra-friend :: %friend response
|= [man=span tay=partner sih=sign]
^+ +>
=+ pur=(~(get by stories) man)
?~ pur ~& [%ra-friend-none man] +>.$
pa-abet:(~(pa-friend pa man u.pur) tay sih)
::
++ ra-twitter :: %twitter response
|= [[num=@ud man=span] sih=sign]
^+ +>
?+ sih ~|([%rodeo-bad-twitter sih] !!)
[%g ?(%nice %mean) ~]
+>
[%g %mean ^]
(ra-repeat num [%| %twitter man] sih)
[%g %rush %twit-stat *]
(ra-repeat num [%| %twitter man] [%g %nice ~])
==
::
++ ra-repeat :: %repeat response
|= [num=@ud pan=partner sih=sign]
=+ oot=(~(get by q.outbox) num)
?~ oot ~& [%ra-repeat-none num] +>.$
=. q.outbox (~(del by q.outbox) num)
=. q.u.oot
=+ olg=(~(got by q.u.oot) pan)
%+ ~(put by q.u.oot) pan
:- -.olg
?+ sih !!
[%g %mean *] ~&([%rodeo-repeat-rejected num pan sih] %rejected)
[%g %nice ~] %received
==
(ra-think | our.hid u.oot ~)
::
++ ra-cancel :: drop a bone
^+ .
=+ hep=(~(get by sup.hid) ost)
?~ hep +
?. ?=([@ @ *] q.u.hep)
+(general (~(del in general) ost))
=* man i.t.q.u.hep
=+ pur=(~(get by stories) man)
?~ pur +>
pa-abet:(pa-notify:~(pa-cancel pa man u.pur) p.u.hep %gone *human)
::
++ ra-human :: look up person
|= her=ship
^- [human _+>]
=^ who folks
=+ who=(~(get by folks) her)
?^ who [u.who folks]
=+ who=`human`[~ `(scot %p her)] :: XX do right
[who (~(put by folks) her who)]
[who +>.$]
::
++ ra-subscribe :: listen to
|= [her=ship pax=path]
^+ +>
:: ~& [%ra-subscribe her pax]
?: ?=(~ pax)
(ra-house(general (~(put in general) ost)) ost)
?. ?=([@ @ *] pax)
(ra-evil %rodeo-bad-path)
=+ ^= vab ^- (set ,@tas)
=| vab=(set ,@tas)
|- ^+ vab
?: =(0 i.pax) vab
$(i.pax (rsh 3 1 i.pax), vab (~(put in vab) (end 3 1 i.pax)))
=+ pur=(~(get by stories) i.t.pax)
?~ pur
~& [%bad-subscribe-story-c i.t.pax]
(ra-evil %rodeo-no-story)
=+ soy=~(. pa i.t.pax u.pur)
=. soy ?.((~(has in vab) %a) soy (pa-watch:soy her))
=. soy ?.((~(has in vab) %x) soy (pa-master:soy her))
=. soy ?.((~(has in vab) %f) soy (pa-listen:soy her t.t.pax))
=^ who +>.$ (ra-human her)
pa-abet:(pa-notify:soy her %hear who)
::
++ ra-think :: publish/review
|= [pub=? her=ship tiz=(list thought)]
^+ +>
?~ tiz +>
$(tiz t.tiz, +> (ra-consume pub her i.tiz))
::
++ ra-consume :: consume thought
|= [pub=? her=ship tip=thought]
=+ aud=(~(tap by q.tip) ~)
|- ^+ +>.^$
?~ aud +>.^$
$(aud t.aud, +>.^$ (ra-conduct pub her p.i.aud tip))
::
++ ra-conduct :: thought to partner
|= [pub=? her=ship tay=partner tip=thought]
^+ +>
:: ~& [%ra-conduct pub her tay]
?- -.tay
%& ?: pub
=. her our.hid :: XX security!
?: =(her p.p.tay)
(ra-record q.p.tay p.p.tay tip)
(ra-transmit p.tay tip)
?. =(our.hid p.p.tay)
+>
(ra-record q.p.tay her tip)
%| ?. pub +>
?- -.p.tay
%twitter
(ra-tweet p.p.tay tip)
== ==
::
++ ra-record :: add to story
|= [man=span gam=telegram]
^+ +>
=+ pur=(~(get by stories) man)
?~ pur
~& [%no-story man]
+>.$
pa-abet:(~(pa-learn pa man u.pur) gam)
::
++ ra-transmit :: send to neighbor
|= [cuz=station tip=thought]
^+ +>
=. +>
%+ ra-emit ost
:* %pass
/repeat/(scot %ud p.outbox)/(scot %p p.cuz)/[q.cuz]
%g
%mess
[p.cuz /rodeo]
our.hid
[%rodeo-command !>(`command`[%review tip ~])]
==
+>(p.outbox +(p.outbox), q.outbox (~(put by q.outbox) p.outbox tip))
::
++ ra-tweet :: send to /twit
|= [man=span tip=thought]
=* sta r.tip
?> ?=(%lin -.r.sta)
=. q.outbox (~(put by q.outbox) p.outbox tip)
%^ ra-emil(p.outbox +(p.outbox))
:* ost
%pass /twitter/stat/(scot %ud p.outbox)/[man]
%g %mess
[our.hid /twit] our.hid
[%twit-do !>(`twit-do`[man %post p.tip q.r.sta])]
==
:* ost
%pass /twitter/stat/(scot %ud p.outbox)/[man]
[%g %show [our.hid /twit] our.hid /post/(scot %uv p.tip)]
==
~
++ pa :: story core
|_ $: man=span
story
==
++ pa-abet
^+ +>
+>(stories (~(put by stories) man `story`+<+))
::
++ pa-admire :: accept from
|= her=ship
^- ?
::?- -.cordon.shape
:: %& (~(has in p.cordon.shape) her)
:: %| !(~(has in p.cordon.shape) her)
::==
&
::
++ pa-watch :: watch presence
|= her=ship
?. (pa-admire her)
(pa-sauce ost [[%mean ~ %rodeo-watch-unauthorized ~] ~])
=. viewers (~(put in viewers) ost)
(pa-display ost ~ ~)
::
++ pa-master :: hear config
|= her=ship
?. (pa-admire her)
(pa-sauce ost [[%mean ~ %rodeo-master-unauthorized ~] ~])
=. owners (~(put in owners) ost)
:: ~& [%pa-master her man shape]
(pa-sauce ost [[%rush %rodeo-report %config shape] ~])
::
++ pa-display :: update presence
|= vew=(set bone)
=+ ^= reg
:_ remotes
|- ^- atlas
?~ locals ~
[[p.n.locals q.q.n.locals] $(locals l.locals) $(locals r.locals)]
:: ~& [%pa-display man reg]
|- ^+ +>.^$
?~ vew +>.^$
=. +>.^$ $(vew l.vew)
=. +>.^$ $(vew r.vew)
(pa-sauce n.vew [[%rush %rodeo-report %group reg] ~])
::
++ pa-monitor :: update config
=+ owe=owners
|- ^+ +>
?~ owe +>
=. +> $(owe l.owe)
=. +> $(owe r.owe)
:: ~& [%pa-monitor man shape]
(pa-sauce n.owe [[%rush %rodeo-report %config shape] ~])
::
++ pa-friend :: subscribed update
|= [tay=partner sih=sign]
^+ +>
?+ sih ~|([%rodeo-bad-friend sih] !!)
[%g %nice ~]
+>.$
::
[%g %mean *]
?~ +>.sih
(pa-acquire [tay ~])
~& [%pa-friend-mean +>.sih]
pa-monitor(sources.shape (~(del in sources.shape) tay))
::
[%g %rush %twit-feed *]
%- pa-lesson
%+ turn p.p.sih |= twit-stat
^- telegram
:^ our.hid :: XX inaccurate
(shas %twit id)
`audience`[[tay [& ~ tay] %received] `~] :: current party?
^- statement
:+ now
~ :: XX hashtags
[%lin & txt]
[%g %rush %rodeo-report *]
:: ~& [%pa-friend-report +>+.sih]
?> ?=(& -.tay)
=. +> %+ pa-scrub ost
:_ ~
:- /friend/show/[man]/(scot %p p.p.tay)/[q.p.tay]
[%g %took [p.p.tay /rodeo] our.hid]
?+ -.p.p.sih ~|([%rodeo-odd-friend sih] !!)
%config +>.$
%group (pa-remind tay +.p.p.sih)
%grams (pa-lesson q.+.p.p.sih)
==
==
::
++ pa-scrub :: pass forward
|= [ost=bone bub=(list (pair path note))]
%_ +>.$
moves
(welp (flop (turn bub |=(a=(pair path note) [ost %pass a]))) moves)
==
::
++ pa-sauce :: send backward
|= [ost=bone gub=(list gift)]
%_ +>.$
moves
(welp (flop (turn gub |=(a=gift [ost %give a]))) moves)
==
::
++ pa-abjure :: unsubscribe move
|= tal=(list partner)
%+ pa-scrub 0
%- zing
%+ turn tal
|= tay=partner
?- -.tay
%| ~& tweet-abjure/p.p.tay
!!
:: :~ :- /friend/nuke/[man]/twitter/[p.p.tay]
:: [%g %nuke [our.hid /twit] our.hid]
:: ==
::
%& :: ~& [%pa-abjure [our.hid man] [p.p.tay q.p.tay]]
:~ :- /friend/nuke/[man]/(scot %p p.p.tay)/[q.p.tay]
[%g %nuke [p.p.tay /rodeo] our.hid]
==
==
::
++ pa-acquire :: subscribe to
|= tal=(list partner)
%+ pa-scrub 0
%- zing
%+ turn tal
|= tay=partner
^- (list (pair path note))
=+ num=(fall (~(get by sequence) tay) 0)
?- -.tay
%| ~& tweet-acquire/p.p.tay
:~ :- /friend/show/[man]/twitter/[p.p.tay]
[%g %show [our.hid /twit] our.hid /user/[p.p.tay]]
==
::
%& :: ~& [%pa-acquire [our.hid man] [p.p.tay q.p.tay]]
:~ :- /friend/show/[man]/(scot %p p.p.tay)/[q.p.tay]
[%g %show [p.p.tay /rodeo] our.hid /af/[q.p.tay]/(scot %ud num)]
==
==
::
++ pa-reform :: reconfigure, ugly
|= cof=config
=+ ^= dif ^- (pair (list partner) (list partner))
=+ old=`(list partner)`(~(tap in sources.shape) ~)
=+ new=`(list partner)`(~(tap in sources.cof) ~)
:- (skip new |=(a=partner (~(has in sources.shape) a)))
(skip old |=(a=partner (~(has in sources.cof) a)))
=. +>.$ (pa-acquire p.dif)
=. +>.$ (pa-abjure q.dif)
=. shape cof
pa-monitor
::
++ pa-cancel :: unsubscribe from
:: ~& [%pa-cancel ost]
%_ .
guests (~(del by guests) ost)
viewers (~(del in viewers) ost)
owners (~(del in owners) ost)
==
::
++ pa-notify :: local presence
|= [her=ship saz=status]
^+ +>
=+ ^= nol
?: =(%gone p.saz)
(~(del by locals) her)
(~(put by locals) her lat.hid saz)
?: =(nol locals) +>.$
(pa-display(locals nol) viewers)
::
++ pa-remind :: remote presence
|= [tay=partner loc=atlas rem=(map partner atlas)]
=+ ^= buk
=+ mer=(turn (~(tap by rem) ~) |=([* a=atlas] a))
|- ^- atlas
?~ mer loc
=. loc $(mer t.mer)
=+ dur=`(list (pair ship status))`(~(tap by i.mer) ~)
|- ^- atlas
?~ dur loc
=. loc $(dur t.dur)
=+ fuy=(~(get by loc) p.i.dur)
?~ fuy (~(put by loc) p.i.dur q.i.dur)
?: =(`presence`p.q.i.dur `presence`p.u.fuy)
loc
?- p.u.fuy
%gone (~(del by loc) p.i.dur q.i.dur)
%talk loc
%hear (~(put by loc) p.i.dur q.i.dur)
==
=+ gub=(~(get by remotes) tay)
:: ~& [%pa-remind tay gub buk]
?. |(?=(~ gub) !=(buk u.gub))
+>.$
=. remotes (~(put by remotes) tay buk)
(pa-display viewers)
::
++ pa-start :: start stream
|= riv=river
^+ +>
=- :: ~& [%pa-start riv lab]
=. +>.$ (pa-sauce ost [[%rush %rodeo-report %grams q.lab r.lab] ~])
?: p.lab
(pa-sauce ost [[%mean ~] ~])
+>.$(guests (~(put by guests) ost riv))
^= lab
=+ [end=count gaz=grams dun=| zeg=*(list telegram)]
|- ^- (trel ,? ,@ud (list telegram))
?~ gaz [dun end zeg]
?: ?- -.q.riv :: after the end
%ud (lte p.q.riv end)
%da (lte p.q.riv p.r.q.i.gaz)
==
$(end (dec end), gaz t.gaz)
?: ?- -.p.riv :: before the start
%ud (lth end p.p.riv)
%da (lth p.r.q.i.gaz p.p.riv)
==
[dun end zeg]
$(end (dec end), gaz t.gaz, zeg [i.gaz zeg])
::
++ pa-listen :: subscribe
|= [her=ship pax=path]
^+ +>
?. (pa-admire her)
(pa-sauce ost [[%mean ~ %rodeo-listen-unauthorized ~] ~])
=+ ^= ruv ^- (unit river)
?: ?=(~ pax)
`[[%ud count] [%da (dec (bex 128))]]
?: ?=([@ ~] pax)
=+ say=(slay i.pax)
?. ?=([~ %$ ?(%ud %da) @] say) ~
`[(point +>.say) [%da (dec (bex 128))]]
?. ?=([@ @ ~] pax) ~
=+ [say=(slay i.pax) den=(slay i.t.pax)]
?. ?=([~ %$ ?(%ud %da) @] say) ~
?. ?=([~ %$ ?(%ud %da) @] den) ~
`[(point +>.say) (point +>.den)]
:: ~& [%pa-listen her pax ruv]
?~ ruv
(pa-sauce ost [[%mean ~ %rodeo-malformed ~] ~])
(pa-start u.ruv)
::
++ pa-refresh :: update stream
|= [num=@ud gam=telegram]
~& [%pa-refresh man num gam guests]
=+ ^= moy
|- ^- (pair (list bone) (list move))
?~ guests [~ ~]
:: ~& [%pa-refresh num n.guests]
=+ lef=$(guests l.guests)
=+ rit=$(guests r.guests)
=+ old=[p=(welp p.lef p.rit) q=(welp q.lef q.rit)]
?: ?- -.q.q.n.guests :: after the end
%ud (lte p.q.q.n.guests num)
%da (lte p.q.q.n.guests p.r.q.gam)
==
[[p.n.guests p.old] [[p.n.guests %give %mean ~] q.old]]
?: ?- -.p.q.n.guests :: before the start
%ud (gth p.p.q.n.guests num)
%da (gth p.p.q.n.guests p.r.q.gam)
==
old
:- p.old
[[p.n.guests %give %rush %rodeo-report %grams num gam ~] q.old]
=. moves (welp q.moy moves)
|- ^+ +>.^$
?~ p.moy +>.^$
$(p.moy t.p.moy, guests (~(del by guests) i.p.moy))
::
++ pa-lesson :: learn multiple
|= gaz=(list telegram)
^+ +>
?~ gaz +>
$(gaz t.gaz, +> (pa-learn i.gaz))
::
++ pa-learn :: learn message
|= gam=telegram
^+ +>
?. (pa-admire p.gam)
~& %pa-admire-rejected
+>.$
=. q.q.gam
=+ ole=(~(get by q.q.gam) [%& our.hid man])
?~ ole q.q.gam
(~(put by q.q.gam) [%& our.hid man] -.u.ole %received)
=+ old=(~(get by known) p.q.gam)
?~ old
(pa-append gam)
(pa-revise u.old gam)
::
++ pa-append :: append new
|= gam=telegram
^+ +>
%+ %= pa-refresh
grams [gam grams]
count +(count)
known (~(put by known) p.q.gam count)
==
count
gam
::
++ pa-revise :: revise existing
|= [num=@ud gam=telegram]
=+ way=(sub count num)
=. grams (welp (scag (dec way) grams) [gam (slag way grams)])
(pa-refresh num gam)
--
--
++ peer
|= [ost=bone her=ship pax=path]
^- [(list move) _+>]
:: ~& [%rodeo-peer ost her pax]
ra-abet:(~(ra-subscribe ra ost ~) her pax)
::
++ poke-rodeo-command
|= [ost=bone her=ship cod=command]
^- [(list move) _+>]
:: ~& [%rodeo-poke-command her cod]
=^ moz +>.$ ra-abet:(~(ra-apply ra ost ~) her cod)
[moz +>.$]
::
++ pour
|= [ost=bone pax=path sih=*]
^- [(list move) _+>]
:: ~& sih=sih
=+ sih=((hard sign) sih)
:: ~& [%rodeo-pour ost pax sih]
?+ pax ~& [%rodeo-strange-path pax] !!
::
[%twitter *]
=- ra-abet:(~(ra-twitter ra ost ~) met sih)
^= met
?+ t.pax ~| [%rodeo-twitter-strange-path pax] !!
:: [%mine @ @ ~]
:: [i.t.pax i.t.t.t.pax]
[%stat @ @ ~]
[(slav %ud i.t.t.pax) i.t.t.t.pax]
==
::
[%friend *]
?> ?=([@ @ @ @ ~] t.pax)
?. =(%show i.t.pax)
~& [%pour-friend-nuke-nuke pax]
[~ +>.$]
=+ man=i.t.t.pax
=+ ?: ?=(%twitter i.t.t.t.pax)
tay=[%| i.t.t.t.pax i.t.t.t.t.pax]
tay=[%& (slav %p i.t.t.t.pax) i.t.t.t.t.pax]
ra-abet:(~(ra-friend ra ost ~) man tay sih)
::
[%repeat *]
?> ?=([@ @ @ ~] t.pax)
=+ [num her man]=[(slav %ud i.t.pax) (slav %p i.t.t.pax) i.t.t.t.pax]
ra-abet:(~(ra-repeat ra ost ~) num [%& her man] sih)
==
::
++ pull
|= ost=bone
^- [(list move) _+>]
~& [%rodeo-pull `*`ost]
ra-abet:~(ra-cancel ra ost ~)
::
++ poke-bit
|= [ost=bone you=ship ~]
^- [(list move) _+>]
:_ +>.$
=+ paf=/(scot %p our.hid)/try/(scot %da lat.hid)/rodeo/backlog/jam
[ost %pass /jamfile %c %info our.hid (foal paf (jam +<+.+>.$))]~
::
++ prep
|= old=(unit (unit house-any))
^- [(list move) _+>]
?> ?=(^ old)
=| moz=(list move)
|-
?~ u.old
=+ paf=/(scot %p our.hid)/try/(scot %da lat.hid)/rodeo/backlog/jam
?. ?=([%0 %0 %0] [.^(%cy paf)])
$(u.old (some ((hard house-any) (cue ((hard ,@) .^(%cx paf))))))
~& %rodeo-prep-new
ra-abet:~(ra-init ra 0 moz)
~& %rodeo-prep-old
:- moz
|-
?- -.u.u.old
%1 %_(+>.^^$ +<+ u.u.old)
%0 $(u.u.old [%1 (house-0-to-house-1 +.u.u.old)])
==
::
++ house-0-to-house-1
|= vat=house-0
^- house-1
=- :* stories=-
general=~
outbox=[0 ~]
folks=~
==
^- (map span story)
=- %- ~(run by -)
|= grams=(list telegram)
^- story
:* count=(lent grams)
grams=grams
locals=~
remotes=~
sequence=~
shape=[.(cordon [%black ~])]:*config
^= known %- mo ^- (list ,[serial @]) =< +
(roll grams |=([telegram a=@ b=(list ,[serial @])] [+(a) [a p.q] b]))
guests=~
viewers=~
owners=~
==
^- (map span (list telegram))
%- mo %+ turn (~(tap by vat))
|= [a=path b=(list zong) c=(map ship ,?)]
=+ ^= par
?: =(/ a) 'hub'
=+ (turn a |=(d=span leaf/(trip d)))
(crip ~(ram re %rose ["_" ~ ~] -))
:- par
=+ aud=`audience`[[[%& our.hid par] *envelope %received] `~]
=+ ^= spe
|= r=_r:*zong ^- speech
?- -.r
%say [%lin %& p.r]
%do [%lin %| p.r]
%exp [%fat [%tank q.r ~] [%exp p.r]]
==
%+ turn b
|= d=zong ^- telegram
[q.d (sham eny.hid d) aud p.d ~ (spe r.d)]
--

View File

@ -4,10 +4,10 @@
:: ::
/? 314 /? 314
/- term-line, kyev /- term-line, kyev
/= pit /~ !>(.) :: kernel vase /= pit /~ !>(+) :: kernel vase
:: ::
:::: structures :::: structures
:: !:
|% :: |% ::
++ axle :: ++ axle ::
$: %1 :: version $: %1 :: version
@ -83,9 +83,9 @@
[%vega p=path] :: [%vega p=path] ::
== == == :: == == == ::
-- --
!: ::
:::: parsers :::: parsers
:: !:
|% |%
++ maybe |*(fel=_rule (cook |*(a=(unit) (fall a ~)) (opts fel))) ++ maybe |*(fel=_rule (cook |*(a=(unit) (fall a ~)) (opts fel)))
++ opts :: parse unit ++ opts :: parse unit
@ -129,9 +129,9 @@
== ==
:: ::
++ expg (rais ;~(pfix ace expr(tol %1)) ;~(pfix gap expr)) ++ expg (rais ;~(pfix ace expr(tol %1)) ;~(pfix gap expr))
++ expr (rais [wide tall]:(vang & pax)) ++ expr (rais [wide tall]:(vang | pax))
++ loca %+ sear ;~(biff plex:(vang & pax) vabe) :: path in %clay ++ loca %+ sear ;~(biff plex:(vang | pax) vabe) :: path in %clay
[;~(pose rood ;~(simu cen scat))]:(vang & pax) [;~(pose rood ;~(simu cen scat))]:(vang | pax)
++ vabe |=(a=path ?~((tome a) ~ (some a))) :: check valid beam ++ vabe |=(a=path ?~((tome a) ~ (some a))) :: check valid beam
++ args :: task arguments ++ args :: task arguments
%^ rail %^ rail
@ -143,9 +143,9 @@
:: ::
-- --
-- --
!: ::
:::: per event :::: per event
:: !:
|% |%
++ ve ++ ve
|= [hid=hide ost=bone axle] |= [hid=hide ost=bone axle]
@ -240,13 +240,18 @@
|= [paf=path gen=(unit twig)] |= [paf=path gen=(unit twig)]
^+ +> ^+ +>
=+ fel=(file paf) =+ fel=(file paf)
?~ fel ?^ fel
(chew-file paf '! none') ?~ gen
?^ gen (blab (stray (crip ": {(spud paf)} {<(,@t u.fel)>}")))
%+ with u.gen |= new=vase %+ with u.gen |= new=vase
=+ for=((hard mark) -:(flop paf)) =+ for=((hard mark) -:(flop paf))
(chew-file paf (foal paf for new)) (chew-file paf (foal paf for new))
(blab (stray (crip ": {(spud paf)} {<(,@t u.fel)>}"))) =+ ark=;;(arch .^(%cy paf))
?- r.ark
~ (chew-file paf '! none')
[^ ~ ~] $(paf (welp paf /[p.n.r.ark]))
* (chew-file paf '! many')
==
:: ::
++ eat-help ++ eat-help
|= app=term |= app=term
@ -505,9 +510,9 @@
!>([%rush %term-line `term-line`[pro(r a) ~ ~]]) !>([%rush %term-line `term-line`[pro(r a) ~ ~]])
-- --
-- --
!: ::
:::: formal interface :::: formal interface
:: !:
|_ [hid=hide vat=axle] |_ [hid=hide vat=axle]
:: ::
++ peer :: handle subscription ++ peer :: handle subscription

650
main/app/sole/core.hook Normal file
View File

@ -0,0 +1,650 @@
:: :: ::
:::: /hook/core/sole/app :: ::
:: :: ::
/? 314 :: zuse version
/- *sole :: console structures
/+ sole :: console library
:: :: ::
:::: :: ::
!: :: ::
=> |% :: data structures
++ house :: all state
$: bin=(map bone source) :: input devices
== ::
++ source :: input device
$: edg=_79 :: terminal columns
off=@ud :: window offset
kil=(unit (list ,@c)) :: kill buffer
apt=(list gill) :: application ring
maz=master :: master window
feg=(map gill target) :: live applications
mir=(pair ,@ud (list ,@c)) :: mirrored terminal
== ::
++ master :: master buffer
$: liv=? :: master is live
tar=target :: master target
== ::
++ history :: past input
$: pos=@ud :: input position
num=@ud :: number of entries
lay=(map ,@ud (list ,@c)) :: editing overlay
old=(list (list ,@c)) :: entries proper
== ::
++ search :: reverse-i-search
$: pos=@ud :: search position
str=(list ,@c) :: search string
== ::
++ target :: application target
$: ris=(unit search) :: reverse-i-search
hit=history :: all past input
pom=sole-prompt :: static prompt
inp=sole-command :: input state
== ::
++ ukase :: master command
$% [%add p=(list gill)] :: add agents
[%del p=(list gill)] :: delete agents
== ::
++ gift :: out result <-$
$% [%mean p=ares] ::
[%nice ~] ::
[%rush %dill-blit dill-blit] ::
== ::
++ sign-gall :: sign from %gall
$% [%mean p=ares] ::
[%nice ~] ::
[%rush %sole-effect sole-effect] ::
== ::
++ sign :: in result $<-
$% [%g sign-gall] ::
== ::
++ move ,[p=bone q=(mold note gift)] ::
++ note-gall :: note to %gall
$% [%mess p=[p=ship q=path] q=ship r=cage] ::
[%nuke p=[p=ship q=path] q=ship] ::
[%show p=[p=ship q=path] q=ship r=path] ::
[%took p=[p=ship q=path] q=ship] ::
== ::
++ note :: out request $->
$% [%g note-gall] ::
== ::
-- ::
|_ $: hid=hide :: system state
house :: program state
== ::
++ sp
|% ++ sp-ukase
%+ knee *ukase |. ~+
;~ pose
(stag %add ;~(pfix lus sp-gills))
(stag %del ;~(pfix hep sp-gills))
==
::
++ sp-gills
;~ pose
(most ;~(plug com ace) sp-gill)
%+ cook
|= a=ship
[[a %dojo] [a %talk] ~]
;~(pfix sig fed:ag)
==
::
++ sp-gill
;~ pose
(stag our.hid sym)
;~ plug
;~(pfix sig fed:ag)
;~(pfix fas sym)
==
==
--
++ se :: per source
|_ $: [moz=(list move) biz=(list dill-blit)]
[her=ship ost=bone]
source
==
++ se-abet :: resolve
:_ %_(+> bin (~(put by bin) ost +<+>))
%+ welp (flop moz)
^- (list move)
?~ biz ~
[ost %give %rush %dill-blit ?~(t.biz i.biz [%mor (flop biz)])]~
::
++ se-belt :: handle input
|= bet=dill-belt
^+ +>
?: ?=(%rez -.bet)
+>(edg (dec p.bet))
?: ?=(%yow -.bet)
(se-link p.bet)
=+ gyl=?^(apt i.apt [~zod %$])
=+ taz=~(. ta [& liv.maz gyl] ?:(liv.maz tar.maz (~(got by feg) gyl)))
=< ta-abet
?- -.bet
%aro (ta-aro:taz p.bet)
%bac ta-bac:taz
%cru (ta-cru:taz p.bet q.bet)
%ctl (ta-ctl:taz p.bet)
%del ta-del:taz
%met (ta-met:taz p.bet)
%ret ta-ret:taz
%txt (ta-txt:taz p.bet)
==
::
++ se-drop :: passive drop
|= gyl=gill
^+ +>
=< se-prom
?> (~(has by feg) gyl)
%_ +>
feg (~(del by feg) gyl)
apt (skip apt |=(a=gill =(gyl a)))
liv.maz ?~(apt & liv.maz)
==
::
++ se-join :: add connection
|= gyl=gill
^+ +>
=< se-prom
?: (~(has by feg) gyl)
(se-blit %bel ~)
+>(liv.maz |, apt [gyl apt], feg (~(put by feg) gyl *target))
::
++ se-nuke :: active drop
|= gyl=gill
^+ +>
(se-drop:(se-send(liv.maz |) gyl %nuke [p.gyl ~[q.gyl]] her) gyl)
::
++ se-like :: act in master
|= kus=ukase
?- -.kus
%add
|- ^+ +>.^$
?~ p.kus +>.^$
$(p.kus t.p.kus, +>.^$ (se-link i.p.kus))
::
%del
|- ^+ +>.^$
?~ p.kus +>.^$
$(p.kus t.p.kus, +>.^$ (se-nuke i.p.kus))
==
::
++ se-prom :: set master prompt
^+ .
%_ .
cad.pom.tar.maz
^- tape
%+ welp
(scow %p our.hid)
=+ ^= mux
|- ^- tape
?~ apt ~
=+ ^= mor ^- tape
?~ t.apt ~
[',' ' ' $(apt t.apt)]
%+ welp
^- tape
=+ txt=(trip q.i.apt)
?: =(our.hid p.i.apt)
txt
:(welp "~" (scow %p p.i.apt) "/" txt)
mor
?~ mux
"# "
:(welp ":" mux "# ")
==
::
++ se-link :: connect to app
|= gyl=gill
^+ +>
%. gyl
=< se-join
(se-send gyl %show [p.gyl ~[q.gyl]] her /sole)
::
++ se-blit :: give output
|= bil=dill-blit
+>(biz [bil biz])
::
++ se-show :: show buffer, raw
|= lin=(pair ,@ud (list ,@c))
^+ +>
?: =(mir lin) +>
=. +> ?:(=(q.mir q.lin) +> (se-blit %pro q.lin))
=. +> ?:(=(p.mir p.lin) +> (se-blit %hop p.lin))
+>(mir lin)
::
++ se-just :: adjusted buffer
|= lin=(pair ,@ud (list ,@c))
^+ +>
=. off ?:((lth p.lin edg) 0 (sub p.lin edg))
(se-show (sub p.lin off) (scag edg (slag off q.lin)))
::
++ se-view :: flush buffer
?: liv.maz
(se-just ~(ta-vew ta [& & ~zod %$] tar.maz))
?~ apt
se-view(liv.maz &)
%- se-just
~(ta-vew ta [& | i.apt] (~(got by feg) i.apt))
::
++ se-kill :: kill a source
=+ tup=apt
|- ^+ +>
?~ tup +>(apt ~)
$(tup +.tup, +> (se-nuke i.tup))
::
++ se-emit :: emit move
|= mov=move
%_(+> moz [mov moz])
::
++ se-send :: send a message
|= [gyl=gill nog=note-gall]
(se-emit ost %pass [(scot %p her) (scot %p p.gyl) q.gyl ~] %g nog)
::
++ se-tame
|= gyl=gill
^+ ta
~(. ta [& %| gyl] (~(got by feg) gyl))
::
++ se-pour :: receive results
|= [gyl=gill sil=sign-gall]
^+ +>
?- -.sil
%mean
+>.$
::
%nice
+>.$
::
%rush
ta-abet:ta-rap:(ta-fec:(se-tame gyl) +>.sil)
==
::
++ ta :: per target
|_ $: $: liv=? :: don't delete
mav=? :: showing master
gyl=gill :: target app
== ::
target :: target state
== ::
++ ta-abet :: resolve
^+ ..ta
=. liv.maz mav
?: mav
?. liv
(se-blit `dill-blit`[%qit ~])
+>(tar.maz +<+)
?. liv
=. ..ta (se-nuke gyl)
..ta(liv.maz =(~ apt))
%_(+> feg (~(put by feg) gyl +<+))
::
++ ta-ant :: toggle master
^+ .
?: mav
?~ apt ta-bel
%_ .
mav |
+<+ (~(got by feg) gyl)
tar.maz +<+
==
%_ .
mav &
+<+ tar.maz
feg (~(put by feg) gyl +<+)
==
::
++ ta-act :: send action
|= act=sole-action
^+ +>
?: mav
+>.$
%_ +>
+>
(se-send gyl %mess [p.gyl ~[q.gyl]] her %sole-action !>(act))
==
::
++ ta-aro :: hear arrow
|= key=?(%d %l %r %u)
^+ +>
?- key
%d =. ris ~
?. =(num.hit pos.hit)
(ta-mov +(pos.hit))
?: =(0 (lent buf.say.inp))
ta-bel
(ta-hom:ta-nex %set ~)
%l ?^ ris ta-bel
?: =(0 pos.inp) ta-bel
+>(pos.inp (dec pos.inp))
%r ?^ ris ta-bel
?: =((lent buf.say.inp) pos.inp)
ta-bel
+>(pos.inp +(pos.inp))
%u =. ris ~
?:(=(0 pos.hit) ta-bel (ta-mov (dec pos.hit)))
==
::
++ ta-bel .(+> (se-blit %bel ~)) :: beep
++ ta-cat :: mass insert
|= [pos=@ud txt=(list ,@c)]
^- sole-edit
:- %mor
|- ^- (list sole-edit)
?~ txt ~
[[%ins pos i.txt] $(pos +(pos), txt t.txt)]
::
++ ta-cut :: mass delete
|= [pos=@ud num=@ud]
^- sole-edit
:- %mor
|-(?:(=(0 num) ~ [[%del pos] $(num (dec num))]))
::
++ ta-det :: send edit
|= ted=sole-edit
^+ +>
(ta-act %det [[his.ven.say.inp own.ven.say.inp] (sham buf.say.inp) ted])
::
++ ta-bac :: hear backspace
^+ .
?^ ris
?: =(~ str.u.ris)
ta-bel
.(str.u.ris (scag (dec (lent str.u.ris)) str.u.ris))
?: =(0 pos.inp)
.(+> (se-blit %bel ~))
=+ pre=(dec pos.inp)
(ta-hom(pos.inp pre) %del pre)
::
++ ta-ctl :: hear control
|= key=@c
^+ +>
?+ key ta-bel
%a +>(pos.inp 0)
%b (ta-aro %l)
%c ta-bel(ris ~)
%d ?: &(=(0 pos.inp) =(0 (lent buf.say.inp)))
+>(liv |)
ta-del
%e +>(pos.inp (lent buf.say.inp))
%f (ta-aro %r)
%g ta-bel(ris ~)
%k =+ len=(lent buf.say.inp)
?: =(pos.inp len)
ta-bel
%- ta-hom(kil `(slag pos.inp buf.say.inp))
(ta-cut pos.inp (sub len pos.inp))
%l +>(+> (se-blit %clr ~))
%n (ta-aro %d)
%p (ta-aro %u)
%r ?~ ris
+>(ris `[pos.hit ~])
?: =(0 pos.u.ris)
ta-bel
(ta-ser ~)
%t =+ len=(lent buf.say.inp)
?: |(=(0 pos.inp) (lth len 2))
ta-bel
=+ sop=?:(=(len pos.inp) (dec pos.inp) pos.inp)
=. pos.inp +(sop)
%- ta-hom
:~ %mor
[%del sop]
[%ins (dec sop) (snag sop buf.say.inp)]
==
%u ?: =(0 pos.inp)
ta-bel
%- ta-hom(pos.inp 0, kil `(scag pos.inp buf.say.inp))
(ta-cut 0 pos.inp)
%v ta-ant
%x ?: =(~ apt) ta-bel
?: mav ta-bel
+>(apt (welp (slag 1 apt) [(snag 0 apt) ~]))
%y ?~ kil ta-bel
%- ta-hom(pos.inp (add pos.inp (lent u.kil)))
(ta-cat pos.inp u.kil)
==
::
++ ta-cru :: hear crud
|= [lab=@tas tac=(list tank)]
=. +>+> (se-blit %out (tuba (trip lab)))
(ta-tan tac)
::
++ ta-del :: hear delete
^+ .
?: =((lent buf.say.inp) pos.inp)
.(+> (se-blit %bel ~))
(ta-hom %del pos.inp)
::
++ ta-erl :: hear local error
|= pos=@ud
ta-bel(pos.inp (min pos (lent buf.say.inp)))
::
++ ta-err :: hear remote error
|= pos=@ud
(ta-erl (~(transpose cs say.inp) pos))
::
++ ta-fec :: apply effect
|= fec=sole-effect
^+ +>
?- -.fec
%bel ta-bel
%blk +>
%clr +>(+> (se-blit fec))
%det (ta-got +.fec)
%err (ta-err +.fec)
%mor |- ^+ +>.^$
?~ p.fec +>.^$
$(p.fec t.p.fec, +>.^$ ^$(fec i.p.fec))
%nex ta-nex
%pro (ta-pro +.fec)
%tan (ta-tan p.fec)
%sag +>(+> (se-blit fec))
%sav +>(+> (se-blit fec))
%txt $(fec [%tan [%leaf p.fec]~])
==
::
++ ta-rap :: send %took
.(+> (se-send gyl %took [p.gyl ~[q.gyl]] her))
::
++ ta-dog :: change cursor
|= ted=sole-edit
%_ +>
pos.inp
=+ len=(lent buf.say.inp)
%+ min len
|- ^- @ud
?- -.ted
%del ?:((gth pos.inp p.ted) (dec pos.inp) pos.inp)
%ins ?:((lte pos.inp p.ted) +(pos.inp) pos.inp)
%mor |- ^- @ud
?~ p.ted pos.inp
$(p.ted t.p.ted, pos.inp ^$(ted i.p.ted))
%nop pos.inp
%set len
==
==
::
++ ta-got :: apply change
|= cal=sole-change
=^ ted say.inp (~(receive cs say.inp) cal)
(ta-dog ted)
::
++ ta-hom :: local edit
|= ted=sole-edit
^+ +>
=. +> (ta-det ted)
=. +> (ta-dog(say.inp (~(commit cs say.inp) ted)) ted)
+>
::
++ ta-met :: meta key
|= key=@c
~& [%ta-met key]
+>
::
++ ta-mov :: move in history
|= sop=@ud
^+ +>
?: =(sop pos.hit) +>
%+ %= ta-hom
pos.hit sop
lay.hit %+ ~(put by lay.hit)
pos.hit
buf.say.inp
==
%set
%- (bond |.((snag (sub num.hit +(sop)) old.hit)))
(~(get by lay.hit) sop)
::
++ ta-nex :: advance history
%_ .
num.hit +(num.hit)
pos.hit +(num.hit)
ris ~
lay.hit ~
old.hit [buf.say.inp old.hit]
==
::
++ ta-pro :: set prompt
|= pom=sole-prompt
+>(pom pom(cad :(welp (scow %p p.gyl) ":" (trip q.gyl) cad.pom)))
::
++ ta-ret :: hear return
?. mav
(ta-act %ret ~)
=+ txt=(tufa buf.say.inp)
=+ fey=(rose txt sp-ukase:sp)
?- -.fey
%| (ta-erl (lent (tuba (scag p.fey txt))))
%& ?~ p.fey
(ta-erl (lent buf.say.inp))
=. +>+> (se-like u.p.fey)
=. pom pom.tar.maz
(ta-hom:ta-nex %set ~)
==
::
++ ta-ser :: reverse search
|= ext=(list ,@c)
^+ +>
?: |(?=(~ ris) =(0 pos.u.ris)) ta-bel
=+ tot=(weld str.u.ris ext)
=+ dol=(slag (sub num.hit pos.u.ris) old.hit)
=+ sop=pos.u.ris
=+ ^= ser
=+ ^= beg
|= [a=(list ,@c) b=(list ,@c)] ^- ?
?~(a & ?~(b | &(=(i.a i.b) $(a t.a, b t.b))))
|= [a=(list ,@c) b=(list ,@c)] ^- ?
?~(a & ?~(b | |((beg a b) $(b t.b))))
=+ ^= sup
|- ^- (unit ,@ud)
?~ dol ~
?: (ser tot i.dol)
`sop
$(sop (dec sop), dol t.dol)
?~ sup ta-bel
(ta-mov(str.u.ris tot, pos.u.ris (dec u.sup)) (dec u.sup))
::
++ ta-tan :: print tanks
|= tac=(list tank)
=+ wol=`wall`(zing (turn tac |=(a=tank (~(win re a) [0 edg]))))
|- ^+ +>.^$
?~ wol +>.^$
$(wol t.wol, +>+>.^$ (se-blit %out (tuba i.wol)))
::
++ ta-txt :: hear text
|= txt=(list ,@c)
^+ +>
?^ ris
(ta-ser txt)
%- ta-hom(pos.inp (add (lent txt) pos.inp))
:- %mor
|- ^- (list sole-edit)
?~ txt ~
[[%ins pos.inp i.txt] $(pos.inp +(pos.inp), txt t.txt)]
::
++ ta-vew :: computed prompt
|- ^- (pair ,@ud (list ,@c))
?^ ris
%= $
ris ~
cad.pom
:(welp "(reverse-i-search)'" (tufa str.u.ris) "': ")
==
=- [(add pos.inp (lent p.vew)) (weld (tuba p.vew) q.vew)]
^= vew ^- (pair tape (list ,@c))
?: vis.pom [cad.pom buf.say.inp]
:- ;: welp
cad.pom
?~ buf.say.inp ~
;: welp
"<"
(scow %p (end 4 1 (sham buf.say.inp)))
"> "
==
==
=+ len=(lent buf.say.inp)
|- ^- (list ,@c)
?:(=(0 len) ~ [`@c`'*' $(len (dec len))])
--
--
++ peer
|= [ost=bone her=ship pax=path]
^- [(list move) _+>]
:: ~& [%sole-peer ost her pax]
?< (~(has by bin) ost)
:- [ost %give %rush %dill-blit %pro [`@c`0x23 `@c`0x20 ~]]~
%= +>
bin
%+ ~(put by bin) ost
^- source
:* 80
0
~
~
:* %&
*(unit search)
*history
`sole-prompt`[%& %sole "{(scow %p our.hid)}# "]
*sole-command
==
~
[0 ~]
==
==
::
++ poke-dill-belt
|= [ost=bone her=ship bet=dill-belt]
^- [(list move) _+>]
:: ~& [%sole-poke ost her bet]
=+ yog=(~(get by bin) ost)
?~ yog
~& [%sole-poke-stale ost]
[~ +>.$]
=< se-abet
=< se-view
(~(se-belt se [[ost %give %nice ~]~ ~] [her ost] u.yog) bet)
::
++ pour
|= [ost=bone pax=path sih=*]
^- [(list move) _+>]
=+ yog=(~(get by bin) ost)
?~ yog
~& [%sole-pour-stale ost pax]
[~ +>.$]
=+ sih=((hard sign) sih)
?> ?=([@ @ @ ~] pax)
=< se-abet
=< se-view
=+ gyl=[(slav %p i.t.pax) i.t.t.pax]
(~(se-pour se [~ ~] [(slav %p i.pax) ost] u.yog) gyl +.sih)
::
++ pull
|= ost=bone
^- [(list move) _+>]
:: ~& [%sole-pull ost]
=^ moz +>
=< se-abet
=< se-view
~(se-kill se [~ ~] [our.hid ost] (~(got by bin) ost))
[moz +>.$(bin (~(del by bin) ost))]
--

File diff suppressed because it is too large Load Diff

28
main/app/tease/core.hook Normal file
View File

@ -0,0 +1,28 @@
:: :: ::
:::: /hook/core/tease/app :: ::
:: :: ::
/? 314 :: zuse version
/- *console :: console structures
/+ console :: console library
!: :: ::
:::: :: ::
:: :: ::
|_ [hid=hide ~]
++ peer ,_`.
++ poke--args
|= [ost=bone you=ship ~]
~& %tease
:_ +>.$
:~ :* 0 %pass ~
%g %show
[our.hid /seat] our.hid
/
==
:* 0 %pass ~
%g %mess
[our.hid /seat] our.hid
%dill-belt
!>(`dill-belt`[%yow %helm])
==
==
--

View File

@ -285,7 +285,7 @@
++ pour ++ pour
|= [ost=bone pax=path sih=*] |= [ost=bone pax=path sih=*]
^- [(list move) _+>] ^- [(list move) _+>]
=+ sih=((hard sign) sih) =+ sih=~|([%term-pour (,[term term ~] sih)] ((hard sign) sih))
?: ?=(?(%sage %init %logo %verb %veer %vega) &2.sih) :: vomit ?: ?=(?(%sage %init %logo %verb %veer %vega) &2.sih) :: vomit
[[ost %give +.sih]~ +>.$] [[ost %give +.sih]~ +>.$]
?~ pax !! ?~ pax !!

View File

@ -13,7 +13,7 @@
;head ;head
;title: Hi ;title: Hi
;script: window.urb = window.urb || \{}; ;script: window.urb = window.urb || \{};
;script@"/gen/main/lib/urb.js"; ;script@"/~/at/main/lib/urb.js";
;script@"//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"; ;script@"//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js";
;script@"//cdnjs.cloudflare.com/ajax/libs/mousetrap/1.4.6/mousetrap.js"; ;script@"//cdnjs.cloudflare.com/ajax/libs/mousetrap/1.4.6/mousetrap.js";
;script@"//use.typekit.net/fkv0sjk.js"; ;script@"//use.typekit.net/fkv0sjk.js";

View File

@ -1,3 +1,8 @@
urb.appl = urb.appl ||
window.location.pathname.match(/.*?app\/([a-z0-9-]+)/)[1]
urb.term = urb.term ||
{pax: location.pathname.replace(new RegExp(".*?app/"+urb.appl),'') || '/'}
function jpok(a,b){ function jpok(a,b){
var dat = {pax:urb.term.pax, act:{}} var dat = {pax:urb.term.pax, act:{}}
dat.act[a] = b dat.act[a] = b

View File

@ -6,7 +6,7 @@
:::: /hook/core/test/app :::: /hook/core/test/app
:: ::
/? 314 :: need urbit 314 /? 314 :: need urbit 314
/= front /:/%%/front:/hymn/ :: load front page :: /= front /:/%%/front:/hymn/ :: load front page
:: ::
:::: structures :::: structures
:: ::
@ -297,7 +297,7 @@
|= [ost=bone you=ship pax=path] |= [ost=bone you=ship pax=path]
^- [(list move) _+>] ^- [(list move) _+>]
~& [%test-peer hid] ~& [%test-peer hid]
?~ pax [[ost %give %rust %hymn front]~ +>.$] ?~ pax !! ::[[ost %give %rust %hymn front]~ +>.$]
?: ?=(%tests -.pax) ?: ?=(%tests -.pax)
[[ost %give %rust %json tests-json:et]~ +>.$] [[ost %give %rust %json tests-json:et]~ +>.$]
:_ +>.$ :_ ~ :_ +>.$ :_ ~
@ -308,7 +308,7 @@
++ poke-json :: browser message ++ poke-json :: browser message
|= [ost=bone you=ship jon=json] |= [ost=bone you=ship jon=json]
^- [(list move) _+>] ^- [(list move) _+>]
~& [%test-poke hid] ~& [%test-poke hid you]
=+ tes=((of [%test so] ~):jo jon) =+ tes=((of [%test so] ~):jo jon)
?~ tes [[ost %give %mean ~ %strange-json ~]~ +>.$] ?~ tes [[ost %give %mean ~ %strange-json ~]~ +>.$]
=+ tst=(~(get by tests) +.u.tes) =+ tst=(~(get by tests) +.u.tes)

View File

@ -35,31 +35,31 @@
++ move ,[p=duct q=(mold note gift)] :: local move ++ move ,[p=duct q=(mold note gift)] :: local move
++ note :: out request $-> ++ note :: out request $->
$? $: %d :: to %dill $? $: %d :: to %dill
$% [%flog p=flog] :: $% [%flog p=flog] ::
== == :: == == ::
$: %a :: to %ames $: %a :: to %ames
$% [%kick p=@da] :: $% [%kick p=@da] ::
== == :: == == ::
$: %g :: to %gall $: %g :: to %gall
$% [%rote p=sack q=path r=*] :: $% [%rote p=sack q=path r=*] ::
[%roth p=sack q=path r=*] :: [%roth p=sack q=path r=*] ::
[%mess p=[@p %ye ~] q=@p r=cage] :: [%mess p=[@p %ye ~] q=@p r=cage] ::
== == :: == == ::
$: @tas :: to any $: @tas :: to any
$% [%init p=@p] :: $% [%init p=@p] ::
[%want p=sock q=path r=*] :: [%want p=sock q=path r=*] ::
[%wart p=sock q=@tas r=path s=*] :: [%wart p=sock q=@tas r=path s=*] ::
== == == :: == == == ::
++ sign :: in result $<- ++ sign :: in result $<-
$? $: %a :: from %ames $? $: %a :: from %ames
$% [%went p=ship q=cape] :: $% [%went p=ship q=cape] ::
== == :: == == ::
$: %g :: from %gall $: %g :: from %gall
$% [%mean p=ares] :: $% [%mean p=ares] ::
[%nice ~] :: [%nice ~] ::
== == :: == == ::
$: @tas :: $: @tas ::
$% [%crud p=@tas q=(list tank)] :: by any $% [%crud p=@tas q=(list tank)] :: by any
== == == :: == == == ::
-- --
:::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ -227,7 +227,7 @@
0w0 :: 55, ~tep, Curtis Yarvin (sator) 0w0 :: 55, ~tep, Curtis Yarvin (sator)
0w0 :: 56, ~bes, Curtis Yarvin (sator) 0w0 :: 56, ~bes, Curtis Yarvin (sator)
0w0 :: 57, ~dex, Jared Hance (aestas) 0w0 :: 57, ~dex, Jared Hance (aestas)
0w0 :: 58, ~sef, Curtis Yarvin (sator) 0w0 :: 58, ~sef, Owen Rescher (lex)
0w0 :: 59, ~wyc, Curtis Yarvin (sator) 0w0 :: 59, ~wyc, Curtis Yarvin (sator)
0w0 :: 60, ~bur, Curtis Yarvin (sator) 0w0 :: 60, ~bur, Curtis Yarvin (sator)
0w0 :: 61, ~der, Curtis Yarvin (sator) 0w0 :: 61, ~der, Curtis Yarvin (sator)
@ -370,7 +370,7 @@
0w0 :: 198, ~len, Tlon (gleba) 0w0 :: 198, ~len, Tlon (gleba)
0w0 :: 199, ~ner, Tlon (gleba) 0w0 :: 199, ~ner, Tlon (gleba)
0wv.aixe9.7gG2w.7cJiy.i3Mg8 :: 200, ~lex, Michael Hartl (donum) 0wv.aixe9.7gG2w.7cJiy.i3Mg8 :: 200, ~lex, Michael Hartl (donum)
0w0 :: 201, ~rup, Tlon (gleba) 0w0 :: 201, ~rup, Owen Rescher (lex)
0w0 :: 202, ~ned, Tlon (gleba) 0w0 :: 202, ~ned, Tlon (gleba)
0w0 :: 203, ~lec, Tlon (gleba) 0w0 :: 203, ~lec, Tlon (gleba)
0w0 :: 204, ~ryd, Tlon (gleba) 0w0 :: 204, ~ryd, Tlon (gleba)
@ -631,12 +631,12 @@
=^ gim ..weft wisp =^ gim ..weft wisp
:_ +>.$ :_ +>.$
^- (list rock) ^- (list rock)
=+ wit=(met ?:(fak.ton 18 13) q.gim) =+ wit=(met ?:(fak.ton 16 13) q.gim)
?< =(0 wit) ?< =(0 wit)
?: =(1 wit) ?: =(1 wit)
=+ yup=(spit [our her] p.gim q.gim) =+ yup=(spit [our her] p.gim q.gim)
[yup ~] [yup ~]
=+ ruv=(rip ?:(fak.ton 18 13) q.gim) =+ ruv=(rip ?:(fak.ton 16 13) q.gim)
=+ gom=(shaf %thug q.gim) =+ gom=(shaf %thug q.gim)
=+ inx=0 =+ inx=0
|- ^- (list rock) |- ^- (list rock)
@ -1409,7 +1409,7 @@
=+ [nix=0 rax=*(list ,@)] =+ [nix=0 rax=*(list ,@)]
|- ^- @ |- ^- @
?: =(p.duv nix) ?: =(p.duv nix)
(can ?:(fak.ton.fox 18 13) (turn (flop rax) |=(a=@ [1 a]))) (can ?:(fak.ton.fox 16 13) (turn (flop rax) |=(a=@ [1 a])))
$(nix +(nix), rax [(need (~(get by q.duv) nix)) rax]) $(nix +(nix), rax [(need (~(get by q.duv) nix)) rax])
-- :: --la:ho:um:am -- :: --la:ho:um:am
:: ::
@ -1662,7 +1662,6 @@
?- -.bon ?- -.bon
%beer %beer
:_ fox(zac (~(put by zac.fox) p.bon `corn`[hen ~ ~ ~])) :_ fox(zac (~(put by zac.fox) p.bon `corn`[hen ~ ~ ~]))
:: ~& [%ames-clop p.bon hen]
:* [hen [%slip %c %init p.bon]] :* [hen [%slip %c %init p.bon]]
[hen [%give %init p.bon]] [hen [%give %init p.bon]]
[hen [%slip %a %kick now]] [hen [%slip %a %kick now]]
@ -1688,6 +1687,8 @@
%milk %milk
:: ~& [%rx p.bon q.bon] :: ~& [%rx p.bon q.bon]
?> ?=([@ *] q.q.bon) ?> ?=([@ *] q.q.bon)
?: ?=(%e i.q.q.bon)
:_(fox [hen [%slip %e %wart p.bon %$ t.q.q.bon r.bon]]~)
?: ?=(%r i.q.q.bon) ?: ?=(%r i.q.q.bon)
?: ?=([%ta *] t.q.q.bon) ?: ?=([%ta *] t.q.q.bon)
=+ wil=((hard (unit will)) r.bon) =+ wil=((hard (unit will)) r.bon)
@ -1696,7 +1697,7 @@
:+ (scot %p p.p.bon) :+ (scot %p p.p.bon)
(scot %p q.p.bon) (scot %p q.p.bon)
q.q.bon q.q.bon
[hen %pass pax %g %rote p.bon /began 0 %m %will wil]~ [hen %pass pax %g %rote p.bon /helm 0 %m %will wil]~
?> ?=([@ @ *] t.q.q.bon) ?> ?=([@ @ *] t.q.q.bon)
:_ fox :_ fox
=+ [cak=i.t.q.q.bon ven=i.t.t.q.q.bon] =+ [cak=i.t.q.q.bon ven=i.t.t.q.q.bon]

View File

@ -3,7 +3,6 @@
:: ::
|= pit=vase |= pit=vase
=> |% => |%
++ bead ,[p=(set beam) q=gage] :: ford result
++ cane :: change set ++ cane :: change set
$: new=(map path lobe) :: new files $: new=(map path lobe) :: new files
cal=(map path lobe) :: old diffs cal=(map path lobe) :: old diffs
@ -91,7 +90,7 @@
[%writ p=riot] :: [%writ p=riot] ::
== == :: == == ::
$: %f :: $: %f ::
$% [%made p=(each bead (list tank))] :: $% [%made p=@uvH q=(each gage (list tank))] ::
== == :: == == ::
$: %t :: $: %t ::
$% [%wake ~] :: timer activate $% [%wake ~] :: timer activate
@ -216,15 +215,15 @@
?~(nao ~ (read-at-aeon:ze u.nao mun)) ?~(nao ~ (read-at-aeon:ze u.nao mun))
:: ::
++ made-to-tage ++ made-to-tage
|= res=(each bead (list tank)) |= res=(each gage tang)
^- tage ^- tage
?: ?=(%| -.res) ?: ?=(%| -.res)
~| %ford-fail ~| %ford-fail
~> %mean.|.(p.res) :: interpolate ford fail into stack trace ~> %mean.|.(p.res) :: interpolate ford fail into stack trace
!! !!
?@ p.q.p.res ?@ p.p.res
~|(%bad-marc !!) ~|(%bad-marc !!)
q.p.res p.res
:: ::
++ tage-to-cages ++ tage-to-cages
|= tab=tage |= tab=tage
@ -587,7 +586,7 @@
(checkout-ankh(lat.ran lat.ran.+.hat) u.-.hat) (checkout-ankh(lat.ran lat.ran.+.hat) u.-.hat)
:: ::
++ take-inserting ++ take-inserting
|= [wen=@da res=(each bead (list tank))] |= [wen=@da res=(each gage tang)]
^+ +> ^+ +>
?~ dok ?~ dok
~& %clay-take-inserting-unexpected-made +>.$ ~& %clay-take-inserting-unexpected-made +>.$
@ -607,7 +606,7 @@
[((hard path) q.q.pax) cay] [((hard path) q.q.pax) cay]
:: ::
++ take-diffing ++ take-diffing
|= [wen=@da res=(each bead (list tank))] |= [wen=@da res=(each gage tang)]
^+ +> ^+ +>
?~ dok ?~ dok
~& %clay-take-diffing-unexpected-made +>.$ ~& %clay-take-diffing-unexpected-made +>.$
@ -629,7 +628,7 @@
[paf (page-to-lobe:ze [p q.q]:cay) (~(got by dig.u.dok) paf)] [paf (page-to-lobe:ze [p q.q]:cay) (~(got by dig.u.dok) paf)]
:: ::
++ take-mutating ++ take-mutating
|= [wen=@da res=(each bead (list tank))] |= [wen=@da res=(each gage tang)]
^+ +> ^+ +>
?~ dok ?~ dok
~& %clay-take-mutating-unexpected-made +>.$ ~& %clay-take-mutating-unexpected-made +>.$
@ -651,40 +650,9 @@
~ ~
=+ paf=((hard path) q.q.pax) =+ paf=((hard path) q.q.pax)
`[paf (~(got by muh.u.dok) paf) cay] `[paf (~(got by muh.u.dok) paf) cay]
:: |= [wen=@da pax=path res=(each bead (list tank))]
:: ^+ +>
:: ?~ dok
:: ~& %clay-unexpected-made +>.$
:: ?. (lien lon.u.dok |=(path =(+< pax)))
:: ~& %clay-strange-made +>.$
:: ?: ?=(%| -.res)
:: %_ +>.$
:: dok ~
:: :: tag
:: :: %- welp :_ tag
:: :: ^- (list ,[duct path note])
:: :: %+ murn lon.u.dok
:: :: |= a=path
:: :: ^- (unit ,[duct path note])
:: :: ?: =(pax a) ~
:: :: `[hen [%diffing (scot %p who) syd (scot %da wen) a] %f %exec who ~]
:: ::
:: yel
:: :_ yel
:: [hen %note '!' %rose [" " "" ""] leaf/"clay diff failed" >pax< p.res]
:: ==
:: ?. ?=(@ p.q.p.res) ~| %bad-marc !!
:: =: lon.u.dok (skip lon.u.dok |=(path =(+< pax)))
:: sot.u.dok ?: =(%null p.q.p.res)
:: sot.u.dok
:: [[pax %dif q.p.res] sot.u.dok]
:: ==
:: ?~ lon.u.dok
:: (apply-edit wen)
:: +>.$
:: ::
++ take-patch ++ take-patch
|= res=(each bead (list tank)) |= res=(each gage tang)
^+ +> ^+ +>
:: ~& %taking-patch :: ~& %taking-patch
?: ?=(%| -.res) ?: ?=(%| -.res)
@ -728,7 +696,7 @@
(echo now %& *cart sim) (echo now %& *cart sim)
== ==
?~ dok ~& %no-dok +>.$ ?~ dok ~& %no-dok +>.$
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ~| %patch-bad-marc !! ?@ p.cay ~| %patch-bad-marc !!
:: ~& %canning :: ~& %canning
=+ ^= can =+ ^= can
@ -782,7 +750,7 @@
== ==
:: ::
++ take-ergo ++ take-ergo
|= res=(each bead (list tank)) |= res=(each gage tang)
^+ +> ^+ +>
?: ?=(%| -.res) ?: ?=(%| -.res)
%_ +>.$ %_ +>.$
@ -790,7 +758,7 @@
[[hen %note '!' %rose [" " "" ""] leaf/"clay ergo failed" p.res] yel] [[hen %note '!' %rose [" " "" ""] leaf/"clay ergo failed" p.res] yel]
== ==
?~ hez ~& %no-sync-duct !! ?~ hez ~& %no-sync-duct !!
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ~| %patch-bad-marc !! ?@ p.cay ~| %patch-bad-marc !!
%= +>.$ %= +>.$
reg reg
@ -1002,7 +970,7 @@
== ==
:: ::
++ take-foreign-plops ++ take-foreign-plops
|= res=(each bead (list tank)) |= res=(each gage tang)
^+ +> ^+ +>
?> ?=(^ ref) ?> ?=(^ ref)
?> ?=(^ nak.u.ref) ?> ?=(^ nak.u.ref)
@ -1010,7 +978,7 @@
~| "validate foreign plops failed" ~| "validate foreign plops failed"
~| [%plop-fail (turn p.res |=(tank ~(ram re +<)))] ~| [%plop-fail (turn p.res |=(tank ~(ram re +<)))]
!! !!
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ~| %plop-bad-marc !! ?@ p.cay ~| %plop-bad-marc !!
=+ |- ^- lat=(list blob) =+ |- ^- lat=(list blob)
?~ p.p.cay ?~ p.p.cay
@ -1088,7 +1056,7 @@
:: ~& %reading-at-aeon :: ~& %reading-at-aeon
=+ vid=(read-at-aeon:ze u.nao p.q.i.xiq) =+ vid=(read-at-aeon:ze u.nao p.q.i.xiq)
:: ~& %red-at-aeon :: ~& %red-at-aeon
?~ vid ~& [%oh-well mood=p.q.i.xiq] $(xiq t.xiq, xaq [i.xiq xaq]) ?~ vid ~& [%oh-well mood=p.q.i.xiq aeon=nao] $(xiq t.xiq, xaq [i.xiq xaq])
$(xiq t.xiq, ..wake (balk p.i.xiq u.vid p.q.i.xiq)) $(xiq t.xiq, ..wake (balk p.i.xiq u.vid p.q.i.xiq))
:: ::
%many %many
@ -1472,7 +1440,7 @@
:- -:!>(*arch) :- -:!>(*arch)
^- arch ^- arch
:+ *@uvI :+ *@uvI
?.((~(has by q.yak) pax) ~ `0vfak.ehash) ?.((~(has by q.yak) pax) ~ `0vfak.ehash) :: XX hash of lobes
^- (map span ,~) ^- (map span ,~)
%- mo ^- (list (pair span ,~)) %- mo ^- (list (pair span ,~))
%+ turn %+ turn
@ -1555,7 +1523,7 @@
..me(mer (~(del by mer) ali), reg :_(reg [hen %mere gon.dat])) ..me(mer (~(del by mer) ali), reg :_(reg [hen %mere gon.dat]))
:: ::
++ route ++ route
|= [sat=term res=(each riot (each bead (list tank)))] |= [sat=term res=(each riot (each gage tang))]
^+ +>.$ ^+ +>.$
?+ sat ~|((crip <[%bad-stage sat]>) !!) ?+ sat ~|((crip <[%bad-stage sat]>) !!)
%ali %- fetched-ali ?> ?=(%& -.res) p.res %ali %- fetched-ali ?> ?=(%& -.res) p.res
@ -1799,11 +1767,11 @@
(diff-bas %ali ali.dat ali bob.dat) (diff-bas %ali ali.dat ali bob.dat)
:: ::
++ diffed-ali ++ diffed-ali
|= res=(each bead (list tank)) |= res=(each gage tang)
^+ +> ^+ +>
?: ?=(%| -.res) ?: ?=(%| -.res)
(error:he %diff-ali-bad-made leaf/"merge diff ali failed" p.res) (error:he %diff-ali-bad-made leaf/"merge diff ali failed" p.res)
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ?@ p.cay
(error:he %diff-ali-bad-marc >p.cay< ~) (error:he %diff-ali-bad-marc >p.cay< ~)
=| can=(map path cage) =| can=(map path cage)
@ -1859,11 +1827,11 @@
(diff-bas %bob bob.dat bob ali.dat) (diff-bas %bob bob.dat bob ali.dat)
:: ::
++ diffed-bob ++ diffed-bob
|= res=(each bead (list tank)) |= res=(each gage tang)
^+ +> ^+ +>
?: ?=(%| -.res) ?: ?=(%| -.res)
(error:he %diff-bob-bad-made leaf/"merge diff bob failed" p.res) (error:he %diff-bob-bad-made leaf/"merge diff bob failed" p.res)
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ?@ p.cay
(error:he %diff-bob-bad-marc >p.cay< ~) (error:he %diff-bob-bad-marc >p.cay< ~)
=| can=(map path cage) =| can=(map path cage)
@ -1938,10 +1906,10 @@
== ==
:: ::
++ merged ++ merged
|= res=(each bead (list tank)) |= res=(each gage tang)
?: ?=(%| -.res) ?: ?=(%| -.res)
(error:he %merge-bad-made leaf/"merging failed" p.res) (error:he %merge-bad-made leaf/"merging failed" p.res)
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ?@ p.cay
(error:he %merge-bad-marc >p.cay< ~) (error:he %merge-bad-marc >p.cay< ~)
=| bof=(map path (unit cage)) =| bof=(map path (unit cage))
@ -1995,11 +1963,11 @@
:: ::
++ built ++ built
|= res=(each bead (list tank)) |= res=(each gage tang)
^+ +> ^+ +>
?: ?=(%| -.res) ?: ?=(%| -.res)
(error:he %build-bad-made leaf/"delta building failed" p.res) (error:he %build-bad-made leaf/"delta building failed" p.res)
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ?@ p.cay
(error:he %build-bad-marc >p.cay< ~) (error:he %build-bad-marc >p.cay< ~)
=| bop=(map path cage) =| bop=(map path cage)
@ -2125,11 +2093,11 @@
== ==
:: ::
++ checked-out ++ checked-out
|= res=(each bead (list tank)) |= res=(each gage tang)
^+ +> ^+ +>
?: ?=(%| -.res) ?: ?=(%| -.res)
(error:he %checkout-bad-made leaf/"merge checkout failed" p.res) (error:he %checkout-bad-made leaf/"merge checkout failed" p.res)
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ?@ p.cay
(error:he %patch-bad-marc >p.cay< ~) (error:he %patch-bad-marc >p.cay< ~)
=| can=(list ,[path cage]) =| can=(list ,[path cage])
@ -2183,11 +2151,11 @@
== ==
:: ::
++ ergoed ++ ergoed
|= res=(each bead (list tank)) |= res=(each gage tang)
^+ +> ^+ +>
?: ?=(%| -.res) ?: ?=(%| -.res)
(error:he %ergo-bad-made leaf/"merge ergo failed" p.res) (error:he %ergo-bad-made leaf/"merge ergo failed" p.res)
=+ cay=q.p.res =+ cay=p.res
?@ p.cay ~| %patch-bad-marc !! ?@ p.cay ~| %patch-bad-marc !!
=| can=(list ,[path (unit mime)]) =| can=(list ,[path (unit mime)])
=> =>
@ -2519,7 +2487,7 @@
=+ une=(un our now hen ruf) =+ une=(un our now hen ruf)
=+ wak=wake:une =+ wak=wake:une
=+ wex=(di:wak syd) =+ wex=(di:wak syd)
=+ dat=?-(+<.q.hin %writ [%& p.q.hin], %made [%| p.q.hin]) =+ dat=?-(+<.q.hin %writ [%& p.q.hin], %made [%| q.q.hin])
=+ wao=abet:(route:(me:ze:wex her sud) sat dat) =+ wao=abet:(route:(me:ze:wex her sud) sat dat)
=+ woo=abet:wao =+ woo=abet:wao
[(weld -.wak -.woo) ..^$(ruf abet:(pish:une syd +.woo ran.wao))] [(weld -.wak -.woo) ..^$(ruf abet:(pish:une syd +.woo ran.wao))]
@ -2549,16 +2517,16 @@
== ==
?: ?=([%blab care @ @ *] tea) ?: ?=([%blab care @ @ *] tea)
?> ?=(%made +<.q.hin) ?> ?=(%made +<.q.hin)
?: ?=(%| -.p.q.hin) ?: ?=(%| -.q.q.hin)
~| %blab-fail ~| %blab-fail
~> %mean.|.(p.p.q.hin) :: interpolate ford fail into stack trace ~> %mean.|.(p.q.q.hin) :: interpolate ford fail into stack trace
!! !!
?^ p.q.p.p.q.hin ?^ p.p.q.q.hin
~|(%bad-marc !!) ~|(%bad-marc !!)
:_ ..^$ :_ ~ :_ ..^$ :_ ~
:* hen %give %writ ~ :* hen %give %writ ~
`[care case @tas]`[i.t.tea ((hard case) +>:(slay i.t.t.tea)) i.t.t.t.tea] `[care case @tas]`[i.t.tea ((hard case) +>:(slay i.t.t.tea)) i.t.t.t.tea]
`path`t.t.t.t.tea `cage`q.p.p.q.hin `path`t.t.t.t.tea `cage`p.q.q.hin
== ==
?- -.+.q.hin ?- -.+.q.hin
%crud %crud
@ -2575,7 +2543,7 @@
=^ mos ruf =^ mos ruf
=+ une=(un who now hen ruf) =+ une=(un who now hen ruf)
=+ ^= zat =+ ^= zat
(take-inserting:(di:wake:une syd) wen p.q.hin) (take-inserting:(di:wake:une syd) wen q.q.hin)
=+ zot=abet.zat =+ zot=abet.zat
[-.zot abet:(pish:une syd +.zot ran.zat)] [-.zot abet:(pish:une syd +.zot ran.zat)]
[mos ..^$] [mos ..^$]
@ -2588,7 +2556,7 @@
=^ mos ruf =^ mos ruf
=+ une=(un who now hen ruf) =+ une=(un who now hen ruf)
=+ ^= zat =+ ^= zat
(take-diffing:(di:wake:une syd) wen p.q.hin) (take-diffing:(di:wake:une syd) wen q.q.hin)
=+ zot=abet.zat =+ zot=abet.zat
[-.zot abet:(pish:une syd +.zot ran.zat)] [-.zot abet:(pish:une syd +.zot ran.zat)]
[mos ..^$] [mos ..^$]
@ -2601,7 +2569,7 @@
=^ mos ruf =^ mos ruf
=+ une=(un who now hen ruf) =+ une=(un who now hen ruf)
=+ ^= zat =+ ^= zat
(take-mutating:(di:wake:une syd) wen p.q.hin) (take-mutating:(di:wake:une syd) wen q.q.hin)
=+ zot=abet.zat =+ zot=abet.zat
[-.zot abet:(pish:une syd +.zot ran.zat)] [-.zot abet:(pish:une syd +.zot ran.zat)]
[mos ..^$] [mos ..^$]
@ -2613,11 +2581,11 @@
=^ mos ruf =^ mos ruf
?: (~(has by fat.ruf) who) ?: (~(has by fat.ruf) who)
=+ une=(un who now hen ruf) =+ une=(un who now hen ruf)
=+ zat=(take-patch:(di:wake:une syd) p.q.hin) =+ zat=(take-patch:(di:wake:une syd) q.q.hin)
=+ zot=abet.zat =+ zot=abet.zat
[-.zot abet:(pish:une syd +.zot ran.zat)] [-.zot abet:(pish:une syd +.zot ran.zat)]
=+ zax=(do now hen [who who] syd ruf) =+ zax=(do now hen [who who] syd ruf)
=+ zat=(take-patch:zax p.q.hin) =+ zat=(take-patch:zax q.q.hin)
=+ zot=abet.zat =+ zot=abet.zat
[-.zot (posh who syd +.zot ruf)] [-.zot (posh who syd +.zot ruf)]
[mos ..^$] [mos ..^$]
@ -2629,7 +2597,7 @@
=^ mos ruf =^ mos ruf
=+ une=(un who now hen ruf) =+ une=(un who now hen ruf)
=+ ^= zat =+ ^= zat
(take-ergo:(di:wake:une syd) p.q.hin) (take-ergo:(di:wake:une syd) q.q.hin)
=+ zot=abet.zat =+ zot=abet.zat
[-.zot abet:(pish:une syd +.zot ran.zat)] [-.zot abet:(pish:une syd +.zot ran.zat)]
[mos ..^$] [mos ..^$]
@ -2640,7 +2608,7 @@
=+ her=(slav %p i.t.t.tea) =+ her=(slav %p i.t.t.tea)
=* syd i.t.t.t.tea =* syd i.t.t.t.tea
=+ zax=(do now hen [our her] syd ruf) =+ zax=(do now hen [our her] syd ruf)
=+ zat=(take-foreign-plops:zax p.q.hin) =+ zat=(take-foreign-plops:zax q.q.hin)
=^ mos ruf =^ mos ruf
=+ zot=abet.zat =+ zot=abet.zat
[-.zot (posh her syd +.zot ruf)] [-.zot (posh her syd +.zot ruf)]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,8 @@
:: ::
++ bead ,[p=(set beam) q=gage] :: computed result ++ bead ,[p=(set beam) q=gage] :: computed result
++ gift :: out result <-$ ++ gift :: out result <-$
$% [%made p=(each bead (list tank))] :: computed result $% [%made p=@uvH q=(each gage tang)] :: computed result
[%news ~] :: fresh depends
== :: == ::
++ heel path :: functional ending ++ heel path :: functional ending
++ hock :: standard label ++ hock :: standard label
@ -37,7 +38,7 @@
[%dub p=term q=horn] :: /= apply face [%dub p=term q=horn] :: /= apply face
[%fan p=(list horn)] :: /. list [%fan p=(list horn)] :: /. list
[%for p=path q=horn] :: /, descend [%for p=path q=horn] :: /, descend
[%hel p=@ud q=horn] :: /% propogate heel [%hel p=@ud q=horn] :: /% propagate heel
[%hub p=horn] :: /@ list by @ud [%hub p=horn] :: /@ list by @ud
[%man p=(map span horn)] :: /* hetero map [%man p=(map span horn)] :: /* hetero map
[%nap p=horn] :: /_ homo map [%nap p=horn] :: /_ homo map
@ -49,6 +50,7 @@
== :: == ::
++ kiss :: in request ->$ ++ kiss :: in request ->$
$% [%exec p=@p q=beak r=(unit silk)] :: make / kill $% [%exec p=@p q=beak r=(unit silk)] :: make / kill
[%wasp p=@p q=@uvH] :: depends query
== :: == ::
++ milk (trel ship desk silk) :: sourced silk ++ milk (trel ship desk silk) :: sourced silk
++ move ,[p=duct q=(mold note gift)] :: local move ++ move ,[p=duct q=(mold note gift)] :: local move
@ -93,6 +95,7 @@
++ baby :: state by ship ++ baby :: state by ship
$: tad=[p=@ud q=(map ,@ud task)] :: tasks by number $: tad=[p=@ud q=(map ,@ud task)] :: tasks by number
dym=(map duct ,@ud) :: duct to task number dym=(map duct ,@ud) :: duct to task number
deh=deps :: depends by hash
jav=(map ,* calx) :: cache jav=(map ,* calx) :: cache
== :: == ::
++ bolt :: gonadic edge ++ bolt :: gonadic edge
@ -100,8 +103,8 @@
$: p=cafe :: cache $: p=cafe :: cache
$= q :: $= q ::
$% [%0 p=(set beam) q=a] :: depends/product $% [%0 p=(set beam) q=a] :: depends/product
[%1 p=(set ,[p=care q=beam r=(list tank)])] :: blocks [%1 p=(set ,[p=care q=beam r=tang])] :: blocks
[%2 p=(list tank)] :: error [%2 p=(set beam) q=tang] :: depends/error
== :: == ::
== :: == ::
:: :: :: ::
@ -112,6 +115,7 @@
++ cafe :: live cache ++ cafe :: live cache
$: p=(set calx) :: used $: p=(set calx) :: used
q=(map ,* calx) :: cache q=(map ,* calx) :: cache
r=deps :: dependencies
== :: == ::
:: :: :: ::
++ calm :: cache metadata ++ calm :: cache metadata
@ -126,6 +130,7 @@
[%slap p=calm q=[p=vase q=twig] r=vase] :: compute [%slap p=calm q=[p=vase q=twig] r=vase] :: compute
[%slam p=calm q=[p=vase q=vase] r=vase] :: compute [%slam p=calm q=[p=vase q=vase] r=vase] :: compute
== :: == ::
++ deps (map ,@uvH (set beam)) :: hashed depends
++ task :: problem in progress ++ task :: problem in progress
$: nah=duct :: cause $: nah=duct :: cause
kas=silk :: problem kas=silk :: problem
@ -162,16 +167,25 @@
++ chub :: cache merge ++ chub :: cache merge
|= [a=cafe b=cafe] :: |= [a=cafe b=cafe] ::
^- cafe :: ^- cafe ::
[(grom p.a p.b) (grum q.a q.b)] :: [(grom p.a p.b) (grum q.a q.b) (grum r.a r.b)] ::
:: ::
++ faun |=([a=cafe b=vase] (fine a `gage`noun/b)) :: vase to cage
++ feel |=([a=cafe b=gage] (fine a q.b)) :: cage to vase
++ fest :: bolt to success
|= a=beam ::
|*([b=cafe c=*] (flag a (fine b [~ u=c]))) ::
:: :: :: ::
++ faun |=([a=cafe b=vase] (fine a `gage`noun/b)) :: vase to gage
++ feel |=([a=cafe b=gage] (fine a q.b)) :: gage to vase
++ fest |*([a=cafe b=*] (fine a [~ u=b])) :: bolt to unit
++ fine |* [a=cafe b=*] :: bolt from data ++ fine |* [a=cafe b=*] :: bolt from data
[p=`cafe`a q=[%0 p=*(set beam) q=b]] :: [p=`cafe`a q=[%0 p=*(set beam) q=b]] ::
++ flaw |=([a=cafe b=(list tank)] [p=a q=[%2 p=b]]) :: bolt from error ++ flaw |= [a=cafe b=tang] :: bolt from error
++ clean-beak ::|=([now=@da bek=beak] [p.bek q.bek %da now]) [p=a q=[%2 p=*(set beam) q=b]] ::
|=([now=@da bek=beak] bek) ++ flag :: beam into deps
|* [a=beam b=(bolt)] ::
?: ?=(%1 -.q.b) b
=. p.q.b (~(put in p.q.b) a)
b
:: ::
++ flue |=(a=cafe (fine a ~)) :: cafe to empty
++ grom :: merge sets ++ grom :: merge sets
|* [one=(set) two=(set)] |* [one=(set) two=(set)]
^+ one ^+ one
@ -232,12 +246,6 @@
== ==
~(exec zo [num `task`[hen u.kus ~ 0 ~]]) ~(exec zo [num `task`[hen u.kus ~ 0 ~]])
:: ::
++ apel :: stateless
|= [hen=duct kus=silk]
^- (unit gift)
=+ num=0 :: XX
~(exit zo [num `task`[hen kus ~ 0 ~]])
::
++ axon :: take ++ axon :: take
|= [num=@ud tik=@ud sih=sign] |= [num=@ud tik=@ud sih=sign]
^+ +> ^+ +>
@ -250,6 +258,31 @@
(~(resp zo [num u.tus]) tik p.+.sih) (~(resp zo [num u.tus]) tik p.+.sih)
== ==
:: ::
++ axun :: take rev update
|= [dep=@uvH sih=sign]
^+ +>
?- -.+.sih
%writ
+>.$(mow :_(mow [hen %give %news ~]))
==
::
++ awap :: get next revision
~% %ford-w ..is ~
|= dep=@uvH
%_ +>.$
mow
%- welp :_ mow
%+ turn ~|(dep-missed/dep (~(tap in (~(got by deh.bay) dep))))
|= a=beam
:^ hen %pass [(scot %p our) (scot %uv dep) ~]
=- [%c [%warp [our p.a] q.a ~ [%sing %y ud/+(`@ud`-) s.a]]]
?. ?=(%ud -.r.a)
;;(@ q.q:(need (need (ska ~ %cw -.a /))))
?: =(0 p.r.a)
;;(@ q.q:(need (need (ska ~ %cw -.a(r da/now) /))))
p.r.a
==
::
++ zo ++ zo
~% %ford-z ~% %ford-z
..is ..is
@ -347,19 +380,19 @@
++ cool :: error caption ++ cool :: error caption
|* [cyt=trap hoc=(bolt)] |* [cyt=trap hoc=(bolt)]
?. ?=(%2 -.q.hoc) hoc ?. ?=(%2 -.q.hoc) hoc
[p.hoc [%2 *cyt p.q.hoc]] [p.hoc [%2 p.q.hoc *cyt q.q.hoc]]
:: ::
++ cope :: bolt along ++ cope :: bolt along
|* [hoc=(bolt) fun=(burg)] |* [hoc=(bolt) fun=(burg)]
?- -.q.hoc ?- -.q.hoc
%2 hoc
%1 hoc %1 hoc
%2 hoc
%0 =+ nuf=(fun p.hoc q.q.hoc) %0 =+ nuf=(fun p.hoc q.q.hoc)
:- p=p.nuf :- p=p.nuf
^= q ^= q
?- -.q.nuf ?- -.q.nuf
%2 q.nuf
%1 q.nuf %1 q.nuf
%2 [%2 p=(grom `_p.q.nuf`p.q.hoc p.q.nuf) q=q.q.nuf]
%0 [%0 p=(grom `_p.q.nuf`p.q.hoc p.q.nuf) q=q.q.nuf] %0 [%0 p=(grom `_p.q.nuf`p.q.hoc p.q.nuf) q=q.q.nuf]
== == == ==
:: ::
@ -369,7 +402,7 @@
:- p=cof :- p=cof
^= q ^= q
?- -.ton ?- -.ton
%2 [%2 p=p.ton] %2 [%2 p=*(set beam) q=p.ton]
%0 [%0 p=*(set beam) q=(fun p.ton)] %0 [%0 p=*(set beam) q=(fun p.ton)]
%1 :: ~& [%coup-need ((list path) p.ton)] %1 :: ~& [%coup-need ((list path) p.ton)]
=- ?- -.faw =- ?- -.faw
@ -377,23 +410,24 @@
^= p ^= p
%- sa %- sa
%+ turn p.faw %+ turn p.faw
|=(a=[care beam] [-.a +.a *(list tank)]) |=(a=[care beam] [-.a +.a *tang])
| [%2 p=p.faw] | [%2 p=*(set beam) q=p.faw]
== ==
^= faw ^= faw
|- ^- (each (list (pair care beam)) (list tank)) |- ^- (each (list (pair care beam)) tang)
?~ p.ton [%& ~] ?~ p.ton [%& ~]
=+ nex=$(p.ton t.p.ton) =+ nex=$(p.ton t.p.ton)
=+ err=|=(a=tape [%| leaf/a ?:(?=(& -.nex) ~ p.nex)])
=+ pax=(path i.p.ton) =+ pax=(path i.p.ton)
?~ pax [%| (smyt pax) ?:(?=(& -.nex) ~ p.nex)] ?~ pax (err "blocking empty")
?. ?=(%c (end 3 1 i.pax)) ?. ?=(%c (end 3 1 i.pax))
[%| leaf/"blocking not clay" (smyt pax) ?:(?=(& -.nex) ~ p.nex)] (err "blocking not clay")
=+ ren=((soft care) (rsh 3 1 i.pax)) =+ ren=((soft care) (rsh 3 1 i.pax))
?~ ren ?~ ren
[%| leaf/"blocking not care" (smyt pax) ?:(?=(& -.nex) ~ p.nex)] (err "blocking not care")
=+ zis=(tome t.pax) =+ zis=(tome t.pax)
?~ zis ?~ zis
[%| leaf/"blocking not beam" (smyt pax) ?:(?=(& -.nex) ~ p.nex)] (err "blocking not beam")
?- -.nex ?- -.nex
& [%& [u.ren u.zis] p.nex] & [%& [u.ren u.zis] p.nex]
| nex | nex
@ -402,7 +436,7 @@
:: ::
++ cowl :: each to bolt ++ cowl :: each to bolt
|= cof=cafe |= cof=cafe
|* [tod=(each ,* (list tank)) fun=$+(* *)] |* [tod=(each ,* tang) fun=$+(* *)]
%+ (coup cof) %+ (coup cof)
?- -.tod ?- -.tod
%& [%0 p=p.tod] %& [%0 p=p.tod]
@ -413,7 +447,7 @@
++ dash :: process cache ++ dash :: process cache
|= cof=cafe |= cof=cafe
^+ +> ^+ +>
%_(+> jav.bay q.cof) %_(+> jav.bay q.cof, deh.bay r.cof)
:: ::
++ diff :: diff ++ diff :: diff
|= [cof=cafe kas=silk kos=silk] |= [cof=cafe kas=silk kos=silk]
@ -461,24 +495,23 @@
(fine cof u.for dif) (fine cof u.for dif)
== ==
:: ::
++ exit :: stateless exec ++ daze :: remember depends
^- (unit gift) |= dep=(set beam)
=+ bot=(make [~ jav.bay] kas) ^+ [*@uvH deh.bay]
:: =. ..exec (dash p.bot) ?~ dep [0v0 deh.bay]
?- -.q.bot =+ hap=(sham dep)
%0 `[%made %& p.q.bot q.q.bot] [hap (~(put by deh.bay) hap dep)]
%2 `[%made %| p.q.bot]
%1 ~
==
:: ::
++ exec :: execute app ++ exec :: execute app
^+ ..zo ^+ ..zo
?: !=(~ q.kig) ..zo ?: !=(~ q.kig) ..zo
=+ bot=(make [~ jav.bay] kas) =+ bot=(make [~ jav.bay deh.bay] kas)
=. ..exec (dash p.bot) =. ..exec (dash p.bot)
?- -.q.bot ?- -.q.bot
%0 amok:(expo [%made %& p.q.bot q.q.bot]) %0 =^ dep deh.bay (daze p.q.bot)
%2 amok:(expo [%made %| p.q.bot]) amok:(expo [%made dep %& q.q.bot])
%2 =^ dep deh.bay (daze p.q.bot)
amok:(expo [%made dep %| q.q.bot])
%1 =+ zuk=(~(tap by p.q.bot) ~) %1 =+ zuk=(~(tap by p.q.bot) ~)
=< abet =< abet
|- ^+ ..exec |- ^+ ..exec
@ -500,6 +533,7 @@
%+ (clef %hood) (fine cof bem cay) %+ (clef %hood) (fine cof bem cay)
^- (burg (pair beam gage) hood) ^- (burg (pair beam gage) hood)
|= [cof=cafe bum=beam cay=gage] |= [cof=cafe bum=beam cay=gage]
:: ~& fade/clef-miss/bem
=+ rul=(fair bem) =+ rul=(fair bem)
?. ?=(@ q.q.cay) ?. ?=(@ q.q.cay)
(flaw cof ~) (flaw cof ~)
@ -765,7 +799,7 @@
^- (bolt gage) ^- (bolt gage)
%+ cope %+ cope
|- ^- (bolt (list (pair wing vase))) |- ^- (bolt (list (pair wing vase)))
?~ muy (fine cof ~) ?~ muy (flue cof)
%+ cope (make cof q.i.muy) %+ cope (make cof q.i.muy)
|= [cof=cafe cay=gage] |= [cof=cafe cay=gage]
%+ cope ^$(muy t.muy) %+ cope ^$(muy t.muy)
@ -800,12 +834,13 @@
%+ cope (lend cof bem) %+ cope (lend cof bem)
|= [cof=cafe arc=arch] |= [cof=cafe arc=arch]
?^ q.arc ?^ q.arc
(cope (cope (liar cof bem) (lake for)) fest) (cope (cope (liar cof bem) (lake for)) (fest (norm bem)))
?: (~(has by r.arc) %hook) ?: (~(has by r.arc) %hook)
%+ cope (fade cof %hook bem) %+ cope (fade cof %hook bem)
|= [cof=cafe hyd=hood] |= [cof=cafe hyd=hood]
(cope (cope (abut:(meow bem arg) cof hyd) (lake for)) fest) %+ cope (cope (abut:(meow bem arg) cof hyd) (lake for))
(fine cof ~) (fest (norm bem))
(flue cof)
:: ::
++ lake :: check/coerce ++ lake :: check/coerce
|= for=mark |= for=mark
@ -909,7 +944,7 @@
:: ::
++ lima :: load at depth ++ lima :: load at depth
|= [cof=cafe for=mark bem=beam arg=heel] |= [cof=cafe for=mark bem=beam arg=heel]
%+ (clef %bake) (fine cof for bem arg) %+ (clef %bake) [p=cof q=[%0 p=[bem `~] q=[for bem arg]]]
|= [cof=cafe for=mark bem=beam arg=heel] |= [cof=cafe for=mark bem=beam arg=heel]
^- (bolt (unit vase)) ^- (bolt (unit vase))
%+ cope (lend cof bem) %+ cope (lend cof bem)
@ -918,16 +953,15 @@
?: (~(has by r.arc) for) ?: (~(has by r.arc) for)
(lace cof for bem(s [for s.bem]) arg) (lace cof for bem(s [for s.bem]) arg)
=+ haz=(turn (~(tap by r.arc) ~) |=([a=@tas b=~] a)) =+ haz=(turn (~(tap by r.arc) ~) |=([a=@tas b=~] a))
?~ haz (fine cof ~) ?~ haz (flue cof)
%+ cope (lion cof for haz) %+ cope (lion cof for haz)
|= [cof=cafe wuy=(unit (list ,@tas))] |= [cof=cafe wuy=(list ,@tas)]
?~ wuy (fine cof ~) ?~ wuy (flue cof)
?> ?=(^ u.wuy) %+ cope (make cof %bake i.wuy bem arg)
%+ cope (make cof %bake i.u.wuy bem arg)
|= [cof=cafe hoc=gage] |= [cof=cafe hoc=gage]
%+ cope (lope cof i.u.wuy t.u.wuy q.hoc) %+ cope (lope cof i.wuy t.wuy q.hoc)
|= [cof=cafe vax=vase] |= [cof=cafe vax=vase]
(fine cof ~ vax) ((fest bem) cof vax)
:: ::
++ lime :: load beam ++ lime :: load beam
|= [cof=cafe for=mark bem=beam arg=heel] |= [cof=cafe for=mark bem=beam arg=heel]
@ -937,6 +971,8 @@
|= [cof=cafe vux=(unit vase)] |= [cof=cafe vux=(unit vase)]
?^ vux (fine cof u.vux) ?^ vux (fine cof u.vux)
?~ s.mob ?~ s.mob
%+ flag
(norm mob)
(flaw cof leaf/"beam unavailable" (smyt (tope bem)) ~) (flaw cof leaf/"beam unavailable" (smyt (tope bem)) ~)
^$(s.mob t.s.mob, mer [i.s.mob mer]) ^$(s.mob t.s.mob, mer [i.s.mob mer])
:: ::
@ -965,13 +1001,13 @@
:: ::
++ lion :: translation search ++ lion :: translation search
|= [cof=cafe too=@tas fro=(list ,@tas)] |= [cof=cafe too=@tas fro=(list ,@tas)]
^- (bolt (unit (list ,@tas))) ^- (bolt (list ,@tas))
=| war=(set ,@tas) =| war=(set ,@tas)
=< -:(apex (fine cof fro)) =< -:(apex (fine cof fro))
|% |%
++ apex ++ apex
|= rof=(bolt (list ,@tas)) |= rof=(bolt (list ,@tas))
^- [(bolt (unit (list ,@tas))) _+>] ^- [(bolt (list ,@tas)) _+>]
?. ?=(%0 -.q.rof) [rof +>.$] ?. ?=(%0 -.q.rof) [rof +>.$]
?~ q.q.rof ?~ q.q.rof
[[p.rof [%0 p.q.rof ~]] +>.$] [[p.rof [%0 p.q.rof ~]] +>.$]
@ -984,16 +1020,16 @@
:: ::
++ apse ++ apse
|= [cof=cafe for=@tas] |= [cof=cafe for=@tas]
^- [(bolt (unit (list ,@tas))) _+>] ^- [(bolt (list ,@tas)) _+>]
?: =(for too) ?: =(for too)
[(fine cof [~ too ~]) +>.$] [(fine cof [too ~]) +>.$]
?: (~(has in war) for) [(fine cof ~) +>] ?: (~(has in war) for) [(flue cof) +>]
=. war (~(put in war) for) =. war (~(put in war) for)
=^ hoc +>.$ (apex (lily cof for)) =^ hoc +>.$ (apex (lily cof for))
:_ +>.$ :_ +>.$
%+ cope hoc %+ cope hoc
|= [cof=cafe ked=(unit (list ,@tas))] |= [cof=cafe ked=(list ,@tas)]
(fine cof ?~(ked ~ [~ for u.ked])) (fine cof ?~(ked ~ [for ked]))
-- --
:: ::
++ lope :: translation pipe ++ lope :: translation pipe
@ -1092,12 +1128,6 @@
%+ cope (link cof p.kas p.cay q.cay) %+ cope (link cof p.kas p.cay q.cay)
|= [cof=cafe vax=vase] |= [cof=cafe vax=vase]
(fine cof [p.kas vax]) (fine cof [p.kas vax])
:: %+ cope (lion cof p.kas [p.cay]~)
:: |= [cof=cafe wuy=(list ,@tas)]
:: ?~ wuy (flaw cof [%leaf "ford: no path: {<[p.cay p.kas]>}"]~)
:: %+ cope (lope cof i.wuy t.wuy q.cay)
:: |= [cof=cafe vax=vase]
:: (fine cof [p.kas vax])
:: ::
%diff %diff
%+ cool |.(leaf/"ford: diff {<`@p`(mug p.kas)>} {<`@p`(mug q.kas)>}") %+ cool |.(leaf/"ford: diff {<`@p`(mug p.kas)>} {<`@p`(mug q.kas)>}")
@ -1106,7 +1136,7 @@
%done [cof %0 p.kas q.kas] %done [cof %0 p.kas q.kas]
%dude (cool |.(p.kas) $(kas q.kas)) %dude (cool |.(p.kas) $(kas q.kas))
%dune %dune
?~ q.kas [cof [%2 [%leaf "no data"]~]] ?~ q.kas [cof [%2 p.kas [%leaf "no data"]~]]
$(kas [%done p.kas u.q.kas]) $(kas [%done p.kas u.q.kas])
:: ::
%file %file
@ -1220,7 +1250,7 @@
^- twig ^- twig
:+ %tsgr :+ %tsgr
?:(=(~ rop) [%$ 1] [%brcn (~(run by rop) |=([* a=twig] [%ash a]))]) ?:(=(~ rop) [%$ 1] [%brcn (~(run by rop) |=([* a=twig] [%ash a]))])
[%tssg (turn (flop lot) |=(a=term q:(need (~(get by bil) a))))] [%tssg (turn (flop lot) |=(a=term q:(~(got by bil) a)))]
:: ::
++ ably :: naked structure ++ ably :: naked structure
|= [cof=cafe for=mark hyd=hood] :: XX unused |= [cof=cafe for=mark hyd=hood] :: XX unused
@ -1283,7 +1313,7 @@
|=([a=[@ *] b=[@ *]] (lth -.a -.b)) |=([a=[@ *] b=[@ *]] (lth -.a -.b))
%+ cope %+ cope
|- ^- (bolt (list (pair ,@ vase))) |- ^- (bolt (list (pair ,@ vase)))
?~ poy (fine cof ~) ?~ poy (flue cof)
%+ cope $(poy t.poy) %+ cope $(poy t.poy)
|= [cof=cafe nex=(list (pair ,@ vase))] |= [cof=cafe nex=(list (pair ,@ vase))]
%+ cope (chap(s.how [q.i.poy s.how]) cof bax hon) %+ cope (chap(s.how [q.i.poy s.how]) cof bax hon)
@ -1302,7 +1332,7 @@
|= [cof=cafe arc=arch] |= [cof=cafe arc=arch]
%+ cope %+ cope
|- ^- (bolt (map ,@ vase)) |- ^- (bolt (map ,@ vase))
?~ r.arc (fine cof ~) ?~ r.arc (flue cof)
%+ cope $(r.arc l.r.arc) %+ cope $(r.arc l.r.arc)
|= [cof=cafe lef=(map ,@ vase)] |= [cof=cafe lef=(map ,@ vase)]
%+ cope `(bolt (map ,@ vase))`^$(cof cof, r.arc r.r.arc) %+ cope `(bolt (map ,@ vase))`^$(cof cof, r.arc r.r.arc)
@ -1337,7 +1367,7 @@
%fan %fan
%+ cope %+ cope
|- ^- (bolt (list vase)) |- ^- (bolt (list vase))
?~ p.hon (fine cof ~) ?~ p.hon (flue cof)
%+ cope ^$(hon i.p.hon) %+ cope ^$(hon i.p.hon)
|= [cof=cafe vax=vase] |= [cof=cafe vax=vase]
%+ cope ^$(cof cof, p.hon t.p.hon) %+ cope ^$(cof cof, p.hon t.p.hon)
@ -1491,6 +1521,15 @@
== ==
-- --
:: ::
++ norm :: normalize beam rev
|= bem=beam
%_ bem
r ?: ?=(%ud -.r.bem) r.bem
=+ num=(ska ~ %cw bem(s ~))
?. ?=([~ ~ * * @u] num) r.bem :: XX
[%ud q.q.u.u.num]
==
::
++ pact :: patch ++ pact :: patch
|= [cof=cafe kas=silk kos=silk] |= [cof=cafe kas=silk kos=silk]
^- (bolt gage) ^- (bolt gage)
@ -1552,7 +1591,8 @@
?> (~(has by q.kig) tik) ?> (~(has by q.kig) tik)
=+ `[ren=care bem=beam]`(~(got by q.kig) tik) =+ `[ren=care bem=beam]`(~(got by q.kig) tik)
?~ rot ?~ rot
amok:(expo [%made %| (smyt ren (tope bem)) ~]) =^ dep deh.bay (daze ~) :: dependencies?
amok:(expo [%made dep %| (smyt ren (tope bem)) ~])
=+ (cat 3 'c' ren) =+ (cat 3 'c' ren)
exec(q.kig (~(del by q.kig) tik), keg (~(put by keg) [- bem] r.u.rot)) exec(q.kig (~(del by q.kig) tik), keg (~(put by keg) [- bem] r.u.rot))
:: ::
@ -1582,12 +1622,15 @@
=+ ^= our ^- @p =+ ^= our ^- @p
?- -.q.hic ?- -.q.hic
%exec p.q.hic %exec p.q.hic
%wasp p.q.hic
== ==
=+ ^= bay ^- baby =+ ^= bay ^- baby
=+ buy=(~(get by pol.lex) our) =+ buy=(~(get by pol.lex) our)
?~(buy *baby u.buy) ?~(buy *baby u.buy)
=+ bek=(clean-beak now q.q.hic)
=^ mos bay =^ mos bay
?: ?=(%wasp -.q.hic)
abet:(~(awap za [[our *beak hen] [now eny ski] ~] bay) q.q.hic)
=* bek q.q.hic
abet:(~(apex za [[our bek hen] [now eny ski] ~] bay) r.q.hic) abet:(~(apex za [[our bek hen] [now eny ski] ~] bay) r.q.hic)
[mos ..^$(pol (~(put by pol) our bay))] [mos ..^$(pol (~(put by pol) our bay))]
:: ::
@ -1598,14 +1641,14 @@
:: ::
++ load :: highly forgiving ++ load :: highly forgiving
|= old=* |= old=*
=. old ::=. old
?. ?=([%0 *] old) old :: remove at 1 :: ?. ?=([%0 *] old) old :: remove at 1
:- %1 :: :- %1
|- ^- * :: |- ^- *
?~ +.old ~ :: ?~ +.old ~
?> ?=([n=[p=* q=[tad=* dym=* jav=*]] l=* r=*] +.old) :: ?> ?=([n=[p=* q=[tad=* dym=* deh=* jav=*]] l=* r=*] +.old)
:- [p.n.+.old [tad.q.n.+.old dym.q.n.+.old ~]] :: :- [p.n.+.old [tad.q.n.+.old dym.q.n.+.old deh.q.n.+.old ~]]
[$(+.old l.+.old) $(+.old r.+.old)] :: [$(+.old l.+.old) $(+.old r.+.old)]
=+ lox=((soft axle) old) =+ lox=((soft axle) old)
^+ ..^$ ^+ ..^$
?~ lox ?~ lox
@ -1619,19 +1662,22 @@
[~ ~] [~ ~]
:: ::
++ stay :: save w/o cache ++ stay :: save w/o cache
`axle`+>-.$(pol (~(run by pol) |=(a=baby [tad.a dym.a ~]))) `axle`+>-.$(pol (~(run by pol) |=(a=baby [tad.a dym.a deh.a ~])))
:: ::
++ take :: response ++ take :: response
|= [tea=wire hen=duct hin=(hypo sign)] |= [tea=wire hen=duct hin=(hypo sign)]
^- [p=(list move) q=_..^$] ^- [p=(list move) q=_..^$]
?> ?=([@ @ @ @ @ @ ~] tea) ?> ?=([@ @ *] tea)
=+ :* our=(slav %p i.tea) =+ our=(need (slaw %p i.tea))
num=(slav %ud i.t.tea)
tik=(slav %ud i.t.t.tea)
bek=(clean-beak now -:(need (tome t.t.t.tea)))
==
=+ bay=(~(got by pol.lex) our) =+ bay=(~(got by pol.lex) our)
=^ mos bay =^ mos bay
?~ t.t.tea
abet:(~(axun za [[our *beak hen] [now eny ski] ~] bay) (slav %uv i.t.tea) q.hin)
?> ?=([@ @ @ @ ~] t.t.tea)
=+ :* num=(need (slaw %ud i.t.tea))
tik=(need (slaw %ud i.t.t.tea))
bek=-:(need (tome t.t.t.tea))
==
abet:(~(axon za [[our bek hen] [now eny ski] ~] bay) num tik q.hin) abet:(~(axon za [[our bek hen] [now eny ski] ~] bay) num tik q.hin)
[mos ..^$(pol (~(put by pol) our bay))] [mos ..^$(pol (~(put by pol) our bay))]
-- --

View File

@ -19,7 +19,6 @@
[%meta p=vase] :: meta-gift [%meta p=vase] :: meta-gift
[%nice ~] :: message success [%nice ~] :: message success
== :: == ::
::++ hasp ,[p=ship q=term] :: app identity
++ hapt ,[p=ship q=path] :: app instance ++ hapt ,[p=ship q=path] :: app instance
++ hath ,[p=ship q=term] :: app identity ++ hath ,[p=ship q=term] :: app identity
++ kiss :: in request ->$ ++ kiss :: in request ->$
@ -156,7 +155,7 @@
[%vega p=path] :: [%vega p=path] ::
== == :: == == ::
$: %f :: by %ford $: %f :: by %ford
$% [%made p=(each bead (list tank))] :: $% [%made p=@uvH q=(each gage tang)] ::
== == == :: == == == ::
++ toil (pair duct knob) :: work in progress ++ toil (pair duct knob) :: work in progress
-- :::::::::::::::::::::::::::::::::::::::::::::::::::::: -- ::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ -359,7 +358,11 @@
:: ~& [%gape-took our imp hen] :: ~& [%gape-took our imp hen]
[~ ..^^$] [~ ..^^$]
=+ you=`ship`?-(-.kon %mess p.kon, %nuke p.kon, %show p.kon) =+ you=`ship`?-(-.kon %mess p.kon, %nuke p.kon, %show p.kon)
=+ mat=(~(got by pol.all) you) =+ mut=(~(get by pol.all) you)
?~ mut
~& [%gape-lost you hen]
!!
=+ mat=u.mut
=+ sad==+(sad=(~(get by sap.mat) our) ?^(sad u.sad [.(p 1)]:*scad)) =+ sad==+(sad=(~(get by sap.mat) our) ?^(sad u.sad [.(p 1)]:*scad))
=^ num sad =^ num sad
=+ nym=(~(get by q.sad) hen) =+ nym=(~(get by q.sad) hen)
@ -404,13 +407,13 @@
:_ ..^$ :_ ..^$
:_ ~ :_ ~
:- hen :- hen
?- -.p.+.sih ?- -.q.+.sih
%| %|
[%give %crud %gasp-crud p.p.+.sih] [%give %crud %gasp-crud p.q.+.sih]
:: ::
%& %&
=+ cay=`gage`q.p.p.+.sih ?. ?=(@ p.p.q.+.sih) ~| %bad-marc !!
?. ?=(@ p.cay) ~| %bad-marc !! =+ cay=`cage`p.q.+.sih
?+ -.pax !! ?+ -.pax !!
%d [%give (best %rush cay)] %d [%give (best %rush cay)]
%f [%give (best %rust cay)] %f [%give (best %rust cay)]
@ -430,37 +433,18 @@
:_ ..^$ :_ ..^$
=+ rod=|=(ron=roon `note`[%a %wont [our you] [%q %gh imp] num ron]) =+ rod=|=(ron=roon `note`[%a %wont [our you] [%q %gh imp] num ron])
?+ -.pax !! ?+ -.pax !!
%m ?: ?=(%a -.sih) ~ %z ?+ -.sih !!
?+ -.sih ~& [%gall-gave-m -.sih] !!
%f
:_ ~ :- hen
?- -.p.+.sih
%| [%give %mean ~ %ford-fail p.p.+.sih]
%& ?. ?=(@ p.q.p.p.+.sih) ~| %bad-marc !!
[%pass [%r pax] %g %mess [our imp] you `cage`q.p.p.+.sih]
==
::
%g
:_ ~ :- hen
?- -.+.sih
%crud !!
%dumb !!
%gone !!
%init !!
%logo !!
%mean [%give %mean p.+.sih]
%nice [%give %nice ~]
%rush !!
%rust !!
%sage !!
%verb !!
%veer !!
%vega !!
==
==
%s ?+ -.sih !!
%a :_ ~ :- hen %a :_ ~ :- hen
[%pass [%r pax] %g %took [our imp] you] [%pass [%r pax] %g %took [our imp] you]
::
%f
:_ ~ :- hen
?- -.q.+.sih
%| [%give %mean ~ %ford-fail p.q.+.sih]
%& ?. ?=(@ p.p.q.+.sih) ~| %bad-marc !!
[%pass [%r pax] %g %mess [our imp] you `cage`p.q.+.sih]
==
::
%g %g
:_ ~ :- hen :_ ~ :- hen
?- -.+.sih ?- -.+.sih
@ -507,7 +491,8 @@
^- move :- hen ^- move :- hen
:+ %pass :+ %pass
:* %r :* %r
?-(-.rok %m %m, %s %s, %u %s) :: ?-(-.rok %m %m, %s %s, %u %s)
%z
(scot %p p.saq) (scot %p p.saq)
(scot %p q.saq) (scot %p q.saq)
(scot %ud num) (scot %ud num)
@ -570,8 +555,8 @@
:: ::
++ able :: bone to duct ++ able :: bone to duct
|= ost=bone ^- duct |= ost=bone ^- duct
?: =(0 ost) :: ?: =(0 ost)
[(away ~) ~] :: hun.mat
(~(got by r.zam.sat) ost) (~(got by r.zam.sat) ost)
:: ::
++ away :: application path ++ away :: application path
@ -735,17 +720,18 @@
%_(+>.$ ped.sat pen, mow :(weld new old mow)) %_(+>.$ ped.sat pen, mow :(weld new old mow))
:: ::
++ drum :: raw dependencies ++ drum :: raw dependencies
|= dep=(set beam) |= dep=@uvH
^+ +> ^+ +>
?> ?=(^ orm.sat) ?> ?=(^ orm.sat)
%- drug %- drug
=+ ped=`(set (pair ship desk))`[[our %main] ~ ~] =+ ped=`(set (pair ship desk))`[[our %main] ~ ~]
=+ mav=(~(tap by dep) ~) ped
|- ^+ ped ::=+ mav=(~(tap by dep) ~)
?~ mav ped ::|- ^+ ped
?: =(r.i.mav [%da u.orm.sat]) ::?~ mav ped
$(mav t.mav, ped (~(put in ped) p.i.mav q.i.mav)) ::?: =(r.i.mav [%da u.orm.sat])
$(mav t.mav) :: $(mav t.mav, ped (~(put in ped) p.i.mav q.i.mav))
::$(mav t.mav)
:: ::
++ ford :: exec to ford ++ ford :: exec to ford
|= [pax=path kas=silk] |= [pax=path kas=silk]
@ -790,64 +776,57 @@
|= sih=sign |= sih=sign
?> ?=(%f -.sih) ?> ?=(%f -.sih)
^- [(unit (list tank)) _+>] ^- [(unit (list tank)) _+>]
?- -.p.+.sih ?- -.q.+.sih
& :- ~ & :- ~
%- obey:(morn (slot 3 q.q.p.p.+.sih)) %- obey:(morn (slot 3 q.p.q.+.sih))
(slot 2 q.q.p.p.+.sih) (slot 2 q.p.q.+.sih)
| [`p.p.+.sih (give %crud %mack-made p.p.+.sih)] | [`p.q.+.sih (give %crud %mack-made p.q.+.sih)]
== ==
:: ::
++ meek :: apply peek ++ meek :: apply peek
|= sih=sign |= sih=sign
^- [(unit cage) _+>] ^- [(unit cage) _+>]
?> ?=(%f -.sih) ?> ?=(%f -.sih)
?- -.p.+.sih ?- -.q.+.sih
& =+ vax=`vase`q.q.p.p.+.sih & =+ vax=`vase`q.p.q.+.sih
?. &(?=(^ q.vax) ?=(@ -.q.vax)) ?. &(?=(^ q.vax) ?=(@ -.q.vax))
[~ (give %crud %peek-lame *(list tank))] [~ (give %crud %peek-lame *(list tank))]
:: ~> %slog.[0 (skol p:(slot 3 vax))] :: ~> %slog.[0 (skol p:(slot 3 vax))]
:- `[((hard mark) -.q.vax) (slot 3 vax)] :- `[((hard mark) -.q.vax) (slot 3 vax)]
+>.$ +>.$
| [~ (give %crud %meek-made p.p.+.sih)] | [~ (give %crud %meek-made p.q.+.sih)]
== ==
:: ::
++ mick :: apply w/depends ++ mick :: apply w/depends
|= sih=sign |= sih=sign
?> ?=(%f -.sih) ?> ?=(%f -.sih)
^- [(unit (set beam)) _+>] ^- [[p=? q=@uvH] _+>]
?- -.p.+.sih :- [-.q.+.sih p.+.sih]
& :- `p.p.p.+.sih ?- -.q.+.sih
%- obey:(morn (slot 3 q.q.p.p.+.sih)) & %- obey:(morn (slot 3 q.p.q.+.sih))
(slot 2 q.q.p.p.+.sih) (slot 2 q.p.q.+.sih)
| [~ (give %crud %mick-made p.p.+.sih)] | (give %crud %mick-made p.q.+.sih)
== ==
:: ::
++ muck :: apply part ++ muck :: apply part
|= sih=sign |= sih=sign
^- [(unit (list tank)) _+>] ^- [(unit (list tank)) _+>]
?> ?=(%f -.sih) ?> ?=(%f -.sih)
?- -.p.+.sih ?- -.q.+.sih
& [~ (obey q.q.p.p.+.sih)] & [~ (obey q.p.q.+.sih)]
| [`p.p.+.sih (give %crud %muck-made p.p.+.sih)] | [`p.q.+.sih (give %crud %muck-made p.q.+.sih)]
== ==
:: ::
++ murk :: apply park ++ murk :: apply park
|= sih=sign |= sih=sign
^- [(unit cage) _+>] ^- [(unit cage) _+>]
?> ?=(%f -.sih) ?> ?=(%f -.sih)
?- -.p.+.sih ?- -.q.+.sih
& ?. ?=(@ p.q.p.p.+.sih) ~| %bad-marc !! & ?. ?=(@ p.p.q.+.sih) ~| %bad-marc !!
[`q.p.p.+.sih +>.$] [`p.q.+.sih +>.$]
| [~ (give %crud %murk-made p.p.+.sih)] | [~ (give %crud %murk-made p.q.+.sih)]
== ==
:: ::
++ moar :: foreign take
|= $: pax=path
sih=sign
==
^+ +>
!!
::
++ more :: domestic take ++ more :: domestic take
|= $: pax=path :: internal position |= $: pax=path :: internal position
hin=(hypo sign) :: typed event hin=(hypo sign) :: typed event
@ -927,8 +906,8 @@
:: ::
%prep %prep
=^ gad +>.$ (mick q.hin) =^ gad +>.$ (mick q.hin)
?~ gad (drum ~) ?. p.gad (drum q.gad)
deal:(drum u.gad) deal:(drum q.gad)
:: ::
%pull %pull
=^ gud +>.$ (mack q.hin) =^ gud +>.$ (mack q.hin)
@ -1173,10 +1152,9 @@
:: ~& [%yawn-told-has ost qol [our hen]] :: ~& [%yawn-told-has ost qol [our hen]]
=+ qul=?~(qol 1 +(u.qol)) =+ qul=?~(qol 1 +(u.qol))
=. qel.sat (~(put by qel.sat) ost qul) =. qel.sat (~(put by qel.sat) ost qul)
:: XX turn me back on! ?: =(10 qul)
:: ?: =(10 qul) ~& [%yawn-told-full ost our hen]
:: ~& [%yawn-told-full ost our hen] +>.$(qic.sat ~, vey.sat (~(put to vey.sat) hen %nuke p.kon))
:: +>.$(qic.sat ~, vey.sat (~(put to vey.sat) hen %nuke p.kon))
+>.$(qic.sat ~) +>.$(qic.sat ~)
:: ::
%load %load
@ -1218,8 +1196,10 @@
(goc p.q.kon /pock) (goc p.q.kon /pock)
:(goc p.q.kon (rsh 3 ofs p.q.kon) /pock) :(goc p.q.kon (rsh 3 ofs p.q.kon) /pock)
=+ hyp=?=(%pock (end 3 4 cog)) =+ hyp=?=(%pock (end 3 4 cog))
=+ ^- err=tape
?.(?=(?(%poke %pock) cog) <cog> "{<cog>} with mark {<p.q.kon>}")
?. (warm cog) ?. (warm cog)
(give(qic.sat ~) %mean ~ %poke-find-fail ~) (give(qic.sat ~) %mean ~ %poke-find-fail leaf/err ~)
?> ?=(^ huv.sat) ?> ?=(^ huv.sat)
=+ ^= sam =+ ^= sam
;: slop ;: slop
@ -1227,10 +1207,9 @@
[[%atom %p] p.kon] [[%atom %p] p.kon]
?.(hyp q.q.kon (slop !>(p.q.q.kon) q.q.kon)) ?.(hyp q.q.kon (slop !>(p.q.q.kon) q.q.kon))
== ==
=+ err=?.(?=(?(%poke %pock) cog) <cog> "{<cog>} with mark <p.q.kon>")
:: ~& [%mess-poke cog] :: ~& [%mess-poke cog]
%+ ford /s/poke %+ ford /s/poke
:+ %dude leaf/"poking {err}" :+ %dude leaf/err
[%call (harm cog (conf (core u.huv.sat))) (cove %$ sam)] [%call (harm cog (conf (core u.huv.sat))) (cove %$ sam)]
:: ::
%show %show
@ -1244,6 +1223,7 @@
=+ sam=!>([p.kon q.kon]) =+ sam=!>([p.kon q.kon])
?> ?=(^ huv.sat) ?> ?=(^ huv.sat)
(yawl [%peek (scot %p p.kon) q.kon] leaf/"peeking" u.huv.sat sam) (yawl [%peek (scot %p p.kon) q.kon] leaf/"peeking" u.huv.sat sam)
~& [%show-dumb app.sat imp q.kon]
(give(qic.sat ~) %dumb ~) (give(qic.sat ~) %dumb ~)
:: ::
%sire %sire

View File

@ -101,6 +101,11 @@
++ nail ,[p=hair q=tape] :: parsing input ++ nail ,[p=hair q=tape] :: parsing input
++ numb ,@ :: just a number ++ numb ,@ :: just a number
++ pair |*([a=$+(* *) b=$+(* *)] ,[p=a q=b]) :: just a pair ++ pair |*([a=$+(* *) b=$+(* *)] ,[p=a q=b]) :: just a pair
++ wand |* a=(pole $+(* *)) :: hetero list
|= b=* ::
?~ a ~ ::
?@ b ~ ::
[i=(-.a -.b) t=$(a +.a, b +.b)] ::
++ pass ,@ :: public key ++ pass ,@ :: public key
++ path (list span) :: filesys location ++ path (list span) :: filesys location
++ pint ,[p=[p=@ q=@] q=[p=@ q=@]] :: line/column range ++ pint ,[p=[p=@ q=@] q=[p=@ q=@]] :: line/column range
@ -156,7 +161,12 @@
p=[p=tape q=tape r=tape] :: mid open close p=[p=tape q=tape r=tape] :: mid open close
q=(list tank) :: q=(list tank) ::
== :: == ::
== == ::
++ tanq :: modern tank
$? [~ p=(list tanq)] :: list of printables
[~ ~ p=tape] :: simple string
(pair ,@tas tanq) :: captioned
== ::
++ tape (list char) :: like a string ++ tape (list char) :: like a string
++ term ,@tas :: Hoon ASCII subset ++ term ,@tas :: Hoon ASCII subset
++ tiki :: test case ++ tiki :: test case
@ -227,8 +237,8 @@
[%cndt p=twig q=twig] :: %-(q p) [%cndt p=twig q=twig] :: %-(q p)
[%cnhp p=twig q=tusk] :: slam p w/ sample q [%cnhp p=twig q=tusk] :: slam p w/ sample q
[%cntr p=wing q=twig r=tram] :: pull p.q w/ changes [%cntr p=wing q=twig r=tram] :: pull p.q w/ changes
[%cnkt p=twig q=twig r=twig s=twig] :: slam p w/ %*(q r s) [%cnkt p=twig q=twig r=twig s=twig] :: slam p w/ :*(q r s)
[%cnls p=twig q=twig r=twig] :: slam p w/ %*(q r) [%cnls p=twig q=twig r=twig] :: slam p w/ :*(q r)
[%cnsg p=wing q=twig r=twig] :: pull p from q with r [%cnsg p=wing q=twig r=twig] :: pull p from q with r
[%cnts p=wing q=tram] :: eval. p w/ q changes [%cnts p=wing q=tram] :: eval. p w/ q changes
[%cnzy p=term] :: pulls limb p [%cnzy p=term] :: pulls limb p
@ -1151,6 +1161,30 @@
++ tos ~/ %tos :: fetch suffix ++ tos ~/ %tos :: fetch suffix
|=(a=@ ?>((lth a 256) (cut 3 [(mul 3 a) 3] sis))) |=(a=@ ?>((lth a 256) (cut 3 [(mul 3 a) 3] sis)))
-- --
::
++ fa :: base58check
=+ key='123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
=+ ^- yek=@ux ~+
=- yek:(roll (trip key) -)
|= [a=char b=@ yek=_`@ux`(fil 3 256 0xff)]
[+(b) (mix yek (lsh 3 `@u`a (~(inv fe 3) b)))]
|%
++ cha |=(a=char `(unit ,@uF)`=+(b=(cut 3 [`@`a 1] yek) ?:(=(b 0xff) ~ `b)))
++ tok
|= a=@ux ^- @ux
=+ b=(pad a)
=- (~(net fe 5) (end 3 4 (shay 32 -)))
(shay (add b (met 3 a)) (lsh 3 b (swap 3 a)))
::
++ pad |=(a=@ =+(b=(met 3 a) ?:((gte b 21) 0 (sub 21 b))))
++ enc |=(a=@ux `@ux`(mix (lsh 3 4 a) (tok a)))
++ den
|= a=@ux ^- (unit ,@ux)
=+ b=(rsh 3 4 a)
?. =((tok b) (end 3 4 a))
~
`b
--
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 2cF, signed and modular ints :: :: section 2cF, signed and modular ints ::
:: ::
@ -2061,8 +2095,8 @@
:: ::
+- get :: grab value by key +- get :: grab value by key
~/ %get ~/ %get
|* b=* |= b=*
|- ^- ?(~ [~ u=_?>(?=(^ a) q.n.a)]) ^- $|(~ [~ u=_?>(?=(^ a) q.n.a)])
?~ a ?~ a
~ ~
?: =(b p.n.a) ?: =(b p.n.a)
@ -2853,6 +2887,13 @@
:: section 2eI, parsing (external) :: :: section 2eI, parsing (external) ::
:: ::
++ rash |*([naf=@ sab=_rule] (scan (trip naf) sab)) :: ++ rash |*([naf=@ sab=_rule] (scan (trip naf) sab)) ::
++ rose |* [los=tape sab=_rule]
=+ vex=(sab [[1 1] los])
=+ len=(lent los)
?. =(+(len) q.p.vex) [%| p=(dec q.p.vex)]
?~ q.vex
[%& p=~]
[%& p=[~ u=p.u.q.vex]]
++ rush |*([naf=@ sab=_rule] (rust (trip naf) sab)) ++ rush |*([naf=@ sab=_rule] (rust (trip naf) sab))
++ rust |* [los=tape sab=_rule] ++ rust |* [los=tape sab=_rule]
=+ vex=((full sab) [[1 1] los]) =+ vex=((full sab) [[1 1] los])
@ -2956,6 +2997,7 @@
++ teff :: length utf8 ++ teff :: length utf8
|= a=@t ^- @ |= a=@t ^- @
=+ b=(end 3 1 a) =+ b=(end 3 1 a)
~| %bad-utf8
?: =(0 b) ?: =(0 b)
?>(=(0 a) 0) ?>(=(0 a) 0)
?> |((gte b 32) =(10 b)) ?> |((gte b 32) =(10 b))
@ -3211,6 +3253,7 @@
++ ab ++ ab
|% |%
++ bix (bass 16 (stun [2 2] six)) ++ bix (bass 16 (stun [2 2] six))
++ fem (sear |=(a=@ (cha:fa a)) aln)
++ hif (boss 256 ;~(plug tip tiq (easy ~))) ++ hif (boss 256 ;~(plug tip tiq (easy ~)))
++ huf %+ cook ++ huf %+ cook
|=([a=@ b=@] (wred:un ~(zug mu ~(zag mu [a b])))) |=([a=@ b=@] (wred:un ~(zug mu ~(zag mu [a b]))))
@ -3265,11 +3308,15 @@
++ dim (ape (bass 10 ;~(plug sed:ab (star sid:ab)))) ++ dim (ape (bass 10 ;~(plug sed:ab (star sid:ab))))
++ dum (bass 10 (plus sid:ab)) ++ dum (bass 10 (plus sid:ab))
++ fed ;~ pose ++ fed ;~ pose
(bass 0x1.0000.0000.0000.0000 (most doh hyf:ab)) %+ bass 0x1.0000.0000.0000.0000
;~((glue doh) ;~(pose hyf:ab huf:ab) (more doh hyf:ab))
::
hyf:ab
huf:ab huf:ab
hif:ab hif:ab
tiq:ab tiq:ab
== ==
++ fim (sear den:fa (bass 58 (plus fem:ab)))
++ hex (ape (bass 0x1.0000 ;~(plug qex:ab (star ;~(pfix dog qix:ab))))) ++ hex (ape (bass 0x1.0000 ;~(plug qex:ab (star ;~(pfix dog qix:ab)))))
++ lip =+ tod=(ape ted:ab) ++ lip =+ tod=(ape ted:ab)
(bass 256 ;~(plug tod (stun [3 3] ;~(pfix dog tod)))) (bass 256 ;~(plug tod (stun [3 3] ;~(pfix dog tod))))
@ -3352,12 +3399,13 @@
(trip (tod:po (rsh 3 1 q.p.lot))) (trip (tod:po (rsh 3 1 q.p.lot)))
rex rex
== ==
=+ [dyz=(met 5 q.p.lot) fin=|] =+ [dyz=(met 5 q.p.lot) fin=| dub=&]
|- ^- tape |- ^- tape
?: =(0 dyz) ?: =(0 dyz)
rex rex
%= $ %= $
fin & fin &
dub !dub
dyz (dec dyz) dyz (dec dyz)
q.p.lot (rsh 5 1 q.p.lot) q.p.lot (rsh 5 1 q.p.lot)
rex rex
@ -3369,7 +3417,7 @@
`tape`['-' ~] `tape`['-' ~]
(trip (tos:po (end 3 1 q.cog))) (trip (tos:po (end 3 1 q.cog)))
(trip (tod:po (rsh 3 1 q.cog))) (trip (tod:po (rsh 3 1 q.cog)))
`tape`?:(fin ['-' ?:(=(1 (end 0 1 dyz)) ~ ['-' ~])] ~) `tape`?.(fin ~ ['-' ?.(dub ~ ['-' ~])])
rex rex
== ==
== ==
@ -3387,6 +3435,9 @@
== ==
:: ::
%u %u
?: ?=(%c hay)
%+ welp ['0' 'c' (reap (pad:fa q.p.lot) '1')]
(c-co (enc:fa q.p.lot))
=- (weld p.gam ?:(=(0 q.p.lot) `tape`['0' ~] q.gam)) =- (weld p.gam ?:(=(0 q.p.lot) `tape`['0' ~] q.gam))
^= gam ^- [p=tape q=tape] ^= gam ^- [p=tape q=tape]
?+ hay [~ ((ox-co [10 3] |=(a=@ ~(d ne a))) q.p.lot)] ?+ hay [~ ((ox-co [10 3] |=(a=@ ~(d ne a))) q.p.lot)]
@ -3413,6 +3464,7 @@
=+ rex=*tape =+ rex=*tape
=< |% =< |%
++ a-co |=(dat=@ ((d-co 1) dat)) ++ a-co |=(dat=@ ((d-co 1) dat))
++ c-co (em-co [58 1] |=([? b=@ c=tape] [~(c ne b) c]))
++ d-co |=(min=@ (em-co [10 min] |=([? b=@ c=tape] [~(d ne b) c]))) ++ d-co |=(min=@ (em-co [10 min] |=([? b=@ c=tape] [~(d ne b) c])))
++ r-co ++ r-co
|= [syn=? nub=@ der=@ ign=(unit tape) ne=?] |= [syn=? nub=@ der=@ ign=(unit tape) ne=?]
@ -3477,6 +3529,7 @@
:: ::
++ ne ++ ne
|_ tig=@ |_ tig=@
++ c (cut 3 [tig 1] key:fa)
++ d (add tig '0') ++ d (add tig '0')
++ x ?:((gte tig 10) (add tig 87) d) ++ x ?:((gte tig 10) (add tig 87) d)
++ v ?:((gte tig 10) (add tig 87) d) ++ v ?:((gte tig 10) (add tig 87) d)
@ -3498,6 +3551,7 @@
;~ pfix (just '0') ;~ pfix (just '0')
;~ pose ;~ pose
(stag %ub ;~(pfix (just 'b') bay:ag)) (stag %ub ;~(pfix (just 'b') bay:ag))
(stag %uc ;~(pfix (just 'c') fim:ag))
(stag %ui ;~(pfix (just 'i') dim:ag)) (stag %ui ;~(pfix (just 'i') dim:ag))
(stag %ux ;~(pfix (just 'x') hex:ag)) (stag %ux ;~(pfix (just 'x') hex:ag))
(stag %uv ;~(pfix (just 'v') viz:ag)) (stag %uv ;~(pfix (just 'v') viz:ag))
@ -3668,437 +3722,7 @@
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 2eM, regular-expressions :: :: section 2eM, regular-expressions ::
:: ::
++ pars
|= [a=tape] :: parse tape to rege
^- (unit rege)
=+ foo=((full apex:rags) [[1 1] a])
?~ q.foo
~
[~ p.u.q.foo]
::
++ rags :: rege parsers
=> |%
++ nor ;~(less (mask "^$()|*?+.[\\") (shim 1 127)) :: non-control char
++ les ;~(less bas asp) :: not backslash
++ lep ;~(less (mask "-^[]\\") asp) :: charset non-control
++ asp (shim 32 126) :: printable ascii
++ alb ;~(less ser asp) :: charset literal char
++ mis ;~(less aln asp) :: non alphanumeric
--
|%
++ apex :: top level
%+ knee *rege |. ~+
;~ pose
;~((bend |=(a=[rege rege] (some [%eith a]))) mall ;~(pfix bar apex))
(stag %eith ;~(plug (easy %empt) ;~(pfix bar apex)))
(easy %empt)
==
::
++ mall
%+ knee *rege |. ~+
;~((bend |=(a=[rege rege] (some [%pair a]))) bets mall)
::
++ bets
%+ knee *rege |. ~+
|= tub=nail
=+ vex=(chun tub)
?~ q.vex
vex
=+ a=p.u.q.vex
%- ;~ pose
(cold [%eith %empt a] (jest '??'))
(cold [%manl a] (jest '*?'))
(cold [%plll a] (jest '+?'))
(cold [%eith a %empt] wut)
(cold [%mant a] tar)
(cold [%plls a] lus)
(stag %betl ;~(plug (easy a) ;~(sfix rang wut)))
(stag %betw ;~(plug (easy a) rang))
(stag %binl ;~(plug (easy a) (ifix [kel (jest ',}?')] dim:ag)))
(stag %bant ;~(plug (easy a) (ifix [kel (jest '}?')] dim:ag)))
(stag %bant ;~(plug (easy a) (ifix [kel ker] dim:ag)))
(stag %bint ;~(plug (easy a) (ifix [kel (jest ',}')] dim:ag)))
(easy a)
==
q.u.q.vex
::
++ ranc
|= [a=@ b=@]
^- @
?:((gth a b) 0 (con (bex a) $(a +(a))))
::
++ flap |=(a=@ (mix a (dec (bex 256))))
::
++ rang
%+ sear |=([a=@ b=@] ?:((lte a b) (some [a b]) ~))
(ifix [kel ker] ;~(plug dim:ag ;~(pfix com dim:ag)))
::
++ chun
%+ knee *rege |. ~+
;~ pose
(cold %ende buc)
(cold %sart ket)
(cold %dote dot)
%+ cook |=(a=(list char) (reel a |=([p=char q=rege] [%pair [%lite p] q])))
;~(pfix (jest '\\Q') cape)
|= tub=nail
=+ foo=;~(plug kel dim:ag ;~(pose ker (jest ',}') ;~(plug com dim:ag ker)))
=+ bar=(foo tub)
?~(q.bar (chad tub) (fail tub))
(cook |=([a=rege] [%capt a 0]) (ifix [pel per] apex))
%+ cook |=([a=rege] [%capt a 0])
(ifix [;~(plug (jest '(?P<') (plus aln) gar) per] apex)
(ifix [(jest '(?:') per] apex)
(stag %brac ;~(pfix sel seac))
==
::
++ seac
|= tub=nail
?~ q.tub
(fail tub)
?: =(i.q.tub '^')
(;~(pfix ket (cook flap sead)) tub)
(sead tub)
::
++ sead
%+ knee *@ |. ~+
;~ pose
|= tub=nail
?~ q.tub
(fail tub)
?. =(i.q.tub ']')
(fail tub)
?~ t.q.tub
(fail tub)
?: =(i.t.q.tub '-')
?~ t.t.q.tub
(fail tub)
?: =(i.t.t.q.tub ']')
(;~(pfix ser (cook |=(a=@ (con (bex ']') a)) sade)) tub)
(fail tub)
(;~(pfix ser (cook |=(a=@ (con (bex ']') a)) sade)) tub)
|= tub=nail
?~ q.tub
(fail tub)
?. =(i.q.tub '-')
(fail tub)
?~ t.q.tub
(fail tub)
?: =(i.t.q.tub '-')
?~ t.t.q.tub
(fail tub)
?: =(i.t.t.q.tub ']')
(;~(pfix hep (cook |=(a=@ (con (bex '-') a)) sade)) tub)
(fail tub)
(;~(pfix hep (cook |=(a=@ (con (bex '-') a)) sade)) tub)
(cook |=(a=[@ @] (con a)) ;~(plug seap sade))
==
::
++ sade
%+ knee *@ |. ~+
;~ pose
(cold (bex '-') (jest '-]'))
(cold 0 ser)
(cook |=([p=@ q=@] `@`(con p q)) ;~(plug seap sade))
==
::
++ seap
%+ knee *@ |. ~+
;~ pose
unid
%+ ifix (jest '[:')^(jest ':]')
;~(pose ;~(pfix ket (cook flap chas)) chas)
%+ sear |=([a=@ b=@] ?:((gth a b) ~ (some (ranc a b))))
;~(plug asp ;~(pfix hep alb))
|= tub=nail
?~ q.tub
(fail tub)
?~ t.q.tub
((cook bex les) tub)
?. =(i.t.q.tub '-')
((cook bex les) tub)
?~ t.t.q.tub
((cook bex les) tub)
?: =(i.t.t.q.tub ']')
((cook bex les) tub)
(fail tub)
;~(pfix bas escd)
==
::
++ cape
%+ knee *tape |. ~+
;~ pose
(cold ~ (jest '\\E'))
;~(plug next cape)
(cook |=(a=char (tape [a ~])) next)
(full (easy ~))
==
++ chas :: ascii character set
=- (sear ~(get by -) sym)
%- mo ^- (list ,[@tas @I])
:~ alnum/alnum alpha/alpha ascii/ascii blank/blank cntrl/cntrl
digit/digit graph/graph lower/lower print/print punct/punct
space/space upper/upper word/wordc xdigit/xdigit
==
:: Character sets
++ alnum :(con lower upper digit)
++ alpha :(con lower upper)
++ ascii (ranc 0 127)
++ blank (con (bex 32) (bex 9))
++ cntrl :(con (ranc 0 31) (bex 127))
++ digit (ranc '0' '9')
++ graph (ranc 33 126)
++ lower (ranc 'a' 'z')
++ print (ranc 32 126)
++ punct ;: con
(ranc '!' '/')
(ranc ':' '@')
(ranc '[' '`')
(ranc '{' '~')
==
++ space :(con (ranc 9 13) (bex ' '))
++ upper (ranc 'A' 'Z')
++ white :(con (bex ' ') (ranc 9 10) (ranc 12 13))
++ wordc :(con digit lower upper (bex '_'))
++ xdigit :(con (ranc 'a' 'f') (ranc 'A' 'F') digit)
::
++ chad
%+ knee *rege |. ~+
;~(pose (stag %lite nor) (stag %brac unid) ;~(pfix bas escp))
::
++ escd
%+ cook bex
;~ pose
(cold 0 (just '0'))
(sear ~(get by (mo a/7 t/9 n/10 v/11 f/12 r/13 ~)) low)
(sear |=(a=@ ?:((lth a 256) (some a) ~)) (bass 8 (stun [2 3] cit)))
;~(pfix (just 'x') (bass 16 (stun [2 2] hit)))
(ifix [(jest 'x{') ker] (bass 16 (stun [2 2] hit)))
mis
==
::
++ escp
;~ pose
(stag %lite escd)
(sear ~(get by (mo b/%boun w/[%brac wordc] z/%ende ~)) low)
=- (sear ~(get by (mo -)) hig)
~['A'^%sart 'B'^%bout 'C'^%dote 'Q'^%empt 'W'^[%brac (flap wordc)]]
==
::
++ unid
=+ cha=~(get by (mo d/digit s/white w/wordc ~))
;~ pfix bas
;~ pose
(sear cha low)
(cook flap (sear |=(a=@ (cha (add a 32))) hig))
== ==
--
::
++ ra :: regex engine
|_ a=rege
++ proc :: capture numbering
|= b=@
=- -(+ +>.$(a a))
^- [p=@ a=rege]
?- a
[%capt *] =+ foo=$(a p.a, b +(b))
[p.foo [%capt a.foo b]]
[%eith *] =+ foo=$(a p.a)
=+ bar=$(a q.a, b p.foo)
[p.bar [%eith a.foo a.bar]]
[%pair *] =+ foo=$(a p.a)
=+ bar=$(a q.a, b p.foo)
[p.bar [%pair a.foo a.bar]]
[%manl *] =+ foo=$(a p.a)
[p.foo [%manl a.foo]]
[%plll *] =+ foo=$(a p.a)
[p.foo [%plll a.foo]]
[%binl *] =+ foo=$(a p.a)
[p.foo [%binl a.foo q.a]]
[%betl *] =+ foo=$(a p.a)
[p.foo [%betl a.foo q.a r.a]]
[%mant *] =+ foo=$(a p.a)
[p.foo [%mant a.foo]]
[%plls *] =+ foo=$(a p.a)
[p.foo [%plls a.foo]]
[%bant *] =+ foo=$(a p.a)
[p.foo [%bant a.foo q.a]]
[%bint *] =+ foo=$(a p.a)
[p.foo [%bint a.foo q.a]]
[%betw *] =+ foo=$(a p.a)
[p.foo [%betw a.foo q.a r.a]]
* [b a]
==
::
++ cont
|= [a=(map ,@u tape) b=(map ,@u tape)]
(~(gas by *(map ,@u tape)) (weld (~(tap by a)) (~(tap by b))))
::
++ abor
|= [a=char b=(unit ,[tape (map ,@u tape)])]
^- (unit ,[tape (map ,@u tape)])
?~ b
b
[~ [[a -.u.b] +.u.b]]
::
++ matc
|= [b=tape c=tape]
^- (unit (map ,@u tape))
=+ foo=`(unit ,[tape (map ,@u tape)])`(deep b %empt c)
(bind foo |*(a=^ (~(put by +.a) 0 -.a)))
::
++ chet
|= [b=(unit ,[tape (map ,@u tape)]) c=tape d=tape]
^- (unit ,[tape (map ,@u tape)])
?~ b
b
?~ -.u.b
b
=+ bar=(deep (slag (lent -.u.b) c) %empt d)
?~ bar
bar
b
++ blak (some ["" *(map ,@u tape)])
++ word |=(a=char =((dis wordc:rags (bex a)) 0))
++ deep
|= [b=tape c=rege d=tape]
^- (unit ,[tape (map ,@u tape)])
?- a
%dote ?~(b ~ (some [[i.b ~] *(map ,@u tape)]))
%ende ?~(b blak ~)
%sart ?:(=(b d) blak ~)
%empt blak
%boun =+ ^= luc
?: =(b d)
&
=+ foo=(slag (dec (sub (lent d) (lent b))) d)
(word -.foo)
=+ cuc=?~(b & (word -.b))
?:(!=(luc cuc) blak ~)
%bout =+ ^= luc
?: =(b d)
&
=+ foo=(slag (dec (sub (lent d) (lent b))) d)
(word -.foo)
=+ cuc=?~(b & (word -.b))
?:(=(luc cuc) blak ~)
[%capt *] =+ foo=$(a p.a)
?~ foo
foo
=+ ft=u.foo
=+ bar=$(a c, b (slag (lent -.ft) b), c %empt)
?~ bar
bar
[~ [-.ft (~(put by +.ft) q.a -.ft)]]
[%lite *] ?~(b ~ ?:(=(i.b p.a) (some [[i.b ~] *(map ,@u tape)]) ~))
[%brac *] ?~ b
~
?. =((dis (bex `@`i.b) p.a) 0)
(some [[i.b ~] *(map ,@u tape)])
~
[%eith *] =+ foo=(chet(a c) $(a p.a) b d)
=+ bar=(chet(a c) $(a q.a) b d)
?~ foo
bar
?~ bar
foo
=+ ft=u.foo
=+ bt=u.bar
?: (gte (lent -.ft) (lent -.bt))
foo
bar
[%pair *] =+ foo=$(a p.a, c [%pair q.a c])
?~ foo
foo
=+ ft=u.foo
=+ bar=$(a q.a, b (slag (lent -.ft) b))
?~ bar
bar
=+ bt=u.bar
[~ [(weld -.ft -.bt) (cont +.ft +.bt)]]
[%manl *] =+ foo=$(a p.a)
?~ foo
blak
?~ -.u.foo
blak
$(a [%eith %empt [%pair p.a [%eith %empt a]]])
[%mant *] =+ foo=$(a p.a)
?~ foo
blak
=+ ft=u.foo
?~ -.ft
blak
$(a [%eith [%pair p.a [%eith a %empt]] %empt])
[%plls *] $(a [%pair p.a [%mant p.a]])
[%plll *] $(a [%pair p.a [%manl p.a]])
[%binl *] =+ min=?:(=(q.a 0) 0 (dec q.a))
?: =(q.a 0)
$(a [%manl p.a])
$(a [%pair p.a [%binl p.a min]])
[%bant *] ?: =(0 q.a)
blak
$(a [%pair p.a [%bant p.a (dec q.a)]])
[%bint *] =+ min=?:(=(q.a 0) 0 (dec q.a))
?: =(q.a 0)
$(a [%mant p.a])
$(a [%pair p.a [%bint p.a min]])
[%betw *] ?: =(0 r.a)
blak
?: =(q.a 0)
$(a [%eith [%pair p.a [%betw p.a 0 (dec r.a)]] %empt])
$(a [%pair p.a [%betw p.a (dec q.a) (dec r.a)]])
[%betl *] ?: =(0 r.a)
blak
?: =(q.a 0)
$(a [%eith %empt [%pair p.a [%betl p.a 0 (dec r.a)]]])
$(a [%pair p.a [%betl p.a (dec q.a) (dec r.a)]])
==
--
::
++ rexp :: Regex match
~/ %rexp
|= [a=tape b=tape]
^- (unit (unit (map ,@u tape)))
=+ ^= bar
|= [a=@ b=(map ,@u tape)]
?: =(a 0)
b
=+ c=(~(get by b) a)
?~ c
$(a (dec a), b (~(put by b) a ""))
$(a (dec a))
=+ par=(pars a)
?~ par ~
=+ poc=(~(proc ra u.par) 1)
=+ c=b
|-
=+ foo=(matc:poc c b)
?~ foo
?~ c
[~ ~]
$(c t.c)
[~ [~ (bar (dec p.poc) u.foo)]]
::
++ repg :: Global regex replace
~/ %repg
|= [a=tape b=tape c=tape]
^- (unit tape)
=+ par=(pars a)
?~ par ~
=+ poc=(~(proc ra u.par) 1)
=+ d=b
:- ~
|-
^- tape
=+ foo=(matc:poc d b)
?~ foo
?~ d
~
[i.d $(d t.d)]
=+ ft=(need (~(get by u.foo) 0))
?~ d
c
(weld c $(d `tape`(slag (lent ft) `tape`d)))
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 2eN, pseudo-cryptography :: :: section 2eN, pseudo-cryptography ::
:: ::
@ -5332,10 +4956,16 @@
++ shax :: sha-256 ++ shax :: sha-256
~/ %shax ~/ %shax
|= ruz=@ ^- @ |= ruz=@ ^- @
(shay [(met 3 ruz) ruz])
::
++ shay :: sha-256 with length
~/ %shay
|= [len=@u ruz=@] ^- @
~| %sha ~| %sha
=> .(ruz (cut 3 [0 len] ruz))
=+ [few==>(fe .(a 5)) wac=|=([a=@ b=@] (cut 5 [a 1] b))] =+ [few==>(fe .(a 5)) wac=|=([a=@ b=@] (cut 5 [a 1] b))]
=+ [sum=sum.few ror=ror.few net=net.few inv=inv.few] =+ [sum=sum.few ror=ror.few net=net.few inv=inv.few]
=+ ral=(lsh 0 3 (met 3 ruz)) =+ ral=(lsh 0 3 len)
=+ ^= ful =+ ^= ful
%+ can 0 %+ can 0
:~ [ral ruz] :~ [ral ruz]
@ -6076,8 +5706,9 @@
:: ::
++ seed :: hoon/hoon core vase ++ seed :: hoon/hoon core vase
^- vase ^- vase
~+ !!
!;(*type ..seed) :: ~+ :: trimmed
:: !;(*type ..seed)
:: ::
++ seem |=(toy=typo `type`toy) :: promote typo ++ seem |=(toy=typo `type`toy) :: promote typo
++ seer |=(vix=vise `vase`vix) :: promote vise ++ seer |=(vix=vise `vase`vix) :: promote vise
@ -6174,7 +5805,9 @@
|= [sut=type ref=type] |= [sut=type ref=type]
^- [? worm] ^- [? worm]
?: (~(has in nes) [sut ref]) [& +>+<] ?: (~(has in nes) [sut ref]) [& +>+<]
?. (~(nest ut sut) | ref) [| +>+<] ?. (~(nest ut sut) | ref)
:: ~& %nest-failed
[| +>+<]
[& +>+<(nes (~(put in nes) [sut ref]))] [& +>+<(nes (~(put in nes) [sut ref]))]
:: ::
++ nets :: typeless nest ++ nets :: typeless nest
@ -6183,6 +5816,14 @@
?: (~(has in nes) [sut ref]) [& +>+<] ?: (~(has in nes) [sut ref]) [& +>+<]
=+ gat=|=([a=type b=type] (~(nest ut a) | b)) =+ gat=|=([a=type b=type] (~(nest ut a) | b))
?. (,? .*(gat(+< [sut ref]) -.gat)) ?. (,? .*(gat(+< [sut ref]) -.gat))
:: ~& %nets-failed
:: =+ tag=`*`skol
:: =+ foo=(tank .*(tag(+< ref) -.tag))
:: =+ bar=(skol sut)
:: ~& %nets-need
:: ~> %slog.[0 bar]
:: ~& %nets-have
:: ~> %slog.[0 foo]
[| +>+<.$] [| +>+<.$]
[& +>+<.$(nes (~(put in nes) [sut ref]))] [& +>+<.$(nes (~(put in nes) [sut ref]))]
:: ::
@ -6467,12 +6108,13 @@
++ hock ++ hock
|- ^- toga |- ^- toga
?- gen ?- gen
[^ *] [%2 $(gen p.gen) $(gen q.gen)]
[%cnts [@ ~] ~] i.p.gen [%cnts [@ ~] ~] i.p.gen
[%cnzy @] p.gen [%cnzy @] p.gen
[%cnzz [@ ~]] i.p.gen [%cnzz [@ ~]] i.p.gen
[%zpcb *] $(gen q.gen) [%zpcb *] $(gen q.gen)
* =+(neg=open ?:(=(gen neg) [%0 ~] $(gen neg))) [@ *] =+(neg=open ?:(=(gen neg) [%0 ~] $(gen neg)))
[^ *] =+ toe=[$(gen p.gen) $(gen q.gen)]
?:(=(toe [[%0 ~] [%0 ~]]) [%0 ~] [%2 toe])
== ==
:: ::
++ open ++ open
@ -6522,7 +6164,13 @@
[i.p.gen $(p.gen t.p.gen)] [i.p.gen $(p.gen t.p.gen)]
:: ::
[%cncb *] [%ktls [%cnzz p.gen] %cnts p.gen q.gen] [%cncb *] [%ktls [%cnzz p.gen] %cnts p.gen q.gen]
[%cncl *] [%cnsg [%$ ~] p.gen q.gen] [%cncl *]
=+ rem=[%cnsg [%$ ~] p.gen q.gen]
?. ?=([%zpcb ^ %cnzz @ ~] p.gen) rem
=> .(p.gen `[@ ^ @ p=@tas ~]`p.gen)
:+ %sgzp [[%dtzz %tas 'slam'] [%dtzz %tas p.p.gen]]
rem
::
[%cndt *] [%cnhp q.gen [p.gen ~]] [%cndt *] [%cnhp q.gen [p.gen ~]]
[%cnkt *] [%cnhp p.gen q.gen r.gen s.gen ~] [%cnkt *] [%cnhp p.gen q.gen r.gen s.gen ~]
[%cnls *] [%cnhp p.gen q.gen r.gen ~] [%cnls *] [%cnhp p.gen q.gen r.gen ~]
@ -7101,9 +6749,7 @@
[[%leaf (rip 3 -.lum)] $(lum +.lum)] [[%leaf (rip 3 -.lum)] $(lum +.lum)]
:: ::
%type %type
=+ reb=(slap [p:!>(.) .(sut lum)] %cnzy %duck) =+ cis=((hard tank) .*(.(sut lum) !=(duck))) :: type bypass
=+ cis=(tank q.reb)
?. =(cis q.reb) ~
:^ ~ %palm :^ ~ %palm
[~ ~ ~ ~] [~ ~ ~ ~]
[[%leaf '#' 't' '/' ~] cis ~] [[%leaf '#' 't' '/' ~] cis ~]
@ -7137,7 +6783,8 @@
~ ~
:+ ~ :+ ~
%leaf %leaf
?+ p.q.ham ~(rend co [~ p.q.ham lum]) ?+ (rash p.q.ham ;~(sfix (cook crip (star low)) (star hig)))
~(rend co [~ p.q.ham lum])
%$ ~(rend co [~ %ud lum]) %$ ~(rend co [~ %ud lum])
%t (dash (rip 3 lum) '\'') %t (dash (rip 3 lum) '\'')
%tas ['%' ?.(=(0 lum) (rip 3 lum) ['$' ~])] %tas ['%' ?.(=(0 lum) (rip 3 lum) ['$' ~])]
@ -8540,10 +8187,12 @@
?: (~(has in was) u.rev) ?: (~(has in was) u.rev)
~|(%pray-loop !!) ~|(%pray-loop !!)
=+ ruv=`path`(weld u.rev `path`[%hoon ~]) =+ ruv=`path`(weld u.rev `path`[%hoon ~])
=+ txt=(,@ta .^(%cx ruv)) ~& [%pray-disabled ruv]
~| ruv !!
%+ rash txt :: =+ txt=(,@ta .^(%cx ruv))
(ifix [gay gay] tall(was (~(put in was) u.rev), wer u.rev)) :: ~| ruv
:: %+ rash txt
:: (ifix [gay gay] tall(was (~(put in was) u.rev), wer u.rev, bug |))
:: ::
++ prey ++ prey
|= gun=(list twig) ^- (unit twig) |= gun=(list twig) ^- (unit twig)
@ -8878,7 +8527,7 @@
;~ pose ;~ pose
(stag %wtzp ;~(pfix zap wide)) (stag %wtzp ;~(pfix zap wide))
(stag %zpzp (cold ~ ;~(plug zap zap))) (stag %zpzp (cold ~ ;~(plug zap zap)))
(stag %zpcn (cold ~ ;~(plug zap cen))) :: (stag %zpcn (cold ~ ;~(plug zap cen)))
== ==
:- '$' :- '$'
rump rump
@ -8955,23 +8604,7 @@
(stag %bccm ;~(pfix com hill)) (stag %bccm ;~(pfix com hill))
:- '^' :- '^'
;~ pose ;~ pose
;~ pfix ket
;~ pose
;~ pfix col
%+ sear
|= [a=tile b=twig] :: XX shd be static
=+ rev=(plex b)
?~ rev ~
%- some
:+ %smsm a
[%dtkt %dtzz %$ %cx u.rev]
;~(plug hill rood)
==
(sear prey (most ket rood))
==
==
(stag %cnzz rope) (stag %cnzz rope)
(stag %bczp (cold %cell ket))
== ==
:- '`' :- '`'
;~ pfix tec ;~ pfix tec
@ -8984,8 +8617,6 @@
(cook |=(a=twig [[%dtzz %n ~] a]) wide) (cook |=(a=twig [[%dtzz %n ~] a]) wide)
== ==
== ==
:- '#'
;~(pfix hax rupl)
:- '"' :- '"'
%+ cook %+ cook
|= a=(list (list beer)) |= a=(list (list beer))
@ -9114,10 +8745,10 @@
;~ pfix bar ;~ pfix bar
%- stew %- stew
^. stet ^. limo ^. stet ^. limo
:~ ['_' (rune cab %brcb expu)] :~ ['_' (rune cab %brcb expv)]
['%' (rune cen %brcn expe)] ['%' (rune cen %brcn expe)]
['.' (rune dot %brdt expa)] ['.' (rune dot %brdt expa)]
['/' (rune fas %brfs expu)] ['/' (rune fas %brfs expv)]
['-' (rune hep %brhp expa)] ['-' (rune hep %brhp expa)]
['^' (rune ket %brkt expr)] ['^' (rune ket %brkt expr)]
['+' (rune lus %brls expo)] ['+' (rune lus %brls expo)]
@ -9143,7 +8774,15 @@
== ==
:- '$' :- '$'
;~ pose ;~ pose
(rune com %bccm expv) ;~ pfix buc
%- stew
^. stet ^. limo
:~
[',' (rune com %bccm expt)]
['*' (rune tar %bctr expt)]
['@' (rune pat %bcpt expu)]
==
==
(stag %bccm (noil tol)) (stag %bccm (noil tol))
== ==
:- ':' :- ':'
@ -9372,9 +9011,9 @@
++ expq |.(;~(gunk rope loaf loaf)) :: wing and two twigs ++ expq |.(;~(gunk rope loaf loaf)) :: wing and two twigs
++ expr |.(;~(gunk loaf wisp)) :: twig and core tail ++ expr |.(;~(gunk loaf wisp)) :: twig and core tail
++ exps |.((butt hank)) :: closed gapped twigs ++ exps |.((butt hank)) :: closed gapped twigs
:: expt ++ expt |.(lobe) :: tile
++ expu |.(;~(gunk lobe wisp)) :: tile, core tail ++ expu |.(;~(gunk rope lobe)) :: wing and tile
++ expv |.(lobe) :: tile ++ expv |.(;~(gunk lobe wisp)) :: tile, core tail
++ expw |.(;~(gunk lobe teak)) :: tile and tiki ++ expw |.(;~(gunk lobe teak)) :: tile and tiki
++ expx |.((butt ;~(gunk teak race))) :: tiki, [tile twig]s ++ expx |.((butt ;~(gunk teak race))) :: tiki, [tile twig]s
++ expy |.((butt ;~(gunk teak loaf race))) :: tiki twig [tile twig]s ++ expy |.((butt ;~(gunk teak loaf race))) :: tiki twig [tile twig]s
@ -9440,11 +9079,12 @@
== ==
^- (unit twig) ^- (unit twig)
?- -.vil ?- -.vil
%tis [~ %ktts ~(hock ap ros) p.vil]
%col [~ %tsgl ros p.vil] %col [~ %tsgl ros p.vil]
%pel [~ %cnts ~(rake ap ros) p.vil] %pel [~ %cnts ~(rake ap ros) p.vil]
%pat [~ %bcpt ~(rake ap ros) p.vil] %pat [~ %bcpt ~(rake ap ros) p.vil]
%ket [~ ros p.vil] %ket [~ ros p.vil]
%tis =+ tog=~(hock ap ros)
?:(=([%0 ~] tog) ~ [~ %ktts tog p.vil])
== ==
:: ::
++ long ++ long
@ -10198,13 +9838,12 @@
|- ^- [p=(list ovum) q=(pair worm (list ,[p=@tas q=vase]))] |- ^- [p=(list ovum) q=(pair worm (list ,[p=@tas q=vase]))]
?~ mor [(flop ova) niz] ?~ mor [(flop ova) niz]
=^ nyx niz (jack lac i.mor) =^ nyx niz (jack lac i.mor)
$(ova (weld p.nyx ova), mor (weld q.nyx t.mor)) $(ova (weld p.nyx ova), mor (weld t.mor q.nyx))
-- --
-- --
:::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::: :::::: Postface :::::: :::::: :::::: Postface ::::::
:::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::
!:
~& %post-start ~& %post-start
=+ pit=`vase`!>(.) :: =+ pit=`vase`!>(.) ::
=+ bud=pit :: becomes tang =+ bud=pit :: becomes tang

View File

@ -509,8 +509,7 @@
:: ::
++ moon :: mime type to text ++ moon :: mime type to text
|= myn=mite |= myn=mite
%+ rap %- crip
3
|- ^- tape |- ^- tape
?~ myn ~ ?~ myn ~
?: =(~ t.myn) (trip i.myn) ?: =(~ t.myn) (trip i.myn)
@ -632,7 +631,7 @@
:: ::
++ poxo :: node to tape ++ poxo :: node to tape
=< |=(a=manx `tape`(apex a ~)) =< |=(a=manx `tape`(apex a ~))
|_ unq=_`?`| |_ _[unq=`?`| cot=`?`|] :: self-close all tags
++ apex :: top level ++ apex :: top level
|= [mex=manx rez=tape] |= [mex=manx rez=tape]
^- tape ^- tape
@ -646,8 +645,8 @@
%+ welp tam %+ welp tam
=- ?~(att rez [' ' (attr att rez)]) =- ?~(att rez [' ' (attr att rez)])
^- rez=tape ^- rez=tape
::?~ c.mex ?: &(?=(~ c.mex) |(cot (clot man)))
:: [' ' '/' '>' rez] [' ' '/' '>' rez]
:- '>' :- '>'
(many c.mex :(weld "</" tam ">" rez)) (many c.mex :(weld "</" tam ">" rez))
:: :: :: ::
@ -681,16 +680,23 @@
== ==
== ==
:: ::
++ name :: name to tape
|= man=mane ^- tape
?@ man (trip man)
(weld (trip -.man) `tape`[':' (trip +.man)])
::
++ many :: nodelist to tape ++ many :: nodelist to tape
|= [lix=(list manx) rez=tape] |= [lix=(list manx) rez=tape]
|- ^- tape |- ^- tape
?~ lix rez ?~ lix rez
(apex i.lix $(lix t.lix)) (apex i.lix $(lix t.lix))
::
++ name :: name to tape
|= man=mane ^- tape
?@ man (trip man)
(weld (trip -.man) `tape`[':' (trip +.man)])
::
++ clot ~+ :: self-closing tags
%~ has in
%- sa ^- (list term) :~
%area %base %br %col %command %embed %hr %img %input %keygen
%link %meta %param %source %track %wbr
==
-- --
:: ::
++ poxa :: xml parser ++ poxa :: xml parser
@ -1100,14 +1106,15 @@
?~ rax ?~ rax
[~ ~] [~ ~]
?^ t.rax ?^ t.rax
[p.pok [i.rax q.pok]]:[pok=$(rax t.rax) .] [p.pok [ire q.pok]]:[pok=$(rax t.rax) ire=i.rax]
=+ ^- raf=(like tape) =+ ^- raf=(like tape)
%. [1^1 (flop (trip i.rax))] %. [1^1 (flop (trip i.rax))]
;~(sfix (plus ;~(less dot next)) dot) ;~(sfix (star ;~(less dot next)) dot)
?~ q.raf ?~ q.raf
[~ [i.rax ~]] [~ [i.rax ~]]
=+ `[ext=tape [@ @] fyl=tape]`u.q.raf =+ `[ext=tape [@ @] fyl=tape]`u.q.raf
[[~ (crip (flop ext))] [(crip (flop fyl)) ~]] :- ?:(=(~ ext) ~ [~ (crip (flop ext))])
?:(=(~ fyl) ~ [(crip (flop fyl)) ~])
:: ::
++ fuel :: parse fcgi ++ fuel :: parse fcgi
|= [bem=beam but=path] |= [bem=beam but=path]
@ -1116,17 +1123,11 @@
=+ dyb=(slay i.t.but) =+ dyb=(slay i.t.but)
?> ?& ?=([~ %many *] dyb) ?> ?& ?=([~ %many *] dyb)
?=([* * *] p.u.dyb) ?=([* * *] p.u.dyb)
:: ?=([%$ %tas *] i.p.u.dyb) ?=([%$ %ta *] i.p.u.dyb)
?=([%many *] i.p.u.dyb)
?=([%blob *] i.t.p.u.dyb) ?=([%blob *] i.t.p.u.dyb)
== ==
=+ ced=((hard cred) p.i.t.p.u.dyb) =+ ced=((hard cred) p.i.t.p.u.dyb)
:: =+ nep=q.p.i.p.u.dyb :: =+ nep=q.p.i.p.u.dyb
=+ ^= nyp ^- path
%+ turn p.i.p.u.dyb
|= a=coin ^- @ta
?> ?=([%$ %ta @] a)
?>(((sane %ta) q.p.a) q.p.a)
=+ ^= gut ^- (list ,@t) =+ ^= gut ^- (list ,@t)
%+ turn t.t.p.u.dyb %+ turn t.t.p.u.dyb
|= a=coin ^- @t |= a=coin ^- @t
@ -1141,7 +1142,6 @@
ced ced
bem bem
t.t.but t.t.but
nyp
== ==
:: ::
++ sifo :: 64-bit encode ++ sifo :: 64-bit encode
@ -1157,7 +1157,57 @@
~ ~
=+ d=(end 0 6 pad) =+ d=(end 0 6 pad)
[(cut 3 [d 1] cha) $(pad (rsh 0 6 pad))] [(cut 3 [d 1] cha) $(pad (rsh 0 6 pad))]
(weld (flop (slag poc sif)) (trip (fil 3 poc '='))) (weld (flop (slag poc sif)) (reap poc '='))
::
++ ofis :: XX broken
=- |=(a=cord (rash a fel))
=- fel=;~(sfix (boss 64 (plus siw)) (stun 0^2 tis))
^= siw
;~ pose
dit
(cook |=(a=@ (sub a (sub 'A' 10))) (shim 'A' 'Z'))
(cook |=(a=@ (sub a (sub 'a' 36))) (shim 'a' 'z'))
(cold 62 (just '+'))
(cold 63 (just '/'))
==
::
:: .= ~[p=~.ack q=~.~sarnel r=~..y]
:: (dray ~[p=%tas q=%p r=%f] %ack ~sarnel &)
++ dray :: load tuple into path
=- |* [a=[@tas (pole ,@tas)] b=*] ^- (paf a)
=> .(b `(tup a)`b)
?~ +.a [(scot -.a b) ~]
[(scot -.a -.b) `(paf +.a)`(..$ +.a +.b)]
:- paf=|*(a=(pole) ?~(a ,~ ,[(odo:raid -.a(. %ta)) (..$ +.a)]))
tup=|*([a=@tas b=(pole ,@tas)] =+(c=(odo:raid a) ?~(b c ,[c (..$ b)])))
::
:: .= [p=%ack q=~sarnel r=&]
:: (raid /ack/~sarnel/.y p=%tas q=%p r=%f ~)
++ raid :: demand path odors
=- |* [a=path b=[@tas (pole ,@tas)]]
?~ +.b `(odo -.b)`(slav -.b -.a)
[`(odo -.b)`(slav -.b -.a) (..$ +.a +.b)]
^= odo
|* a=@tas
|= b=*
=< a(. (. b)) :: preserve face
?+ a ,@
%c ,@c %da ,@da %dr ,@dr %f ,@f %if ,@if %is ,@is %p ,@p
%u ,@u %uc ,@uc %ub ,@ub %ui ,@ui %ux ,@ux %uv ,@uv %uw ,@uw
%s ,@s %t ,@t %ta ,@ta %tas ,@tas
==
::
++ read :: parse odored path
=< |*([a=path b=[@tas (pole ,@tas)]] ((+> b) a))
|* b=[@tas (pole ,@tas)]
|= a=path
?~ a ~
=+ hed=(slaw -.b i.a)
?~ +.b
^- (unit (odo:raid -.b))
?^(+.a ~ hed)
^- (unit ,[(odo:raid -.b) _(need *(..^$ +.b))])
(both hed ((..^$ +.b) +.a))
:: ::
++ urle :: URL encode ++ urle :: URL encode
|= tep=tape |= tep=tape
@ -1197,9 +1247,14 @@
pul(q.q [(rsh 3 1 (scot %p who)) q.q.pul]) pul(q.q [(rsh 3 1 (scot %p who)) q.q.pul])
:: ::
++ earn :: purl to tape ++ earn :: purl to tape
|^ |= pul=purl =< |=(pul=purl `tape`(apex ~ pul))
^- tape |%
:(weld (head p.pul) "/" (body q.pul) (tail r.pul)) ++ apex
|= qur=quri
?- -.qur
%& (weld (head p.p.qur) `tape`['/' $(qur [%| +.p.qur])])
%| (weld (body p.qur) (tail q.qur))
==
:: ::
++ body ++ body
|= pok=pork ^- tape |= pok=pork ^- tape
@ -1233,16 +1288,14 @@
:- '?' :- '?'
|- ^- tape |- ^- tape
?~ kay ~ ?~ kay ~
;: weld ;: welp
(urle (trip p.i.kay)) (urle (trip p.i.kay))
"=" ?~(q.i.kay ~ ['=' (urle (trip q.i.kay))])
(urle (trip q.i.kay))
?~(t.kay ~ `tape`['&' $(kay t.kay)]) ?~(t.kay ~ `tape`['&' $(kay t.kay)])
== ==
-- --
:: ::
++ epur :: url/header parser ++ urlp :: url/header parser
=< |=(a=cord `(unit purl)`(rush a auri))
|% |%
++ apat :: 2396 abs_path ++ apat :: 2396 abs_path
%+ cook deft %+ cook deft
@ -1278,7 +1331,7 @@
++ pesc ;~(pfix cen mes) :: 2396 escaped ++ pesc ;~(pfix cen mes) :: 2396 escaped
++ pold (cold ' ' (just '+')) :: old space code ++ pold (cold ' ' (just '+')) :: old space code
++ pque ;~(pose pcar fas wut) :: 3986 query char ++ pque ;~(pose pcar fas wut) :: 3986 query char
++ pquo ;~(pose pure pesc pold) :: normal query char ++ pquo ;~(pose pure pesc pold fas wut) :: normal query char
++ pure ;~(pose aln hep dot cab sig) :: 2396 unreserved ++ pure ;~(pose aln hep dot cab sig) :: 2396 unreserved
++ psub ;~ pose :: 3986 sub-delims ++ psub ;~ pose :: 3986 sub-delims
zap buc pam soq pel per zap buc pam soq pel per
@ -1341,6 +1394,8 @@
(stag %| ;~(plug apat yque)) (stag %| ;~(plug apat yque))
== ==
-- --
++ epur :: url/header parser
=>(urlp |=(a=cord `(unit purl)`(rush a auri)))
:: ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 3bH, names etc :: :: section 3bH, names etc ::
@ -1646,22 +1701,22 @@
?~ two one ?~ two one
?:((lth u.one u.two) one two) ?:((lth u.one u.two) one two)
:: ::
++ mojo :: compiling load :: ++ mojo :: compiling load
|= [pax=path src=*] :: |= [pax=path src=*]
^- (each twig (list tank)) :: ^- (each twig (list tank))
?. ?=(@ src) :: ?. ?=(@ src)
[%| ~[[leaf/"musk: malformed: {<pax>}"]]] :: [%| ~[[leaf/"musk: malformed: {<pax>}"]]]
=+ ^= mud :: =+ ^= mud
%- mule |. :: %- mule |.
((full vest) [1 1] (trip src)) :: ((full vest) [1 1] (trip src))
?: ?=(| -.mud) mud :: ?: ?=(| -.mud) mud
?~ q.p.mud :: ?~ q.p.mud
:~ %| :: :~ %|
leaf/"musk: syntax error: {<pax>}" :: leaf/"musk: syntax error: {<pax>}"
leaf/"musk: line {<p.p.p.mud>}, column {<q.p.p.mud>}" :: leaf/"musk: line {<p.p.p.mud>}, column {<q.p.p.mud>}"
== :: ==
[%& p.u.q.p.mud] :: [%& p.u.q.p.mud]
:: :: ::
++ mole :: new to old sky ++ mole :: new to old sky
|= ska=$+(* (unit (unit))) |= ska=$+(* (unit (unit)))
|= a=* |= a=*
@ -1670,21 +1725,21 @@
?~ b ~ ?~ b ~
?~ u.b ~ ?~ u.b ~
[~ u.u.b] [~ u.u.b]
:: :: ::
++ much :: constructing load :: ++ much :: constructing load
|= [pax=path src=*] :: |= [pax=path src=*]
^- gank :: ^- gank
=+ moj=(mojo pax src) :: =+ moj=(mojo pax src)
?: ?=(| -.moj) moj :: ?: ?=(| -.moj) moj
(mule |.((slap !>(+>.$) `twig`p.moj))) :: (mule |.((slap !>(+>.$) `twig`p.moj)))
:: :: ::
++ musk :: compiling apply :: ++ musk :: compiling apply
|= [pax=path src=* sam=vase] :: |= [pax=path src=* sam=vase]
^- gank :: ^- gank
=+ mud=(much pax src) :: =+ mud=(much pax src)
?: ?=(| -.mud) mud :: ?: ?=(| -.mud) mud
(mule |.((slam p.mud sam))) :: (mule |.((slam p.mud sam)))
:: :: ::
++ pack :: light path encoding ++ pack :: light path encoding
|= [a=term b=path] ^- span |= [a=term b=path] ^- span
%+ rap 3 :- (wack a) %+ rap 3 :- (wack a)
@ -1860,7 +1915,6 @@
ced=cred :: client credentials ced=cred :: client credentials
bem=beam :: original path bem=beam :: original path
but=path :: ending but=path :: ending
nyp=path :: request model
== :: == ::
++ flap ,@uvH :: network packet id ++ flap ,@uvH :: network packet id
++ flow :: packet connection ++ flow :: packet connection
@ -2068,7 +2122,7 @@
$% [& p=suba] :: delta $% [& p=suba] :: delta
[| p=@tas] :: label [| p=@tas] :: label
== :: == ::
++ octs ,[p=@ud q=@] :: octet-stream ++ octs ,[p=@ud q=@t] :: octet-stream
++ oryx ,@t :: CSRF secret ++ oryx ,@t :: CSRF secret
++ page (cask) :: untyped cage ++ page (cask) :: untyped cage
++ pail ?(%none %warm %cold) :: connection status ++ pail ?(%none %warm %cold) :: connection status

10
main/cat/hello/gate.hook Normal file
View File

@ -0,0 +1,10 @@
::
:::: /hook/gate/hello/cat
::
/? 314
::
::::
!:
|= [* [[txt=@tas ~] ~]]
:- %noun
(crip (weld "hello, " (flop (trip txt))))

View File

@ -0,0 +1,12 @@
::
:::: /hook/gate/reload/helm/cat
::
/? 314
::
::::
!:
|= $: [now=@da eny=@uvI bec=beak]
[~ ~]
==
:- %helm-init
p.bec

Binary file not shown.

View File

@ -0,0 +1,12 @@
::
:::: /hook/gate/reload/helm/cat
::
/? 314
::
::::
!:
|= $: [now=@da eny=@uvI bec=beak]
[arg=(list term) ~]
==
:- %helm-reload
arg

View File

@ -0,0 +1,12 @@
::
:::: /hook/gate/sync/helm/cat
::
/? 314
::
::::
!:
|= $: [now=@da eny=@uvI bec=beak]
[arg=[syd=@tas her=@p sud=@tas ~] ~]
==
:- %helm-sync
arg

12
main/cat/ticket/gate.hook Normal file
View File

@ -0,0 +1,12 @@
::
:::: /hook/gate/ticket/cat
::
/? 314
::
::::
!:
|= $: [now=@da eny=@uvI bec=beak]
[[her=@p ~] ~]
==
:- %noun
((hard ,@p) .^(/a/(scot %p p.bec)/tick/(scot %da now)/(scot %p her)))

View File

@ -0,0 +1,45 @@
::
:::: /hook/gate/begin/helm/gun
::
/? 314
/- *sole
::
::::
!:
=> |%
++ begs ,[his=@p tic=@p yen=@t ges=gens]
--
|= $: [now=@da eny=@uvI bec=beak]
[~ ~]
==
^- (sole-result (cask begs))
%+ sole-lo
[%& %helm-begin "your ship: ~"]
%+ sole-go fed:ag
|= his=@p
%+ sole-lo
[%& %helm-ticket "your ticket: ~"]
%+ sole-go fed:ag
|= tic=@p
%+ sole-lo
[%& %helm-entropy "some entropy: "]
%+ sole-go (boss 256 (more gon qit))
|= yen=@t
=+ ney=(shax yen)
%+ sole-yo `tank`[%leaf "entropy check: {(scow %p `@p`(mug ney))}"]
%+ sole-so %helm-begin
:* his
tic
ney
::
^- gens
:- %en
=+ can=(clan his)
?- can
%czar [%czar ~]
%duke [%duke %anon ~]
%earl [%earl (scot %p his)]
%king [%king ?:(=(~doznec his) 'Urban Republic' (scot %p his))]
%pawn [%pawn ~]
==
==

View File

@ -0,0 +1,12 @@
::
:::: /hook/gate/reload/helm/gun
::
/? 314
/- *sole
::
::::
!:
|= $: [now=@da eny=@uvI bec=beak]
[arg=(list term) ~]
==
(sole-so %helm-reload arg)

View File

@ -0,0 +1,12 @@
::
:::: /hook/gate/reset/helm/gun
::
/? 314
/- *sole
::
::::
!:
|= $: [now=@da eny=@uvI bec=beak]
[~ ~]
==
(sole-so %helm-reset ~)

View File

@ -0,0 +1,13 @@
::
:::: /hook/gate/verb/helm/gun
::
/? 314
/- *sole
::
::::
!:
|= $: [now=@da eny=@ bec=beak]
[~ ~]
==
~& %helm-verb
(sole-so %helm-verb ~)

40
main/dog/solid/gate.hook Normal file
View File

@ -0,0 +1,40 @@
::
:::: /hook/gate/solid/gun
::
/? 314
/- *sole
::
::::
!:
|= $: [now=@da eny=@uvI bec=beak]
[~ ~]
==
%+ sole-so %noun
=+ top=`path`/(scot %p p.bec)/main/(scot %da now)/arvo
=+ pax=`path`(weld top `path`[%hoon ~])
~& %solid-start
=+ gen=(reck pax)
~& %solid-parsed
=+ ken=q:(~(mint ut %noun) %noun gen)
~& %solid-compiled
:- ken
=+ all=.*(0 ken)
=+ ^= vay ^- (list ,[p=@tas q=@tas])
:~ [%$ %zuse]
[%g %gall]
[%f %ford]
[%a %ames]
[%c %clay]
[%d %dill]
[%e %eyre]
[%t %time]
==
|- ^+ all
?~ vay all
=+ pax=(weld top `path`[q.i.vay ~])
=+ txt=((hard ,@) .^(%cx (weld pax `path`[%hoon ~])))
=+ sam=[now `ovum`[[%gold ~] [%veer p.i.vay pax txt]]]
~& [%solid-veer i.vay]
=+ gat=.*(all .*(all [0 42]))
=+ nex=+:.*([-.gat [sam +>.gat]] -.gat)
$(vay t.vay, all nex)

147
main/lib/base.css Normal file
View File

@ -0,0 +1,147 @@
@font-face {
font-family: "bau";
src: url("http://storage.googleapis.com/urbit-extra/bau.woff");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: "bau";
src: url("http://storage.googleapis.com/urbit-extra/bau-italic.woff");
font-weight: 400;
font-style: italic;
}
@font-face {
font-family: "bau";
src: url("http://storage.googleapis.com/urbit-extra/bau-medium.woff");
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: "bau";
src: url("http://storage.googleapis.com/urbit-extra/bau-mediumitalic.woff");
font-weight: 500;
font-style: italic;
}
@font-face {
font-family: "bau";
src: url("http://storage.googleapis.com/urbit-extra/bau-bold.woff");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: "bau";
src: url("http://storage.googleapis.com/urbit-extra/bau-bolditalic.woff");
font-weight: 600;
font-style: italic;
}
@font-face {
font-family: "bau";
src: url("http://storage.googleapis.com/urbit-extra/bau-super.woff");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: "bau";
src: url("http://storage.googleapis.com/urbit-extra/bau-superitalic.woff");
font-weight: 600;
font-style: italic;
}
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-extralight.woff");
font-weight: 200;
font-style: normal;
}
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-light.woff");
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-regular.woff");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-medium.woff");
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-bold.woff");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-black.woff");
font-weight: 700;
font-style: normal;
}
html,
body {
margin: 0;
padding: 0;
}
html,
input,
button,
body {
font-family: "bau";
font-size: 18px;
}
pre,
code,
.mono {
font-family:"scp";
}
#c {
width: 24rem;
position: absolute;
left: 50%;
margin-left: -12rem;
}
#c pre {
font-size: .6rem;
}
#c.err {
width: 32rem;
margin-left: -16rem;
}
#pass {
width: 24rem;
}
button {
border: .3rem solid #000;
background-color: #fff;
font-size: 1rem;
padding: .3rem;
font-weight: 500;
}
#ship,
input {
font-family: "scp";
display: inline;
border: none;
background-color: #f5f5f5;
padding: .3rem;
outline: none;
}
#ship:focus,
input:focus {
background-color: #eee;
}

View File

@ -28,9 +28,7 @@
:: ::
++ add-subs :: add gall subscription ++ add-subs :: add gall subscription
|* [hat=[hapt ship path] ref=_,[(list) ^]] |* [hat=[hapt ship path] ref=_,[(list) ^]]
=+ `[hapt ship path]`hat :: typecheck (add-resp [%pass /show %g %show hat] ref)
%+ add-resp [%pass /show %g %show hat]
ref
:: ::
++ args-into-gate :: poke--args from gate: output and exit ++ args-into-gate :: poke--args from gate: output and exit
|* [con=[* [hide *] *] gat=_,[@ *]] |* [con=[* [hide *] *] gat=_,[@ *]]

3
main/lib/shu/core.hook Normal file
View File

@ -0,0 +1,3 @@
:: Alias
/+ sh-utils
.

142
main/lib/sole/core.hook Normal file
View File

@ -0,0 +1,142 @@
::
:::: /hook/core/sole/lib
::
:: This file is in the public domain.
::
/? 310
/- *sole
!:
::::
::
|%
++ cs :: shared-state engine
|_ sole-share
++ abet +<
++ apply
|= ted=sole-edit
^+ +>
?- -.ted
%del +>.$(buf (weld (scag p.ted buf) (slag +(p.ted) buf)))
%ins +>.$(buf (weld (scag p.ted buf) `_buf`[q.ted (slag p.ted buf)]))
%mor |- ^+ +>.^$
?~ p.ted
+>.^$
$(p.ted t.p.ted, +>.^$ ^$(ted i.p.ted))
%nop +>.$
%set +>.$(buf p.ted)
==
::
::::
:: ++transmute: symmetric operational transformation.
::
:: for any sole state +>, obeys
::
:: =+ [x=(transmute a b) y=(transmute b a)]
:: .= (apply:(apply b) x)
:: (apply:(apply a) y)
::
++ transmute :: dex as after sin
|= [sin=sole-edit dex=sole-edit]
^- sole-edit
?: ?=(%mor -.sin)
|- ^- sole-edit
?~ p.sin dex
$(p.sin t.p.sin, dex ^$(sin i.p.sin))
::
?: ?=(%mor -.dex)
:- %mor
|- ^- (list sole-edit)
?~ p.dex ~
[^$(dex i.p.dex) $(p.dex t.p.dex)]
::
?: |(?=(%nop -.sin) ?=(%nop -.dex)) dex
?: ?=(%set -.sin) [%nop ~]
?: ?=(%set -.dex) dex
::
?- -.sin
%del
?- -.dex
%del ?: =(p.sin p.dex) [%nop ~]
?:((lth p.sin p.dex) dex(p (dec p.dex)) dex)
%ins ?:((lte p.sin p.dex) dex(p (dec p.dex)) dex)
==
::
%ins
?- -.dex
%del ?:((lte p.sin p.dex) dex(p +(p.dex)) dex)
%ins ?: =(p.sin p.dex)
?:((gth q.sin q.dex) dex dex(p +(p.dex)))
?:((lte p.sin p.dex) dex(p +(p.dex)) dex)
==
==
::
++ commit :: local change
|= ted=sole-edit
^- sole-share
abet:(apply(own.ven +(own.ven), leg [ted leg]) ted)
::
::::
:: ++inverse: inverse of change in context.
::
:: for any sole state +>, obeys
::
:: =(+> (apply:(apply a) (inverse a)))
::
++ inverse :: relative inverse
|= ted=sole-edit
^- sole-edit
=. ted ?.(?=([%mor * ~] ted) ted i.p.ted)
?- -.ted
%del [%ins p.ted (snag p.ted buf)]
%ins [%del p.ted]
%mor :- %mor
%- flop
|- ^- (list sole-edit)
?~ p.ted ~
:- ^$(ted i.p.ted)
$(p.ted t.p.ted, +>.^$ (apply i.p.ted))
%nop [%nop ~]
%set [%set buf]
==
::
++ receive :: naturalize event
|= sole-change
^- [sole-edit sole-share]
?> &(=(his.ler his.ven) (lte own.ler own.ven))
?> &(=(his.ler his.ven) (lte own.ler own.ven))
?> |(!=(own.ler own.ven) =(haw (sham buf)) =(haw 0)) :: trust the clock
=. leg (scag (sub own.ven own.ler) leg)
:: ~? !=(own.ler own.ven) [%miss-leg leg]
=+ dat=(transmute [%mor leg] ted)
:: ~? !=(~ leg) [%transmute from/ted to/dat ~]
[dat abet:(apply(his.ven +(his.ven)) dat)]
::
++ remit :: conditional accept
|= [cal=sole-change ask=$+((list ,@c) ?)]
^- [(unit sole-change) sole-share]
=+ old=buf
=^ dat +>+<.$ (receive cal)
?: (ask buf)
[~ +>+<.$]
=^ lic +>+<.$ (transmit (inverse(buf old) dat))
[`lic +>+<.$]
::
++ transmit :: outgoing change
|= ted=sole-edit
^- [sole-change sole-share]
[[[his.ven own.ven] (sham buf) ted] (commit ted)]
::
++ transceive :: receive and invert
|= sole-change
^- [sole-edit sole-share]
=+ old=buf
=^ dat +>+<.$ (receive +<.$)
[(inverse(buf old) dat) +>+<.$]
::
++ transpose :: adjust position
|= pos=@ud
=+ dat=(transmute [%mor leg] [%ins pos `@c`0])
?> ?=(%ins -.dat)
p.dat
--
--

View File

@ -1,10 +1,10 @@
:: ::
:::: /hook/core/rodeo/lib :::: /hook/core/talk/lib
:: ::
:: This file is in the public domain. :: This file is in the public domain.
:: ::
/? 314 /? 314
/- *rodeo /- *talk
:: ::
:::: ::::
:: ::

View File

@ -1,94 +1,272 @@
window.urb.seqn_u = 1
window.urb.dely = 0
window.urb.puls = false
window.urb.cabs = {}
if(!window.urb.appl) window.urb.appl = null
window.urb.req = function(method,url,params,json,cb) {
var xhr = new XMLHttpRequest()
method = method.toUpperCase()
if(method == "PUT" || method == "DELETE")
xhr.open("POST", url+"?"+method)
else xhr.open(method, url)
if(json)
xhr.setRequestHeader("content-type", "text/json")
if(!window.urb.oryx) throw "No CSRF token" // XX fetch auth.json
_data = {oryx: window.urb.oryx}
if(params.xyro) { _data.xyro = params.xyro; }
if(params.ship) { _data.ship = params.ship; }
if(params.path) { _data.path = params.path; }
if(params.appl) { _data.appl = params.appl; }
if(params.mark) { _data.mark = params.mark; }
if(params.wire) { _data.wire = params.wire; }
if(cb) {
xhr.onload = function() {
try {
err = null
res = {
status:this.status,
data: JSON.parse(this.responseText)
}
if(res.data.reload)
res.reload = res.data.reload
} catch(e) {
if(urb.wall || true) document.write(this.responseText) // XX
err = {
message:"Failed to parse JSON",
raw:this.responseText
}
res = null
}
cb(err,res)
}
xhr.onerror = function() {
cb({
status:this.status,
data:this.responseText
})
}
}
xhr.send(JSON.stringify(_data))
}
window.urb.reqq = []
window.urb.qreq = function(method,url,params,json,cb) {
walk = function() {
qobj = {}
qobj.oargs = window.urb.reqq[0]
qobj.nargs = [].slice.apply(qobj.oargs,[0,4])
qobj.nargs.push(function(){
if(this.oargs[4])
this.oargs[4].apply(window.urb,arguments)
window.urb.reqq.shift()
if(window.urb.reqq.length > 0)
walk()
}.bind(qobj))
window.urb.req.apply(this,qobj.nargs)
}
l = window.urb.reqq.length
window.urb.reqq.push(arguments);
if(l == 0) { walk() }
}
window.urb.gsig = function(params) {
var path = params.path
if(!path) path = ""
if(path[0] !== "/") path = "/"+path
return "~"+params.ship+"/"+
params.appl+
path.replace(/[^\x00-\x7F]/g, "")
}
window.urb.poll = function(params) {
if(!params) throw new Error("You must supply params to urb.poll.")
var url, $this
seqn = this.seqn_u
if(params.seqn) seqn = params.seqn()
url = "/~/of/"+this.ixor+"?poll="+seqn
this.puls = true
$this = this
this.req("get",url,params,true,function(err,res) {
if(res){
if(res.data.beat)
return $this.poll(params)
switch(res.data.type){
case "news":
return document.location.reload() // XX check autoreload
case "rush":
case "mean":
var err2 = err
if(res.data.type == "mean")
err2 = res.data.data
var fn = $this.gsig(res.data.from)
if($this.cabs[fn])
$this.cabs[fn].call(this,err2,
{status: res.status, data: res.data.data.json}) // XX non-json
break;
default:
throw new Error("Lost event %"+res.data.type)
}
}
dely = params.dely ? params.dely : $this.dely
if(err)
dely = dely+Math.ceil(dely*.02)
else {
$this.dely = 0
if(params.incs)
params.incs()
else
$this.seqn_u++
}
setTimeout(function() {
$this.poll(params)
},dely)
})
}
// if (window.urb.auto) { // need dependencies
// var tries = 0
// var cnt = 0
// var param = {
// type:"pol"
// }
// window.urb.poll(param)
// }
// window.urb.heartbeat = function() {
// this.poll({
// type:"heb",
// ship:this.ship,
// dely:30000,
// seqn:function() {
// return window.urb.seqn_h
// },
// incs:function() {
// window.urb.seqn_h = window.urb.seqn_h+1
// }
// },function() {
// console.log('heartbeat.')
// })
// }
// window.urb.heartbeat()
// // / // / // //
// end old %eyre code //
// // / // / // //
window.urb.seqn_s = 0 window.urb.seqn_s = 0
// TODO urb.send(data, [params/params.appl]?, cb?)
window.urb.send = function(params,cb) { window.urb.send = function(params,cb) {
if(!params) if(!params)
throw new Error("You must supply params to urb.send.") throw new Error("You must supply params to urb.send.")
if(!params.appl) { if(!params.appl && !this.appl){
if(!urb.appl) throw new Error("You must specify an appl for urb.send.")
throw new Error("You must specify an appl for urb.send.")
params.appl = urb.appl
} }
if(!params.data) { params.data = {}; }
var method, perm, url, $this var url, $this
type = params.type ? params.type : "mes"
perm = this.perms[type]
params.ship = params.ship ? params.ship : this.ship params.ship = params.ship ? params.ship : this.ship
params.appl = params.appl ? params.appl : this.appl
params.mark = params.mark ? params.mark : "json" params.mark = params.mark ? params.mark : "json"
params.xyro = params.data ? params.data : {}
params.wire = params.wire ? params.wire : "/"
method = "put"
url = [perm,this.user,this.port,this.seqn_s] url = ["to",params.appl,params.mark]
url = "/"+url.join("/") url = "/~/"+url.join("/")
this.seqn_s++ this.seqn_s++
$this = this $this = this
this.qreq(method,url,params,true,function(err,data) { this.qreq('post',url,params,true,function(err,data) {
if(err) { $this.seqn_s--; } if(err) { $this.seqn_s--; }
if(cb) { cb.apply(this,arguments); } if(cb) { cb.apply(this,arguments); }
}) })
} }
window.urb.subscribe = function(params,cb) { window.urb.subscribe = function(params,cb) { // legacy interface
if(!cb) if(!params) throw new Error("You must supply params to urb.subscribe")
throw new Error("You must supply a callback to urb.subscribe.") return window.urb.bind(params.path, params, cb, cb)
if(!params) }
throw new Error("You must supply params to urb.subscribe.") window.urb.bind = function(path, cb){ // or bind(path, params, cb, nicecb?)
if(!params.appl) { var params, nicecb
if(!urb.appl) if(arguments.length > 2)
throw new Error("You must specify an appl for urb.subscribe.") {params = cb; cb = arguments[2], nicecb = arguments[3]}
params.appl = urb.appl else params = {}
}
if(!params.path) params.path = path
throw new Error("You must specify a path for urb.subscribe.") if(params.path[0] !== "/") params.path = "/"+params.path
params.ship = params.ship ? params.ship : this.ship params.ship = params.ship ? params.ship : this.ship
params.appl = params.appl ? params.appl : this.appl
params.mark = params.mark ? params.mark : "json"
params.wire = params.wire ? params.wire : params.path
if(typeof path != "string")
throw new Error("You must specify a string path for urb.bind.")
if(!params.appl) throw new Error("You must specify an appl for urb.bind.")
if(!cb) throw new Error("You must supply a callback to urb.bind.")
var method, perm, url, $this var method, perm, url, $this
params.type = "sub" if(params.mark !== "json")
throw new Error("Non-json subscriptions unimplemented.") // XX
url = "/~/is/"+this.gsig(params)+"."+params.mark
params.path = params.wire
this.cabs[this.gsig(params)] = cb this.cabs[this.gsig(params)] = cb
url = [this.perms["sub"],this.user,this.port]
url = "/"+url.join("/")
method = "put"
$this = this $this = this
this.qreq(method,url,params,true,function(err,data) { this.qreq("put",url,params,true,function(err,res) {
if(cb) { cb.apply(this,[err,{status: data.status, data: data.data}])} if(nicecb) { nicecb.apply(this,[err,{status: res.status, data: res.data}])}
if(!err && $this.puls == 0) { // XX give raw data
params.type = "pol" //
$this.poll(params) if(!err && !$this.puls) $this.poll(params)
}
}) })
} }
window.urb.unsubscribe = function(params,cb) { window.urb.unsubscribe = function(params,cb) {
if(!params) if(!params) throw new Error("You must supply params to urb.unsubscribe.")
throw new Error("You must supply params to urb.unsubscribe.")
if(!params.appl) {
if(!urb.appl)
throw new Error("You must specify an appl for urb.unsubscribe.")
params.appl = urb.appl
}
if(!params.path)
throw new Error("You must specify a path for urb.unsubscribe.")
params.ship = params.ship ? params.ship : this.ship params.ship = params.ship ? params.ship : this.ship
params.appl = params.appl ? params.appl : this.appl
params.wire = params.wire ? params.wire : params.path
method = "put" if(!params.path) throw new Error("You must specify a path for urb.unsubscribe.")
type = "uns" if(!params.appl) throw new Error("You must specify an appl for urb.unsubscribe.")
url = [this.perms[type],this.user,this.port] if(!cb) throw new Error("You must supply a callback to urb.unsubscribe.")
url = "/"+url.join("/")
var $this = this url = "/~/is/"+this.gsig(params)+".json"
this.req(method,url,params,true,function(err,data) { method = "delete"
cb(err,data) this.req("delete",url,params,true,function(err,res) {
cb(err,res)
}) })
} }
window.urb.util = { window.urb.util = {
isURL: function(s) {
r = new RegExp('^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$', 'i');
return s.length < 2083 && r.test(s);
},
numDot: function(n) {
_n = String(n)
fun = function(s){
if(s.length <= 3)
return s
return fun(s.slice(0,-3))+"."+s.slice(-3)
}
return fun((_n))
},
toDate: function (dat){ toDate: function (dat){
var mils = Math.floor((0x10000 * dat.getUTCMilliseconds()) / 1000).toString(16) var mils = Math.floor((0x10000 * dat.getUTCMilliseconds()) / 1000).toString(16)
function pad(num, str){ function pad(num, str){

View File

@ -0,0 +1,13 @@
::
:::: /hook/door/console-action/mar
::
/? 314
/- *console
!:
|_ cod=console-action
::
++ grab :: convert from
|%
++ noun console-action :: clam from %noun
--
--

View File

@ -0,0 +1,14 @@
::
:::: /hook/door/console-effect/mar
::
/? 310
/- *console
!:
|_ cod=console-effect
::
++ grab :: convert from
|%
++ noun console-effect :: clam from %noun
--
--

View File

@ -0,0 +1,58 @@
::
:::: /hook/door/dill-belt/mar
::
/? 314
/- kyev,*sole
!:
::::
::
|_ dill-belt
::
++ grab :: convert from
|%
++ json
=< (cork . kyev)
|= jon=^json ^- ^kyev
%- need
%. jon => jo %- ot
:~ mod/(cu ^sa (ar (su (perk ~[%ctrl %shift %alt %meta]))))
:- %key
%+ cu |*(a=$%([%str @t] [%act @]) ?+(-.a a %str +.a))
=- (of str/so act/(su (perk -)) ~)
:~ %ctrl %shift %alt %meta %entr %esc %caps %uncap
%pgup %pgdn %home %end %baxp %del %ins
%up %down %left %right
== ==
++ kyev
|= kev=^kyev ^- dill-belt
~| dill-belt-incomplete/kev
?: ?=([%act ?(%ctrl %shift %alt %meta)] q.kev)
[%txt ~] :: ignore
=+ mod=(~(del in p.kev) %shift)
?^ mod
?^ q.kev !! :: only accept strings
=. q.kev
?. (~(has in p.kev) %ctrl)
q.kev
(con 96 q.kev) :: ctrl key decoding
=+ cha=(tuba (trip q.kev))
?> ?=([@ ~] cha) :: of a single character
?+ mod !! :: modified by one buckykey
[%ctrl ~ ~] [%ctl i.cha]
[%alt ~ ~] [%met i.cha]
==
?@ q.kev
[%txt (tuba (trip q.kev))]
?+ +.q.kev !!
%del [%del ~]
%baxp [%bac ~]
%entr [%ret ~]
%up [%aro %u]
%down [%aro %d]
%left [%aro %l]
%right [%aro %r]
== :: %yow, %rez?
::
++ noun dill-belt :: clam from %noun
--
--

View File

@ -0,0 +1,23 @@
::
:::: /hook/door/dill-blit/mar
::
/? 314
/- *sole
|_ dib=dill-blit
::
++ grab :: convert from
|%
++ noun dill-blit :: clam from %noun
--
++ grow
|%
++ json
^- ^json
?+ -.dib ~|(unsupported-blit/-.dib !!)
%mor [%a (turn p.dib |=(a=dill-blit json(dib a)))]
%hop (joba %hop (jone p.dib))
?(%pro %out) (joba -.dib (jape (tufa p.dib)))
?(%bel %clr) (joba %act %s -.dib)
==
--
--

View File

@ -9,6 +9,7 @@
++ html (crip (poxo own)) :: convert to %html ++ html (crip (poxo own)) :: convert to %html
++ mime [/text/html (taco html)] :: convert to %mime ++ mime [/text/html (taco html)] :: convert to %mime
-- --
++ garb [%urb ~]
++ grab |% :: convert from ++ grab |% :: convert from
++ noun manx :: clam from %noun ++ noun manx :: clam from %noun
-- -- -- --

View File

@ -9,13 +9,15 @@
:: ::
++ grow :: convert to ++ grow :: convert to
|% |%
++ mime :: convert to %mime ++ mime [/text/json (taco txt)] :: convert to %mime
[/text/json (taco (crip (pojo jon)))] ++ txt (crip (pojo jon))
-- --
++ grab ++ grab
|% :: convert from |% :: convert from
++ mime |=([p=mite q=octs] *json) ::(fall (rush (,@t q.q) apex:poja) *json)) ++ mime |=([p=mite q=octs] *json) ::(fall (rush (,@t q.q) apex:poja) *json))
++ noun json :: clam from %noun ++ noun json :: clam from %noun
++ numb jone
++ time jode
-- --
++ grad ++ grad
|% |%

View File

@ -1,74 +0,0 @@
::
:::: /hook/door/radio-command/mar
::
/? 314
/- *radio
!:
|_ cod=command
::
++ grab :: convert from
|%
++ noun command :: clam from %noun
++ json
=> [jo ..command]
|= a=json ^- command
=- (need ((of -) a))
=< :~ publish/(ar thot)
review/(ar thot)
design/(ot party/so config/(mu conf) ~)
ping/auri
==
|%
++ as :: array as set
:: |*(a=fist (cu sa (ar a))) :: XX types
|* a=fist
%- cu :_ (ar a)
~(gas in *(set ,_(need *a)))
::
++ lake |*(a=_,* $+(json (unit a)))
++ peach
|* a=_[rule rule]
|= tub=nail
^- (like (each ,_(wonk (-.a)) ,_(wonk (+.a))))
%. tub
;~(pose (stag %& -.a) (stag %| +.a))
::
++ thot
^- $+(json (unit thought))
%- ot :~
serial/(ci (slat %uv) so)
audience/audi
statement/stam
==
::
++ audi (op stati (ci (soft delivery) so)) :: audience
++ auri (op stati (ci (soft presence) so))
::
++ stati
^- $+(nail (like station))
%+ peach
;~((glue fas) ;~(pfix sig fed:ag) urs:ab)
%+ sear (soft partner)
;~((glue fas) sym urs:ab) :: XX [a-z0-9_]{1,15}
::
++ stam
^- $+(json (unit statement))
=- (ot now/di speech/(of -) ~)
:~ own/so
say/so
exp/(cu |=(a=cord [a ~]) so)
inv/(ot ship/(su fed:ag) party/(su urs:ab) ~)
==
::
::
++ conf
^- $+(json (unit config))
%- ot :~
sources/(as (su stati))
:- %cordon
%+ cu |*(a=^ ?~(-.a a a)) :: XX do type stuff
(ot white/bu list/(as (su fed:ag)) ~)
==
--
-- --

View File

@ -1,92 +0,0 @@
::
:::: /hook/door/radio-report/mar
::
/? 314
/- *radio
!:
|_ rep=report
::
++ grab :: convert from
|%
++ noun report :: clam from %noun
--
++ grow
|%
++ mime [/text/json (taco (crip (pojo json)))]
++ json
=> +
|^ %+ joba -.rep
?- -.rep
%config ~! rep (conf +.rep)
%house [%a (turn (~(tap by +.rep)) joce)]
%grams (jobe num/(jone p.rep) tele/[%a (turn q.rep gram)] ~)
::%group (grop +.rep)
%group (jobe local/(grop p.rep) global/%.(q.rep (jome stan grop)) ~)
==
++ joce |=(a=span [%s a])
++ jope |=(a=ship (jape +:<a>)) ::[%s (crip +:(scow %p a))])
++ joke |=(a=tank [%s (role (turn (wash 0^80 a) crip))])
++ jode |=(a=time (jone (div (mul (sub a ~1970.1.1) 1.000) ~s1)))
:: ++ jase
:: |* a=,json
:: |= b=(set ,_+<.a) ^- json
:: ~! b
:: [%a (turn (~(tap in b)) a)]
::
++ jome :: stringify keys
|* [a=_cord b=_json]
|= c=(map ,_+<.a ,_+<.b)
(jobe (turn (~(tap by c)) (both a b)))
::
++ both :: cons two gates
|* [a=_,* b=_,*]
|=(c=_[+<.a +<.b] [(a -.c) (b +.c)])
::
::
++ grop (jome phon stas) :: (map ship status)
++ phon |=(a=ship (scot %p a))
++ stas |=(status (jobe presence/(joce p) human/(huma q) ~))
++ gram |=(telegram (jobe ship/(jope p) thought/(thot q) ~))
++ thot
|= thought
(jobe serial/(jape <p>) audience/(audi q) statement/(stam r) ~)
::
++ audi (jome stan joce)
++ stan
|= a=station ^- cord
%- crip
?~ -.a "{<p.p.a>}/{(trip q.p.a)}"
?- -.p.a
%twitter "{(trip -.p.a)}/{(trip p.p.a)}"
==
::
++ stam |=(statement (jobe time/(jode p) speech/(spec q) ~))
++ spec
|= a=speech
%+ joba -.a
?- -.a
?(%own %say) [%s p.a]
%exp (jobe code/[%s p.a] done/?~(q.a ~ (joke u.q.a)) ~)
%inv (jobe ship/(jope p.a) party/[%s q.a] ~)
==
::
++ huma
|= human
%^ jobe
hand/?~(hand ~ [%s u.hand])
:- %true
?~ true ~
=+ u.true
(jobe first/[%s p] middle/?~(q ~ [%s u.q]) last/[%s r] ~)
~
::
++ conf
|= config
%- jobe :~
sources/[%a (turn (~(tap in sources)) |=(a=station [%s (stan a)]))]
=- cordon/(jobe white/[%b -.cordon] list/[%a -] ~)
(turn (~(tap in p.cordon)) jope) :: XX jase
==
--
-- --

View File

@ -50,10 +50,14 @@
:: ::
++ grow :: convert to ++ grow :: convert to
|% |%
++ psal own ++ mime
++ hymn ;html:(head:title:"snip" body:"+{psal}") :: convert to %hymn =< mime
++ html (crip (poxo hymn)) :: convert to %html |%
++ mime [/text/html (taco html)] :: convert to %mime ++ psal own
++ hymn ;html:(head:title:"snip" body:"+{psal}") :: convert to %hymn
++ html (crip (poxo hymn)) :: convert to %html
++ mime [/text/html (taco html)] :: convert to %mime
--
-- --
++ garb [%react-snip ~] ++ garb [%react-snip ~]
++ grab |% :: convert from ++ grab |% :: convert from

View File

@ -0,0 +1,38 @@
::
:::: /hook/door/sole-action/mar
::
/? 314
/- *sole
!:
::::
::
|_ sole-action
::
++ grab :: convert from
|%
++ json
|= jon=^json ^- sole-action
%- need %. jon
=> [jo ..sole-action]
|^ =- ~! (-) -
(fo %ret (of det/change ~))
++ fo
|* [a=term b=fist]
|=(c=json ?.(=([%s a] c) (b c) (some [a ~])))
::
++ ra
|* [a=[p=term q=fist] b=fist]
|= c=json %. c
?.(=(%a -.c) b (pe p.a (ar q.a)))
::
++ change (ot ler/(at ni ni ~) ted/(cu |*(a=* [0v0 a]) edit) ~)
++ char (cu turf so)
++ edit
%+ fo %nop
%+ ra mor/|=(json (edit +<))
(of del/ni set/(cu tuba sa) ins/(ot at/ni new/char ~) ~)
--
::
++ noun sole-action :: clam from %noun
--
--

View File

@ -0,0 +1,55 @@
::
:::: /hook/door/sole-effect/mar
::
/? 314
/- *sole
!:
::::
::
|%
++ mar-sole-change :: XX dependency
|_ cha=sole-change
++ grow
|% ++ json
^- ^json
=+ cha
=< (jobe ted/(. ted) ler/a/~[(jone own.ler) (jone his.ler)] ~)
|= ted=sole-edit
?- -.ted
%nop [%s 'nop']
%mor [%a (turn p.ted ..$)]
%del (joba %del (jone p.ted))
%set (joba %set (jape (tufa p.ted)))
%ins (joba %ins (jobe at/(jone p.ted) new/s/(tuft q.ted) ~))
==
--
--
++ wush
|= [wid=@u tan=tang]
^- tape
=+ rolt=|=(a=wall `tape`?~(a ~ :(weld i.a "\0a" $(a t.a))))
(rolt (turn tan |=(a=tank (rolt (wash 0^wid a)))))
::
--
!:
|_ sef=sole-effect
::
++ grab :: convert from
|%
++ noun sole-effect :: clam from %noun
--
++ grow
|%
++ json
^- ^json
?+ -.sef ~|(unsupported-effect/-.sef !!)
%mor [%a (turn p.sef |=(a=sole-effect json(sef a)))]
%err (joba %hop (jone p.sef))
%txt (joba %txt (jape p.sef))
%tan (joba %tan (jape (wush 160 p.sef)))
%det json:~(grow mar-sole-change +.sef)
%pro (jobe vis/b/vis.sef tag/s/tag.sef cad/(jape cad.sef) ~)
?(%bel %clr %nex) (joba %act %s -.sef)
==
--
--

View File

@ -1,8 +1,8 @@
:: ::
:::: /hook/door/rodeo-command/mar :::: /hook/door/talk-command/mar
:: ::
/? 314 /? 314
/- *rodeo /- *talk
!: !:
|_ cod=command |_ cod=command
:: ::
@ -72,6 +72,7 @@
^- $+(json (unit statement)) ^- $+(json (unit statement))
=- (ot date/di bouquet/(as (ar so)) speech/(of -) ~) =- (ot date/di bouquet/(as (ar so)) speech/(of -) ~)
:~ lin/(ot say/bo txt/so ~) :~ lin/(ot say/bo txt/so ~)
url/(su auri:urlp)
:: exp/(cu |=(a=cord [a ~]) so) :: exp/(cu |=(a=cord [a ~]) so)
:: inv/(ot ship/(su fed:ag) party/(su urs:ab) ~) :: inv/(ot ship/(su fed:ag) party/(su urs:ab) ~)
== ==

View File

@ -1,8 +1,8 @@
:: ::
:::: /hook/door/rodeo-report/mar :::: /hook/door/talk-report/mar
:: ::
/? 314 /? 314
/- *rodeo /- *talk
!: !:
|_ rep=report |_ rep=report
:: ::
@ -17,7 +17,7 @@
=> + => +
|^ %+ joba -.rep |^ %+ joba -.rep
?- -.rep ?- -.rep
%config ~! rep (conf +.rep) %cabal (cabl +.rep)
%house a/(turn (~(tap by +.rep)) jose) %house a/(turn (~(tap by +.rep)) jose)
%grams (jobe num/(jone p.rep) tele/[%a (turn q.rep gram)] ~) %grams (jobe num/(jone p.rep) tele/[%a (turn q.rep gram)] ~)
%group (jobe local/(grop p.rep) global/%.(q.rep (jome parn grop)) ~) %group (jobe local/(grop p.rep) global/%.(q.rep (jome parn grop)) ~)
@ -67,12 +67,18 @@
:: ::
++ parn ++ parn
|= a=partner ^- cord |= a=partner ^- cord
%- crip ?- -.a
?~ -.a "{<p.p.a>}/{(trip q.p.a)}" %& (stat p.a)
?- -.p.a %| %- crip
%twitter "{(trip -.p.a)}/{(trip p.p.a)}" ?- -.p.a
%twitter "{(trip -.p.a)}/{(trip p.p.a)}"
==
== ==
:: ::
++ stat
|= a=station ^- cord
(crip "{<p.a>}/{(trip q.a)}")
::
++ stam ++ stam
|= statement |= statement
(jobe date/(jode p) bouquet/(bouq q) speech/(spec r) ~) (jobe date/(jode p) bouquet/(bouq q) speech/(spec r) ~)
@ -82,6 +88,7 @@
%+ joba -.a %+ joba -.a
?+ -.a !! ?+ -.a !!
%lin (jobe say/[%b p.a] txt/[%s q.a] ~) %lin (jobe say/[%b p.a] txt/[%s q.a] ~)
%url (jobe url/[%s (crip (earn p.a))] ~)
%exp (jobe code/[%s p.a] ~) %exp (jobe code/[%s p.a] ~)
:: %inv (jobe ship/(jope p.a) party/[%s q.a] ~) :: %inv (jobe ship/(jope p.a) party/[%s q.a] ~)
== ==
@ -96,6 +103,13 @@
(jobe first/[%s p] middle/?~(q ~ [%s u.q]) last/[%s r] ~) (jobe first/[%s p] middle/?~(q ~ [%s u.q]) last/[%s r] ~)
~ ~
:: ::
++ cabl
|= cabal
%- jobe :~
loc/(conf loc)
ham/((jome stat conf) ham)
==
::
++ conf ++ conf
|= config |= config
%- jobe :~ %- jobe :~

View File

@ -1,9 +1,17 @@
:: ::
:::: /hoon/core/zing/mar :::: /hoon/core/psal/mar
:: ::
/? 314 /? 314
!:
|_ tan=(list tank) |_ tan=(list tank)
:: ::
++ grow
|%
++ psal
=- ;pre:code:"{(trip (role (turn - crip)))}" :: XX
^- wall %- zing ^- (list wall)
(turn tan |=(a=tank (wash 0^160 a)))
--
++ grab :: convert from ++ grab :: convert from
|% |%
++ noun (list tank) :: clam from %noun ++ noun (list tank) :: clam from %noun

31
main/mar/urb/door.hook Normal file
View File

@ -0,0 +1,31 @@
::
:::: /hook/door/urb/mar
::
/? 314
:: /= dep /$ |=([^ but=path] `@uvH`?>(?=([%dep @ ~] but) (slav %uv i.t.but)))
!:
|_ own=manx
::
++ grow :: convert to
|%
++ html (crip (poxo own)) :: convert to %html
++ mime [/text/html (taco html)] :: convert to %mime
--
++ grab
|% :: convert from
++ noun manx :: clam from %noun
++ hymn :: inject into %hymn
|= old=manx old :: moved to %eyre
:: ~| hymn//mal-formed
:: :: ~| old
:: ?> ?=([[%html ~] [[%head ~] *] [[%body ~] ^] ~] old) :: XX static
:: :: =+ bek=(sa (turn (turn dep) |=(a=beam (tope a(s ~)))))
:: %_ old
:: c.i.c
:: :- ;meta(charset "utf-8", urb_injected "");
:: ?~ dep c.i.c.old
:: :- ;script@"/~/on/{<dep>}.js";
:: c.i.c.old
:: ==
--
--

View File

@ -1989,7 +1989,7 @@ try to get the aeon referred to by the starting case. If it doesn't
exist yet, then we can't do anything interesting with this subscription, exist yet, then we can't do anything interesting with this subscription,
so we move on to the next one. so we move on to the next one.
Otherwise, we try to get the aeon referrred to by the ending case. If it Otherwise, we try to get the aeon referred to by the ending case. If it
doesn't exist yet, then we produce all the information we can. We call doesn't exist yet, then we produce all the information we can. We call
`++lobes-at-path` at the given aeon and path to see if the requested `++lobes-at-path` at the given aeon and path to see if the requested
path has actually changed. If it hasn't, then we don't produce anything; path has actually changed. If it hasn't, then we don't produce anything;

View File

@ -56,3 +56,8 @@ Unsubscribe from stream `[stream]` on a foreign Urbit.
urb.js urb.js
====== ======
<hr>
</hr>
<list></list>

View File

@ -1,5 +1,273 @@
Eyre: Reference Eyre: Reference
=============== ===============
## State
Stored
- `++bolo`
- `++cyst`
- `++stem`
Runtime
- `perk`
+ `perk-auth`
- `pest`
- `even`
## Cores
- `++handle`
+ `++parse`
- `++as...`
- `++ya`
- `++ix`
Eyre: Commentary Eyre: Commentary
================ ================
Let us follow the loading of a simple cli app, as it bounces from
browser to server to browser and back.
## Initial request[#init]
An http request for `http://sampel-sipnym.urbit.org/cli` will be [redirected](dns)
to the `%eyre` on ~sampel-sipnym, and come in as a `%this` kiss.
From arvo, requests enter `++call`, which after some type reification are passed
along to `++apex:ye`. In the case of a `%this` kiss, its components are
parsed(see `++zest:epur`, `++eat-headers`) and handed off to `++handle`, wrapped
in `++emule` to produce a `++fail` page in case of error. `++apex:handle` will
`++process` the request to a `pest` or a `++done` core, and in the former case
`++resolve` the pest into an outgoing card.
XX it also seems to affect the current ship, test that serving ship name is consistently correct
The pest is produced by `++process`, which will first further `++parse` the
request, and if this does not make the response immediately obvious,
`++process-parsed` the resulting `perk`.
`++parse` produces the `perk`, by attempting to interpret the `pork`(url path)
[`++as-magic-filename`](#mage), `++as-beam`, and `++as-aux-request`. In this
case, `/cli` is parsed by the second case as a `%beam` query to `/=cli=`: a path
which starts with a valid ship name is expected to be a full clay(well, ford)
path, and one starting with a term implies the current serving ship and a case
of `0`, the current revision.
XX spur: when the desks are merged, `/cli` shall point to `/=main=/pub/cli`
The parsed `perk` generates a `%f %boil` note, `mark`ed as its extension(here
defaulting to `%urb`) and `wire`d with `~` to return unaltered to the client. It
goes on to `++resolve` by being passed to `++ford-get-beam`, which translates
the perk it into a `%boil` `++ford-req`, adding an `++fcgi` path-segment
containing query string and `++fcgi-cred:for-client` auth information.
`%ford`s translation of `/=cli=/hymn/hook` to a self-refreshing `%urb` html page
[deserves its own commentary](../ford/commentary), but we resume in `%eyre`
when the `%made` sign arrives in `++take`, and soon after `++axon:ye`. There the
`wire`, or rather the `whir` it has been verified to be, determines that the
response should be served immediately. However, as the mark is not `%mime`,
another trip to `%ford` is required to encode it, on the same wire; afterwards,
the value of the `%mime` cage is verified to be of the correct type, and finally
delivered back up the requesting duct as a succesful `%thou` HTTP response.
XX `%cast %mime` used to be in ford-get-beam, is there a reason it was removed?
## Back into the breach, or: auxilary requests
Now, it was mentioned that this result is self-refreshing: the `%urb`
translation door injects a `;script@"/~/on/{deps}.js"` into every page, `deps`
is a ford-readable hash of the set of resources that page construction depended
on.
This triggers another `%this` request. Its handling is identical to that of
`/cli` up until `++parse`, where it is seen not `++as-beam` but
`++as-aux-request`(auxillary requests starting with `/~/` or `/~~/`).
`/on/[hash]` is a long-`%poll`, which `++process-parsed`, for a `.js` mark,
answers with a direct `%js`. Its contents are the static `++poll:js`, which
initiates the long-polling loop, run against an injected `urb.js` of
`{poll:[hash]}`.
A `%js` `pest` is `resolve`d as a `text/javascript` success `%this`.
When `poll.js` is recieved by the client, it opens an `XMLHttpRequest` for
`/~/on/{window.urb.poll}.json`, bringing us back to `%poll:process`.
In the case of a non-`%js` `/~/on/`, `%poll:process-parsed` turns into a
`++new-dependency`, which stores the listening duct, and `pass-note`s a `%wasp`
with the deps-hash back to `%ford` whence it came. While this occured, the page
has loaded.
Some indeterminate amount of time afterwards, with dropped `/~/on/{...}.json`s
being retried upon expiring and also being stored, a `%news` sign arrives in
`++axon`, and the hash in question is retrieved from the wire, and the listening
long-polls retrieved by the hash. Each receives a 205 "Reload parent view" HTTP
response, which `poll.js` dutifully executes, and a fixed typo of markdown is
rendered.
## Authentication.
Now, while this accurately reflects the presentation of e.g. a markdown file,
`/cli` is an application front-end, and one that permits only owner access. Its
second script is `@"/~~/~/at/main/lib/urb.js"`, semantically equivalent to
`/~/as/own/~/at/main/lib/urb.js`, and handled as follows.
In `++as-aux-request`, `%as %own` becomes `%auth %get our` perk, which
`++process` passes to `++process-parsed` passes to `++process-auth`. There, a
`yac` "ya" core is built `++for-client`: a `++cookie-prefix`, which is just the
serving ship name, is used to get a `++session-from-cookies`, here nil as the
client has no cookie set. In lieu of a cookie, a `++new-ya` is constructed, with
a random token `hole` and a `++new-cyst` which fills out `cyst` session state
from request data.
Returning to `++process-auth`, `%get` checks if the yac is authenticated with
the requested credentials(`anon` requests are always granted), which for the
fresh new `cyst` is not the case (more on success [later](#auth-ok)). Unless
authentiacting as a [foreign ship](#xeno), the only thing left is to
`++show-login-page`, which detects that the requested resource is not `%html`,
and produces a `%red` pest. For `%js`, `%red`irections `++resolve` to
`++auth-redir:js`, a line of javascript which prepends `/~~` to the url path.
The owner-authenticated main page request similarly ends in `++show-login-page`,
which for the empty session is an `[%htme ++login-page:xml]`, `resolve`d to
`++give-html` with a 401 "unathorized".
The login page shows a simple prompt, and requests `/~/at/auth.js` to handle the
submission. And so we are, once again, attempting to divine if what we're doing
makes sense `++as-aux-request`.
To understand `/~/at`, there will first be a brief diversion to `~/auth.json`.
`auth.json`, perk `[%auth %json]`, in `++process-auth` serves `++stat-json:ya`,
containing such information as the serving ship, which identities are associated
with this session, and `oryx`, a CSRF token. An oryx must be present on all
stateful requests, in this case executing a log in. It also saves the new/old
session using `abet`.
XX explain `ixor` here and not [later](#ixor)?
`/~/at` is an alternate interface, which injects `auth.json` data into the
requested file. `/~/at/auth.js`, then, is a request for the built-in `auth:js`
(parsed to and processed from an `[%auth %js ~]` perk), with session data added
as `window.urb`. And indeed, ``[`%js /~/at/auth]`` is parsed to
``[%auth at [`%js /auth]``, which in `++process-auth` is re-`process`ed to
`[%js ++auth:js]`, which is `++resolve`d after an `++add-json` of
the relevant data. The yac cookies are also passed to `resolve`, which
`++add-cookies` injects into the `httr`.
It is at this point that there is first occasion for user input, namely the password.
The `auth:js` script sends a `PUT` request, also to `/~/auth.json`. In `parse`,
the first nontrivial `++check-oryx` occurs, `++grab-body` the request oryx and
ensuring it is recorded for the session. The request parsed with `++need-body`
to a `[%auth %try {password}]` perk. `%get:process-auth` checks it against
`++load-secret`, upon success updates the session with `++logon:ya`, and
serves a fresh `auth.json` which reflects the changed `user`. Upon recieving
this, the page is refreshed to retry the original request.
## Post-authentication: app communication. [#auth-ok]
Upon refresh, `/~~/cli` brings us for the third time to `%get:process-auth`, but
this time the cookie is set, and the `yac` fetched contains the serving ship as
authenticated. The `++handle` sample is updated to reflect the requesting ship,
and the `process` continues for the rest of the pork, once again serving the
ford page.
The `/~/on/[deps].json` poll starts anew, and `/~~/~/at/main/lib/urb.js` we now
know to serve the window.urb necessary to make requests, and the `urb.js`
standard library which extends it with a number of wrappers to them and other
useful functions.
---
One of those functions is `urb.bind`, which is used to subscribe to application
data. Userspace javascript sets `urb.appl` to `/tic`, and binds `lines` to a
`;pre;` text display, using a callback.
This triggers a `PUT` to `/~/is/{ixor}/cli/lines.json`, where `ixor` is a hash
of `oryx` that identifies the connection. `++as-aux-request`, an `%is` is a
`%subs` subscription update update, which for `%put` forwards to
`++add-subs:ix`, the ix core fetched `++for-view` by hashing the request
`++oryx-to-ixor`.
[#ixor] A view has all the state associated with a client that must be
remembered between events. In this case, this is what app/path the request duct
is associated with; but mainly, `++add-subs:ix` will `pass-note` to `%gall` so
it `%show`s the data on the path, current and future.
This will immediately(assuming the ship is local) result in a `%nice` by the
`/cli` app, returning `{ok:true}` `++nice-json` to `urb.bind`'s second callback
as `{ok:true}`. The initial `%rush` results also arrive, and in `++axon` are
converted to json using `++back`(ford `%cast` wrapper), and when `%made` get
passed to `++get-rush:ix`. There the source application/path are decoded by
duct, and then the full event goes to `++get-even`; `++add-even` inserts it to
the queue, and as there is no long poll it simply stays there.
Upon receipt, the client realizes the long-poll isn't actually running, so that
is started using `urb.poll`. At `/~/of/{ixor}`, perk
`[%view ixor ~ {sequence-number}]`, it is `process`ed by `++poll:ix` (the cyst
is retrieved by `++ire-ix` form global state, using the perk `ixor`): the
sequence number is in the past, so the previously recieved `%rush` is
`++give-even`. After deleting the previous message in the queue and invoking
`++pass-took` to signal `%gall` of this occurrence, the data is annotated with
the source app+path `++subs-to-json`, and returned to the polling duct.
On the client, the user callback receives the `/cli` history, and displays it on
the page. The `/~/of` long poll is continued, this time reaching `++poll:ix`
with the "pending" sequence number, and being stored in the `cyst` for its troubles.
---
Its next update proceeds idenitcally, but first it must be triggered, which
happens when the user enters "(add 2 2)\n", firing an `urb.send` from the event
handler. This sends a `POST` request to `/~/to/cli/json.json`, perk `%mess`,
`++process`ed to a `%g %mess`. Were the mark not `%json`, a `%ford` conversion
would occur first, and `%made:axon` would send the gall message proper. In
either case, eventually a `%mean` or `%nice` arrives, is encoded as json, and
sent to the client callback.
## A path not taken: magic filenames [#mage]
The `/robots.txt` and `/favicon.(ico|png)` files are static, and served
immediately when caught by a `++parse`.
XX index.html?
## A path not taken: foreign auth [#xeno]
While this example details a login `/~/as/own`, it is possible to be
authenticated as any ship on the network. A request for such seen in
`%get:process-auth` is passed to `++foreign-auth:ya`, which sends an
`%ames /lon` message to the ship in question. The foreign ship stores the
inquiry, calculates(the local) `++our-host` and responds with a `/hat`,
containing the redirection host, which is stored by `++foreign-hat`; it is later
used to send the client to a `/~/am` url on the foreign client, which acts as a
normal login page but later sends the client back. XX expand, basically the
status quo is you're logged in and `/~/as/foo` is ignored, just setting your
`urb.user` XX
## A path not taken: deauthentication
`/~/away`, perk `[%away ~]`, produces a static `++logout-page:xml`, which also
uses `/~/at/auth.js`, to send a `DELETE /~/auth.json`, perk `[%auth %del]`. This
executes `++logoff:ya` for the cookie session, resolving to `++abut` to wipe it
from memory.
## A path not taken: unsubscription
`DELETE /~/is/app/path/within` works much like `PUT /~/is/app/path/within`,
`++del-subs:ix` acting as reverse of `++add-subs` by deleting the duct binding
and sending `%g %nuke`.
XX unmentioned arms: abet, add-poll, adit, ames-gram, anon, ares-to-json, bolo, cyst, doze, even, ford-kill, get-mean, gift, give-json, give-thou, gram, hapt, hasp, host-to-ship, ix, ixor, js, kiss, load, mean-json, move, note, pass-note, perk, perk-auth, pest, poke-test, print-subs, render-tang, resp, root-beak, scry, ses-authed, ses-ya, sign, silk, sine, stay, stem, teba, titl, to-oryx, urb, wait-era, wake, whir, wush, xml, ya, ye
## Appendix A: DNS [#dns]
The `*.urbit.org` domain can be used to access destroyers and cruisers. In the
common case oh hosted ships, this is done by dynamic DNS directly to the hosting
instance. We do not speak of the uncommon case. When ports are blocked and
infrastructure crumbles around you, only imported martian networking can be
trusted: the `%get` and `%got` [gram]()s are used to proxy [`%this` requests]() and
[`%thou` responses]() respectively.

View File

@ -47,12 +47,12 @@ machine directly.
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/1/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/1/
#### What did you just do? #### What did you just do?
The code you just wrote is urbit's native programming langauge, hoon. The code you just wrote is urbit's native programming langauge, hoon.
Generating HTML with hoon is similar to writing [jade](link) or other Generating HTML with hoon is similar to writing [jade]() or other
similar HTML shorthand. In hoon, this shorthand is called [`++sail`]() similar HTML shorthand. In hoon, this shorthand is called [`++sail`]()
and it's a native part of the hoon language. and it's a native part of the hoon language.
@ -62,7 +62,7 @@ our `;h1:` above, and are closed implicitly with a new line. Nodes with
no content are closed with another `;`, such as `;br;`. no content are closed with another `;`, such as `;br;`.
You can find more information about `++sail` in our [rune library You can find more information about `++sail` in our [rune library
documentation](link). documentation]().
<hr> <hr>
</hr> </hr>
@ -90,7 +90,7 @@ documentation](link).
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/2/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/2/
### What's going on there? ### What's going on there?
@ -98,7 +98,7 @@ Clearly, the code `(add 2 2)` is generating `4`, and it's not too hard
to see why. `add` is one of the library functions that are a part of to see why. `add` is one of the library functions that are a part of
`hoon.hoon`. Try replacing `(add 2 2)` with `(sub 2 (add 2 2))`. You can `hoon.hoon`. Try replacing `(add 2 2)` with `(sub 2 (add 2 2))`. You can
find documentation for the full hoon library in the [library find documentation for the full hoon library in the [library
reference](link). reference]().
Since the product of `(add 2 2)` is a number, we need a few extra things Since the product of `(add 2 2)` is a number, we need a few extra things
to have it print properly. In `++sail` we use `{` and `}` to do string to have it print properly. In `++sail` we use `{` and `}` to do string
@ -140,7 +140,7 @@ we need to explicitly convert our types.
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/3/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/3/
#### How does that work? #### How does that work?
@ -148,9 +148,9 @@ The first thing you should notice in this example is the `=+` at the top
of our file. `=+` is a rune. hoon is a programming with no reserved of our file. `=+` is a rune. hoon is a programming with no reserved
words. We don't use `if` `this` or `function` at all. Instead, runes words. We don't use `if` `this` or `function` at all. Instead, runes
have their own pronunciation. `=+` is pronounced 'tislus'. You can find have their own pronunciation. `=+` is pronounced 'tislus'. You can find
the table of pronunciation [here](link). In hoon you construct your the table of pronunciation [here](). In hoon you construct your
programs using runes, which are two character ascii pairs. You can see programs using runes, which are two character ascii pairs. You can see
the whole set of runes in the [rune index](link). the whole set of runes in the [rune index]().
`=+` pushes an expression on to our subject. The subject in hoon is `=+` pushes an expression on to our subject. The subject in hoon is
similar to `this` in other languages. hoon being a functional language similar to `this` in other languages. hoon being a functional language
@ -168,7 +168,7 @@ Looking at the rendered page it's clear that we're assigning `a` to be
we're doing this in two different ways. Runes in hoon can have irregular we're doing this in two different ways. Runes in hoon can have irregular
forms, and `^=` is one of them. The first two lines of our example are forms, and `^=` is one of them. The first two lines of our example are
doing the same thing, where `a=2` is simply the irregular form of doing the same thing, where `a=2` is simply the irregular form of
`^= a 2`. You can see the full list of irregular forms [here](link). `^= a 2`. You can see the full list of irregular forms [here]().
Looking at the simple computation on the page, you can try changing the Looking at the simple computation on the page, you can try changing the
values of `a` and `b` to any integers to produce similar results. values of `a` and `b` to any integers to produce similar results.
@ -212,7 +212,7 @@ values of `a` and `b` to any integers to produce similar results.
(and be sure to put two spaces between `++` and arm names) (and be sure to put two spaces between `++` and arm names)
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/4/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/4/
### What's happening? ### What's happening?
@ -229,7 +229,7 @@ core. Gates only have one arm and are quite similar to a function in
other languages. We use `|=` to construct our gate. Runes in hoon are other languages. We use `|=` to construct our gate. Runes in hoon are
generally categorized by their first character. `|` indicates a rune generally categorized by their first character. `|` indicates a rune
having to do with cores. You can find all of the `|` runes in the [rune having to do with cores. You can find all of the `|` runes in the [rune
library](link). library]().
Our `++length` [gate]() takes two arguments, `s` and `e`. In hoon we Our `++length` [gate]() takes two arguments, `s` and `e`. In hoon we
call the data passed in to a gate the 'sample'. Every `|=` has two call the data passed in to a gate the 'sample'. Every `|=` has two
@ -241,7 +241,7 @@ computes the difference between `e` and `s`.
`@ud` is an odor. Odors aren't quite types, but they're similar. You'll `@ud` is an odor. Odors aren't quite types, but they're similar. You'll
learn the difference by example as we progress, and you can always refer learn the difference by example as we progress, and you can always refer
to the [odor index](link). to the [odor index]().
You probably also noticed our indentation. In general hoon has both tall You probably also noticed our indentation. In general hoon has both tall
and wide forms. In tall form, hoon uses two spaces for indentation and and wide forms. In tall form, hoon uses two spaces for indentation and
@ -282,7 +282,7 @@ margin. In wide form we use parenthesis just like almost everyone else.
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/5/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/5/
#### What's the difference? #### What's the difference?
@ -301,7 +301,7 @@ At a high level you can think of hoon as being composed of two things,
tiles and twigs. Twigs are the actual AST structures that get consumed tiles and twigs. Twigs are the actual AST structures that get consumed
by the compiler. Tiles reduce to twigs and provide major affordances for by the compiler. Tiles reduce to twigs and provide major affordances for
the programmer. If you're interested in learning about tiles more deeply the programmer. If you're interested in learning about tiles more deeply
you can find an in-depth explanation in the [tile overview](link). you can find an in-depth explanation in the [tile overview]().
It should suffice, for now, to say that we create tiles in the same way It should suffice, for now, to say that we create tiles in the same way
that you would think of creating type definitions in another language. that you would think of creating type definitions in another language.
@ -325,7 +325,7 @@ you're usually familiar with. We still separate our addressing with `.`,
but do it from the inside out. Given a tuple such as but do it from the inside out. Given a tuple such as
`[a=1 b=[c=[d=2 e=3]]]` we can address the value of `e` with `e.c.b`. `[a=1 b=[c=[d=2 e=3]]]` we can address the value of `e` with `e.c.b`.
You can read more about how faces work in the commentary on `++type` You can read more about how faces work in the commentary on `++type`
[here](link). [here]().
<hr> <hr>
</hr> </hr>
@ -362,11 +362,11 @@ You can read more about how faces work in the commentary on `++type`
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/6/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/6/
#### What is that doing? #### What is that doing?
We're printing a few members of the [fibonacci sequence](link) by We're printing a few members of the [fibonacci sequence]() by
calling our arm `++fib` with a few values. The fibonacci sequence is a calling our arm `++fib` with a few values. The fibonacci sequence is a
fairly straight forward algorithm: `F(n-1) + F(n-2)` where `F(1) = 1` fairly straight forward algorithm: `F(n-1) + F(n-2)` where `F(1) = 1`
and `F(2) = 1`. As is obvious from the formula, generating the fibonacci and `F(2) = 1`. As is obvious from the formula, generating the fibonacci
@ -375,10 +375,10 @@ the code.
Our example here should look similar to the previous one. We build a Our example here should look similar to the previous one. We build a
core with `|%` and add the arm `++fib`. `++fib` is a gate which takes core with `|%` and add the arm `++fib`. `++fib` is a gate which takes
one argument `x`, an atom. Using [`?:`](link) we test if `x` is less one argument `x`, an atom. Using [`?:`]() we test if `x` is less
than `2` with the library function [`lte`](link) to handle our seed than `2` with the library function [`lte`]() to handle our seed
values of `F(1) = 1` and `F(2) = 1`. `?:` is a member of the [`?` values of `F(1) = 1` and `F(2) = 1`. `?:` is a member of the [`?`
runes](link), related to true / false values, or loobeans. In hoon true runes](), related to true / false values, or loobeans. In hoon true
and false are `0` and `1` respectively and take the odor `@f`. We tend and false are `0` and `1` respectively and take the odor `@f`. We tend
to say 'yes' and 'no' instead of 'true' and 'false' to keep track of the to say 'yes' and 'no' instead of 'true' and 'false' to keep track of the
switch. Our built-in function `lte` produces a loobean, so we evaluate switch. Our built-in function `lte` produces a loobean, so we evaluate
@ -389,7 +389,7 @@ We mentioned previously that a gate is a special kind of core with only
one arm, called `$`. Here we're using `$` to mimic the behavior of a one arm, called `$`. Here we're using `$` to mimic the behavior of a
loop. You can read the expression `$(x (dec x))` as 'call the gate again loop. You can read the expression `$(x (dec x))` as 'call the gate again
with `x` replaced by `(dec x)`. For more on how this works, check out with `x` replaced by `(dec x)`. For more on how this works, check out
the documentation of [`%=`](link) and [`%-`](link). With that in mind it the documentation of [`%=`]() and [`%-`](). With that in mind it
should be clear how the last line of `++fib` produces the member of the should be clear how the last line of `++fib` produces the member of the
sequence at a given value `x`. sequence at a given value `x`.
@ -431,7 +431,7 @@ sequence at a given value `x`.
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/7/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/7/
http://ship-name.urbit.org/gin/del/main/pub/fab/guide/exercise/7/ http://ship-name.urbit.org/gin/del/main/pub/fab/guide/exercise/7/
Here we're putting our publishing framework, `%ford` to work a little Here we're putting our publishing framework, `%ford` to work a little
@ -447,19 +447,19 @@ They belong at the top of the file.
`/?` simply checks for compatibility. In this case the line means 'need `/?` simply checks for compatibility. In this case the line means 'need
urbit 314 or below', or in hoon: `(lte zuse 314)`. `314` is the number urbit 314 or below', or in hoon: `(lte zuse 314)`. `314` is the number
in the kelvin versioning system, which you can read about [here](link). in the kelvin versioning system, which you can read about [here]().
`/=` is similar to the combination of `=+ =^`, or assignment. `/$` `/=` is similar to the combination of `=+ =^`, or assignment. `/$`
calls a parsing function, which we specify as [`++fuel`](link) with the calls a parsing function, which we specify as [`++fuel`]() with the
[`++beam`](link) and [`++path`](link) of our current file. [`++beam`]() and [`++path`]() of our current file.
`/= gas /$ fuel` is a common way to open your page, since the `/= gas /$ fuel` is a common way to open your page, since the
product of `++fuel` is useful when writing pages to the web. The use of product of `++fuel` is useful when writing pages to the web. The use of
`++fuel` is not enforced — you can also write your own parser. `++fuel` is not enforced — you can also write your own parser.
Our page is made up of two generated parts: who requested the page, the Our page is made up of two generated parts: who requested the page, the
location of the page and its revision. Both are parsed out of the `gas` location of the page and its revision. Both are parsed out of the `gas`
variable using some straightforward library functions, [`++ju`](link), variable using some straightforward library functions, [`++ju`](),
[`++spud`](link) and [`++scow`](link). You can follow those links to the [`++spud`]() and [`++scow`](). You can follow those links to the
library reference to learn more about them. You'll also notice our library reference to learn more about them. You'll also notice our
addressing moving in the opposite direction as you may be used to. addressing moving in the opposite direction as you may be used to.
`aut.ced.gas` pulls `aut` from inside `ced` from inside `gas`. `aut.ced.gas` pulls `aut` from inside `ced` from inside `gas`.
@ -468,13 +468,13 @@ Inside of the `;code` tag we also print (for our own reference) the
entire `gas`, so you can take a look at the contents. This can be a entire `gas`, so you can take a look at the contents. This can be a
helpful trick when debugging. To fully understand what gets put in helpful trick when debugging. To fully understand what gets put in
`gas`, we can take a look at `++fuel` and note that it produces a `gas`, we can take a look at `++fuel` and note that it produces a
[`++epic`](link), which also contains a [`++cred`](link). You can follow [`++epic`](), which also contains a [`++cred`](). You can follow
those links to learn more about them. those links to learn more about them.
When we try changing the url from `gen/main` to `gin/del/main` we're When we try changing the url from `main` to `gin/del/main` we're
using some of the access methods from `%eyre` (the urbit webserver) to using some of the access methods from `%eyre` (the urbit webserver) to
pretend to be the urbit `~del`. You can find documentation on those pretend to be the urbit `~del`. You can find documentation on those
access methods in the `%eyre` commentary, [here](link). access methods in the `%eyre` commentary, [here]().
Path and identity are useful, but there are some other parameters worth Path and identity are useful, but there are some other parameters worth
checking out as well. checking out as well.
@ -510,8 +510,8 @@ checking out as well.
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/8/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/8/
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/8/?code=yes-i-do http://ship-name.urbit.org/main/pub/fab/guide/exercise/8/?code=yes-i-do
This is a simple example, showing off another use of This is a simple example, showing off another use of
`/= gas /$ fuel`. In this case we're just pulling out the value of `/= gas /$ fuel`. In this case we're just pulling out the value of
@ -519,10 +519,10 @@ the `code` query string parameter. You should be able to change that
value to any url-safe string and see it appear on the page. value to any url-safe string and see it appear on the page.
We're using a few simple library functions to actually pull the value We're using a few simple library functions to actually pull the value
out, [`++fall`](link) and [`get:by`](link). Query string parameters are out, [`++fall`]() and [`get:by`](). Query string parameters are
stored in `qix.gas` as a `++map`, one of the main container constructs stored in `qix.gas` as a `++map`, one of the main container constructs
used in hoon. We'll encounter a lot of maps along the way, and you can used in hoon. We'll encounter a lot of maps along the way, and you can
learn more about them in the [map section](link) of the library doc. learn more about them in the [map section]() of the library doc.
<hr> <hr>
</hr> </hr>
@ -569,7 +569,7 @@ learn more about them in the [map section](link) of the library doc.
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/9/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/9/
#### How are they getting combined? #### How are they getting combined?
@ -598,7 +598,8 @@ In order to find our file one level up we need two `%%` to get to
`/pub/fab/guide/exercise/9/`. Adding `lib` resolve to our neighboring `/pub/fab/guide/exercise/9/`. Adding `lib` resolve to our neighboring
file. You can read more about how `%clay` paths are parsed in the file. You can read more about how `%clay` paths are parsed in the
[`%clay` overview](link). It's also pretty easy to try them out using [`%clay` overview](link). It's also pretty easy to try them out using
`:cd` and `:ls` in your `%arvo` terminal. `/=main=`, `/=try`, `/try/a/b/c/d`, etc.
and `:ls` in your `%arvo` terminal.
<hr> <hr>
</hr> </hr>
@ -652,9 +653,9 @@ file. You can read more about how `%clay` paths are parsed in the
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/10/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/10/
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/10/?number=7 http://ship-name.urbit.org/main/pub/fab/guide/exercise/10/?number=7
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/10/?number=12 http://ship-name.urbit.org/main/pub/fab/guide/exercise/10/?number=12
As you can see by changing the URL, we're now passing our query string As you can see by changing the URL, we're now passing our query string
parameter to our `++fib` script and printing the output. It's common to parameter to our `++fib` script and printing the output. It's common to
@ -670,21 +671,21 @@ remaining computation. In short, you can read the code that produces
runes to write this in tall form. `%` runes are used for calling gates runes to write this in tall form. `%` runes are used for calling gates
or evaluating changes. `%+` 'slams' or calls a gate with two arguments, or evaluating changes. `%+` 'slams' or calls a gate with two arguments,
and `%-` 'slams' or calls a gate with one argument. As usual, you can and `%-` 'slams' or calls a gate with one argument. As usual, you can
find more about the `%` runes in the [`%` section](link) of the rune find more about the `%` runes in the [`%` section]() of the rune
library. library.
To get a value out of our map of query string parameters `qix.gas` we To get a value out of our map of query string parameters `qix.gas` we
use a method from the [maps library](link) that produces a `++unit`. use a method from the [maps library]() that produces a `++unit`.
`++unit`s are a common type in hoon used for optional values. A `++unit`s are a common type in hoon used for optional values. A
[`++unit`](link) is either `~` or `[~ p=value]`. Since we need to [`++unit`]() is either `~` or `[~ p=value]`. Since we need to
specify a value for `(fib arg)` even when someone doesn't enter the specify a value for `(fib arg)` even when someone doesn't enter the
query string we use [`++fall`](link), which produces either the value of query string we use [`++fall`](), which produces either the value of
the unit, or the second argument if the `++unit` is null. Since our the unit, or the second argument if the `++unit` is null. Since our
`qix.gas` has string values in it we specify a string in our second `qix.gas` has string values in it we specify a string in our second
argument, `'0'`. As an aside, `'0'` is different from `"0"` in hoon. You argument, `'0'`. As an aside, `'0'` is different from `"0"` in hoon. You
can read about the difference in [`++cord`](link) and [`++tape`](link). can read about the difference in [`++cord`]() and [`++tape`]().
Our outermost call, to [`++slav`](link), casts our string to a `@ud` Our outermost call, to [`++slav`](), casts our string to a `@ud`
which is the type expected by `++fib`. `++slav` takes the name of an which is the type expected by `++fib`. `++slav` takes the name of an
odor and a value, and tries to cast the value to that odor. odor and a value, and tries to cast the value to that odor.
@ -742,9 +743,9 @@ odor and a value, and tries to cast the value to that odor.
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/11/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/11/
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/11/lib/1/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/11/lib/1/
http://ship-name.urbit.org/gen/main/pub/fab/guide/exercise/11/lib/2/ http://ship-name.urbit.org/main/pub/fab/guide/exercise/11/lib/2/
#### Experiment with it #### Experiment with it
@ -764,7 +765,7 @@ If we take the next few lines and write them as pseudo code in wide form
they might look something like this, `(/; [gate] (/@ /psal/))`. That they might look something like this, `(/; [gate] (/@ /psal/))`. That
being the case, let's start at the bottom and move upwards since that's being the case, let's start at the bottom and move upwards since that's
how our data flows. In depth documentation on individual `++horn` runes how our data flows. In depth documentation on individual `++horn` runes
can be found in the [horn section of the rune library](link). can be found in the [horn section of the rune library]().
`/psal/` loads our `psal` mark. Marks are like content types, and we `/psal/` loads our `psal` mark. Marks are like content types, and we
keep them in `/main/mar/`. You can open `/main/mar/psal/door.hook` to keep them in `/main/mar/`. You can open `/main/mar/psal/door.hook` to
@ -776,16 +777,16 @@ where `mark` exists in the `/main/mar/` directory. A `psal` is a partial
`/@` loads a list of files in numerical order from the previously `/@` loads a list of files in numerical order from the previously
specified `++beam` using our mark, `psal`. `/@` has a few close specified `++beam` using our mark, `psal`. `/@` has a few close
relatives. `/&`, for example, reads files by `@da` or absolute date. You relatives. `/&`, for example, reads files by `@da` or absolute date. You
can see the rest in the [horn section of the library](link). can see the rest in the [horn section of the library]().
`/;` takes the output from `/@` and `/psal/` and passes it to a twig. In `/;` takes the output from `/@` and `/psal/` and passes it to a twig. In
this case, a gate. Our `/@` actually produces a [`++list`](link) of this case, a gate. Our `/@` actually produces a [`++list`]() of
pairs of `[@ manx]` where the `@` is the filename, and the `manx` is the pairs of `[@ manx]` where the `@` is the filename, and the `manx` is the
converted contents. We use [`++turn`](link), one of our `++list` converted contents. We use [`++turn`](), one of our `++list`
operator functions, to iterate through the list and produce only a list operator functions, to iterate through the list and produce only a list
of `++manx`. This is the output assigned to `posts`. of `++manx`. This is the output assigned to `posts`.
Then, further down, we use [`;*`](link) to write the list to the page. Then, further down, we use [`;*`]() to write the list to the page.
<hr> <hr>
</hr> </hr>
@ -800,7 +801,7 @@ Then, further down, we use [`;*`](link) to write the list to the page.
#### Try it #### Try it
http://ship-name.urbit.org/gen/main/pub/fab/guide/ http://ship-name.urbit.org/main/pub/fab/guide/
#### Bring it all together #### Bring it all together

View File

@ -34,7 +34,7 @@ under the corresponding paths. You will need four files:
When everything is in place, try it: When everything is in place, try it:
http://localhost:8080/gen/main/pub/lead/ http://localhost:8080/main/pub/lead/
That URL should render a page and be self explanatory. Try adding names That URL should render a page and be self explanatory. Try adding names
to the leaderboard and incrementing their scores. It's also fun to open to the leaderboard and incrementing their scores. It's also fun to open
@ -63,7 +63,7 @@ Our application-specific resources are stored in `/main/pub/lead/src/`.
`/main/pub/lead/src/main.js` updates the page and sends data. `/main/pub/lead/src/main.js` updates the page and sends data.
We also use two utility scripts: `/gop/hart.js` and We also use two utility scripts: `/gop/hart.js` and
`/gen/main/lib/urb.js`. These are the standard libraries for handling `/main/lib/urb.js`. These are the standard libraries for handling
data transfer from a browser to Urbit, and are very frequently used. data transfer from a browser to Urbit, and are very frequently used.
`hart.js` handles the page heartbeat, making regular AJAX requests so we `hart.js` handles the page heartbeat, making regular AJAX requests so we
can keep track of subscribers, and `urb.js` offers a more complete set can keep track of subscribers, and `urb.js` offers a more complete set

View File

@ -62,13 +62,13 @@ repeated child node `'repeat'`. [`++poxo`]() prints our result in XML.
;= ;=
;% |=(a=marl (turn a |=(b=manx ;script(src (poxo b));))) ;% |=(a=marl (turn a |=(b=manx ;script(src (poxo b));)))
; /gep/hart.js ; /gep/hart.js
; /gen/main/lib/urb.js ; /main/lib/urb.js
; //cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js ; //cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js
== ==
~[ ~[
[[%script [%src "/gep/hart.js [[%script [%src "/gep/hart.js
"] ~] ~] "] ~] ~]
[[%script [%src "/gen/main/lib/urb.js [[%script [%src "/main/lib/urb.js
"] ~] ~] "] ~] ~]
[ [ %script [ [ %script
[%src "//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js [%src "//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js
@ -83,10 +83,10 @@ repeated child node `'repeat'`. [`++poxo`]() prints our result in XML.
;= ;=
;% |=(a=marl (turn a |=(b=manx ;script(src (poxo b));))) ;% |=(a=marl (turn a |=(b=manx ;script(src (poxo b));)))
; /gep/hart.js ; /gep/hart.js
; /gen/main/lib/urb.js ; /main/lib/urb.js
; //cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js ; //cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js
== ==
"<script src="/gep/hart.js"></script><script src="/gen/main/lib/urb.js"></script><script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js"></script>" "<script src="/gep/hart.js"></script><script src="/main/lib/urb.js"></script><script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js"></script>"
Here we go through a similar example, passing a list of urls for a Here we go through a similar example, passing a list of urls for a
script tag to a gate that produces a `<script>` tag. Since we produce script tag to a gate that produces a `<script>` tag. Since we produce

View File

@ -14,13 +14,13 @@
;script:''' ;script:'''
try{Typekit.load();}catch(e){} try{Typekit.load();}catch(e){}
''' '''
;link(type "text/css", rel "stylesheet", href "/gen/main/pub/radio/src/main.css"); ;link(type "text/css", rel "stylesheet", href "/main/pub/radio/src/main.css");
;script(type "text/javascript", src "/gop/hart.js"); ;script(type "text/javascript", src "/gop/hart.js");
;title: Radio ;title: Radio
== ==
;body ;body
;div#c; ;div#c;
;script(type "text/javascript", src "/gen/main/lib/urb.js"); ;script(type "text/javascript", src "/main/lib/urb.js");
;script(type "text/javascript", src "/gen/main/pub/radio/src/main.js"); ;script(type "text/javascript", src "/main/pub/radio/src/main.js");
== ==
== ==

165
main/pub/sole/fab/hymn.hook Normal file
View File

@ -0,0 +1,165 @@
:: Console front-end
::
:::: /hook/hymn/fab/sole/pub
::
/? 310
|%
++ cdnj |=(a=tape ;script(src "//cdnjs.cloudflare.com/ajax/libs/{a}");)
--
::
::::
::
^- manx
;html
;head
;title: Sole
;* %- turn :_ cdnj ^- wall
:~ "jquery/2.1.1/jquery.min.js"
"mousetrap/1.4.6/mousetrap.js"
"react/0.11.0/react.js"
==
;script(src "/~/at/main/lib/urb.js");
;script: urb.appl = 'dojo'
;style:'''
#term {
width: 100%;
}
#term * {
margin: 0px;
}
'''
==
;body
;div#err;
;div#term:""
;script(type "text/coffeescript") ;- %- trip
'''
[DOM,recl,rend] = [React.DOM, React.createClass, React.renderComponent]
[div, pre] = [DOM.div, DOM.pre]
Matr = recl render: ->
[pro,cur] = [@props.prompt + " ", @props.cursor + 1]
prompt = "#{pro.slice(0,cur)}\u0332#{pro.slice(cur)}"
lines = [prompt, @props.rows...]
div {}, lines.slice().reverse().map (lin)->
pre {}, lin
$ ->
termRev = 0
pressed = []
deltim = null
met = $('<pre>').text('m').css(display: 'none').appendTo(term).width()
subs = ""
# $(window).resize ->
# window.termWif = ($(term).width() / met).toFixed()
# path = "/new/#{termWif}"
# if path is subs
# return
# if subs
# urb.unsubscribe {path:subs}
# subs = path
# urb.subscribe {path}, (err,dat)->
# if err or dat.data.ok
# return;
# syncRev = dat.data.rev
# unless termRev > syncRev
# termRev = syncRev
# matr.setProps rows: dat.data.stak
# document.title = "Matrix" # XX debug
# $(window).resize()
matr = rend (Matr rows:[], prompt:"", cursor:1), term
flash = ($el, background)->
$el.css {background}
if background
setTimeout (()-> flash $el,''), 50
peer = (ruh) ->
switch false
when !ruh.map then ruh.map peer
# when !ruh.pro then matr.setProps prompt: ruh.pro
# when !ruh.hop then matr.setProps cursor: ruh.hop
# when !ruh.out
# matr.setProps rows: [ruh.out, matr.props.rows...]
# when !ruh.act then switch ruh.act
# when 'clr' then matr.setProps rows:[]
# when 'bel' then flash ($ 'body'), 'black'
# else throw "Unknown "+(JSON.stringify ruh)
else console.log ruh
urb.bind "/sole", {wire:"/"}, (err,d)->
if d.data then peer d.data
#later = (data)->
# if data
# pressed.push data
# clearTimeout deltim
# setTimeout (->
# if urb.reqq.length > 0
# return deltim = later()
# urb.send data: pressed
# pressed = []
# ), 500
Mousetrap.handleKey = (char, mod, e)->
norm = {
capslock: 'caps'
pageup: 'pgup'
pagedown: 'pgdn'
backspace: 'baxp'
enter: 'entr'
}
key =
if char.length is 1
if e.type is 'keypress'
str: char
else if e.type is 'keydown'
if char isnt 'space'
act: norm[char] ? char
else if e.type is 'keyup' and norm[key] is 'caps'
act: 'uncap'
if key
e.preventDefault()
urb.send mark: 'dill-belt', data: {mod,key}
# amod = (arr)->
# for i in arr
# unless mod.indexOf(i) < 0
# return yes
# no
# if key.str or key.act is 'baxp' or key.act is 'entr'
# termRev++
# [bot, rest...] = old = matr.props.rows
# matr.setProps rows:(
# switch key.act
# when 'baxp'
# if amod ['ctrl', 'meta']
# ['', rest...]
# else if amod ['alt']
# [(bot.replace /\ *[^ ]*$/, ''), rest...]
# else if bot and bot.length
# [bot.slice(0, -1), rest...]
# else if rest[0] and rest[0].length
# res = rest.slice()
# res[0] = res[0].slice(0, -1)
# res
# else rest
# when 'entr'
# ['', old...]
# when undefined
# if mod.length > 1 or (mod.length and !amod ['shift'])
# old
# else unless old and bot isnt null
# [key.str]
# #else if bot.length is termWif
# # [key.str, old...]
# else [bot + key.str, rest...]
# )
# document.title = "Matri" # XX debug
# later {mod, key}
'''
==
;+ (cdnj "coffee-script/1.7.1/coffee-script.min.js")
== ==

View File

@ -5,7 +5,7 @@
;script(type "text/javascript", src "/gep/hart.js"); ;script(type "text/javascript", src "/gep/hart.js");
== ==
;body ;body
;script(type "text/javascript", src "/gen/main/lib/urb.js"); ;script(type "text/javascript", src "/main/lib/urb.js");
;script(type "text/javascript", src "/gen/main/pub/src/radio/main.js"); ;script(type "text/javascript", src "/main/pub/src/radio/main.js");
== ==
== ==

View File

@ -2,22 +2,34 @@
:: ::
:::: /hook/hymn/fab/chat/pub/ :::: /hook/hymn/fab/chat/pub/
:: ::
|%
++ cdnj
|= a=wall ^- marl
%+ turn a
|= lib=tape
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/{lib}");
--
::
::::
::
^- manx ^- manx
;html ;html
;head ;head
;meta(charset "utf-8"); ;meta(charset "utf-8");
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js"); ;* %- cdnj :~
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"); "jquery/2.1.1/jquery.js"
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/react/0.12.1/react.js"); "lodash.js/2.4.1/lodash.min.js"
;script(type "text/javascript", src "/gen/main/pub/talk/src/js/dep/director.js"); "react/0.13.1/react.js"
;meta(name "viewport", content "width=432, initial-scale=1"); ==
;link(type "text/css", rel "stylesheet", href "/gen/main/pub/talk/src/css/main.css"); :: remove /~~ for anon
;script(type "text/javascript", src "/gop/hart.js"); ;script(type "text/javascript", src "/~~/~/at/main/lib/urb.js");
;meta(name "viewport", content "width=device-width, height=device-height, ".
"initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0");
;link(type "text/css", rel "stylesheet", href "/main/pub/talk/src/css/main.css");
;title: Radio ;title: Radio
== ==
;body ;body
;div#c; ;div#c;
;script(type "text/javascript", src "/gen/main/lib/urb.js"); ;script(type "text/javascript", src "/main/pub/talk/src/js/main.js");
;script(type "text/javascript", src "/gen/main/pub/talk/src/js/main.js");
== ==
== ==

View File

@ -70,3 +70,15 @@
font-weight: 500; font-weight: 500;
font-style: normal; font-style: normal;
} }
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-bold.woff");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-black.woff");
font-weight: 700;
font-style: normal;
}

View File

@ -70,10 +70,25 @@
font-weight: 500; font-weight: 500;
font-style: normal; font-style: normal;
} }
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-bold.woff");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: "scp";
src: url("http://storage.googleapis.com/urbit-extra/scp-black.woff");
font-weight: 700;
font-style: normal;
}
.iden, .iden,
.audi, .audi,
.time, .time,
#length { #length,
#where,
#who,
.station {
font-family: "scp"; font-family: "scp";
} }
.join-ctrl input { .join-ctrl input {
@ -92,14 +107,22 @@ body {
.time { .time {
font-size: 0.6rem; font-size: 0.6rem;
letter-spacing: 0; letter-spacing: 0;
}
.time {
font-weight: 200; font-weight: 200;
} }
#length {
font-weight: 500;
}
input.join, input.join,
.iden, .iden,
.audi, .audi,
#station { #station {
font-size: 0.7rem; font-size: 0.7rem;
} }
.iden {
font-weight: 600;
}
html, html,
body { body {
font-size: 18px; font-size: 18px;
@ -113,124 +136,148 @@ body {
display: none; display: none;
} }
#c { #c {
top: 0;
background-color: #fff;
}
#stations-container {
position: absolute; position: absolute;
top: 1rem; top: 0rem;
left: 50%; left: 50%;
width: 24rem; width: 58rem;
margin-left: -12rem; margin-left: -29rem;
font-size: 4rem; margin-bottom: 12rem;
} }
#station-container { #station-container {
position: fixed; position: fixed;
top: 0; width: 58rem;
left: 50%; max-height: 2.7rem;
width: 28rem; background-color: #fff;
max-height: 2.6rem; border-bottom: 0.3rem solid #000;
padding-bottom: 1rem;
overflow: hidden; overflow: hidden;
margin-left: -14rem; z-index: 10;
-webkit-transition: max-height 0.2s;
}
#station #station-container {
padding-top: 1rem; padding-top: 1rem;
background-color: #f5f5f5; min-width: 30rem;
border-bottom: 3px solid #ededed; text-align: right;
transition: max-height 0.15s ease-out;
} }
#station-container:hover { #writing-container {
max-height: 12rem; bottom: 4rem;
transition: max-height 0.25s ease-in;
}
#stations-container,
#messages-container {
vertical-align: top;
}
#messaging-container {
position: absolute;
top: 4rem;
left: 50%;
width: 24rem;
margin-left: -12rem;
margin-bottom: 4rem;
}
#station > div {
display: inline-block;
}
#station-meta {
margin-right: 1rem;
margin-bottom: 1rem; margin-bottom: 1rem;
} }
#sources-container { #messages-container {
width: 6rem; vertical-align: top;
float: right; margin-top: 4rem;
margin: 1rem -6rem 0 0;
} }
#members { .caret,
margin-left: 2rem; .circle {
}
#station .iden {
display: block;
}
.station {
display: inline-block; display: inline-block;
width: 9rem;
margin-bottom: 0.3rem;
cursor: pointer;
font-weight: 200;
} }
#stations .station { .caret {
display: block; width: 0;
width: 24rem; height: 0;
} border-top: 6px solid transparent;
.station .name { border-right: 6px solid transparent;
padding: 0.3rem;
border-bottom: 6px solid transparent; border-bottom: 6px solid transparent;
border-left: 6px solid #000;
margin-top: 2px;
} }
.station .name:hover { .circle {
background-color: #f5f5f5; width: 6px;
border-bottom: 6px solid #ededed; height: 6px;
border: 3px solid #000;
border-radius: 6px;
margin-top: 2px;
} }
.station > div { #station-container #where .caret {
-webkit-transform: rotate(0deg);
-webkit-transform-origin: 0 50%;
-webkit-transition: -webkit-transform 0.2s;
}
#head {
width: 100%;
height: 4rem;
}
#station-container h1 {
font-weight: 500;
font-size: 0.6rem;
letter-spacing: 0.06rem;
display: inline-block; display: inline-block;
line-height: 1.2rem;
} }
.toggle { #audience,
width: 0.4rem; #who {
height: 0.4rem; width: 34.6rem;
border: 2px solid #000;
margin-right: 0.6rem;
} }
.toggle.active { #stations,
background-color: #000; #where {
width: 17.3rem;
}
#stations,
#audience,
#head > div {
display: inline-block;
text-align: right;
vertical-align: top;
}
#head > div {
height: 2rem;
margin-top: 1.5rem;
}
#where .caret {
border-left-color: #f00;
margin-left: 1rem;
}
#where > span,
#who > span {
vertical-align: top;
}
#who > span {
margin-left: 1rem;
}
#members > div {
display: block;
}
#members > div div {
display: inline-block;
vertical-align: bottom;
}
#members .audi {
margin-right: 0.3rem;
}
#members .iden {
min-width: 10rem;
}
.station div {
display: inline-block;
} }
.station .remove { .station .remove {
display: none; opacity: 0;
float: right; cursor: pointer;
margin-left: 1rem; width: 0.6rem;
margin-right: 0.6rem;
font-weight: 600; font-weight: 600;
color: #f00; color: #f00;
} }
.station:hover .remove { .station:hover .remove {
display: inline; opacity: 1;
} }
#sources-container .station {
font-family: "scp";
font-weight: 500;
text-transform: lowercase;
}
.sour-ctrl {
margin-bottom: 0.16rem;
}
.join-ctrl input,
.sour-ctrl input { .sour-ctrl input {
font-family: "scp";
border: none; border: none;
font-weight: 400; font-weight: 400;
text-align: right;
line-height: 1rem;
outline: none;
cursor: pointer;
} }
.sour-ctrl input::-webkit-input-placeholder { .sour-ctrl input::-webkit-input-placeholder {
font-family: "bau"; font-family: "scp";
font-size: 1rem; font-size: 1rem;
font-weight: 200; font-weight: 600;
margin-left: 0.6rem; margin-left: 0.6rem;
color: #0003ff; color: #000;
}
.sour-ctrl input:focus::-webkit-input-placeholder {
color: #fff;
} }
.message { .message {
padding-top: 0.3rem; padding-top: 0.3rem;
@ -245,8 +292,9 @@ body {
#messages .message:hover .time { #messages .message:hover .time {
opacity: 1; opacity: 1;
} }
.time { #messages .message .ship,
margin-right: 0.6rem; #messages .message .audi > div {
cursor: pointer;
} }
.member { .member {
width: 12rem; width: 12rem;
@ -255,55 +303,90 @@ body {
#messages { #messages {
height: auto; height: auto;
} }
.message.pending {
color: #ccc;
}
.message.say .mess {
font-style: italic;
}
a {
text-decoration: underline;
color: inherit;
}
.mess, .mess,
.iden, .iden,
.attr > div,
#station .member div, #station .member div,
#writing { #writing {
display: inline-block; display: inline-block;
} }
.iden > div {
display: inline;
}
.mess, .mess,
#writing, #writing,
#length { #length {
vertical-align: top; vertical-align: top;
} }
.attr > div {
max-width: 16rem;
}
.attr { .attr {
color: #d7d7d7; text-align: right;
display: inline-block;
margin-right: 0.3rem;
min-width: 16rem;
} }
.attr .iden { .attr .iden {
color: #000; margin-left: 0.3rem;
} }
.attr > div { .audi {
white-space: nowrap;
}
.audi > div {
margin-right: 0.3rem; margin-right: 0.3rem;
max-width: 8rem;
}
.iden > div {
max-width: 10rem;
}
.iden > div,
.audi > div {
display: inline-block;
background-color: #fff;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
-webkit-transition: max-width 0.2s;
}
.audi > div:last-child {
margin-right: 0;
}
.iden > div:hover,
.audi > div:hover {
position: relative;
-webkit-transition: max-width 0.2s;
} }
.mess { .mess {
font-size: 0.9rem; font-size: 0.9rem;
line-height: 1.6rem;
letter-spacing: 0.03rem; letter-spacing: 0.03rem;
word-wrap: break-word; word-wrap: break-word;
max-width: 31rem; margin-left: 0.3rem;
} }
.ship { .mess,
font-weight: 600; #writing,
.iden > div:hover,
.audi > div:hover {
max-width: 30rem;
} }
.ship.talk:before { #writing {
content: "..."; font-size: 0.9rem;
margin-left: -1.3rem; min-height: 1.6rem;
margin-right: 0.3rem; min-width: 1.3rem;
width: 1rem; outline: none;
margin-top: -0.4rem; background-color: #eee;
vertical-align: middle; padding: 0.3rem 0.1rem;
display: inline-block; margin-left: 0.2rem;
line-height: 0.2rem; margin-top: -0.3rem;
letter-spacing: -0.1rem;
} }
#writing-container { #writing:focus {
bottom: 4rem; background-color: #fff;
margin-bottom: 1rem;
float: left;
} }
.writing { .writing {
padding-top: 0.3rem; padding-top: 0.3rem;
@ -313,60 +396,25 @@ body {
margin-left: 1rem; margin-left: 1rem;
margin-top: 1.2rem; margin-top: 1.2rem;
} }
#writing { .writing .iden {
font-size: 0.9rem; display: block;
min-height: 1.6rem; text-align: right;
line-height: 1.6rem; width: 100%;
min-width: 1.3rem; }
padding: 0; .writing .iden .ship {
outline: none; margin-right: 0.3rem;
}
#audi {
display: inline-block;
background-color: #eee; background-color: #eee;
} padding: 0.3rem 0.1rem;
#writing:focus { margin-top: -0.3rem;
background-color: #fff; margin-right: -0.2rem;
}
#station h1 {
display: inline-block;
margin: 0;
font-weight: 200;
font-size: 2rem;
text-transform: lowercase;
}
input.join {
font-size: 4rem;
background-color: #fff;
outline: none; outline: none;
width: 24rem; overflow: hidden;
} }
#station input.join { .valid-false {
font-family: "scp"; color: #ff2f2f;
font-size: 0.7rem;
line-height: 1rem;
width: 12rem;
}
input.join::-webkit-input-placeholder {
color: #0003ff;
}
input.join:focus::-webkit-input-placeholder {
color: #fff;
}
.pending {
color: #ccc;
}
a.up {
height: 2rem;
margin-top: 0.6rem;
vertical-align: middle;
display: inline-block;
}
.arow-up {
display: inline-block;
margin: 0 0.5rem 0 0.5rem;
width: 0;
height: 0;
border-left: 9px solid transparent;
border-right: 9px solid transparent;
border-bottom: 9px solid #000;
} }
#scrolling { #scrolling {
display: none; display: none;
@ -383,67 +431,92 @@ a.up {
font-size: 0.8rem; font-size: 0.8rem;
text-transform: uppercase; text-transform: uppercase;
} }
@media (max-width: 40rem) { @media only screen and (min-width: 1024px) {
#c { #station-container:hover {
left: 0; max-height: 30rem;
margin-left: 0; height: auto;
width: 24rem; -webkit-transition: max-height 0.2s;
} }
#messages-container, #station-container:hover #where .caret {
#writing-container { transform: rotate(90deg);
margin-left: 1rem; transform-origin: 0 50%;
} -webkit-transform: rotate(90deg);
#stations-container, -webkit-transition: -webkit-transform 0.2s;
#station-container { }
position: relative; }
float: left; @media only screen and (max-width: 1170px) {
} #station-container.open {
#stations-container { max-height: 30rem;
width: 8rem; height: auto;
} -webkit-transition: max-height 0.2s;
#station-container { }
left: auto; #station-container.open #where .caret {
} transform: rotate(90deg);
.station { transform-origin: 0 50%;
width: 5rem; -webkit-transform: rotate(90deg);
} -webkit-transition: -webkit-transform 0.2s;
.attr { }
display: block; #c,
text-align: left; #station-container {
width: 2rem; width: 96%;
margin-right: 1rem; left: 0;
} margin-left: 2%;
.message { margin-right: 2%;
height: 1.6rem; }
} .mess,
.stations, #writing {
.iden, max-width: 40%;
#station { line-height: 1.2rem;
font-size: 0.5rem; }
} .attr,
.station .remove { #stations,
display: inline; #where {
font-size: 0.6rem; width: 20%;
line-height: 0.6rem; min-width: 20%;
} }
.ship.talk:before { #audience,
margin-left: -0.3rem; #who {
margin-right: 0; width: 60%;
} }
.attr { #writing {
width: 4rem; padding: 0.1rem;
} }
.iden > div { #station-container.m-down,
display: block; #station-container.m-up {
} position: absolute;
.attr > .time { }
display: none; #station-container.m-down.m-fixed {
} position: fixed;
.mess { top: 0;
max-width: 12rem; }
margin-bottom: 1rem; }
} @media only screen and (min-device-width: 320px) and (max-device-width: 480px) {
#writing { .mess,
max-width: 12rem; #writing {
max-width: 70%;
line-height: 1.2rem;
}
#stations,
#audience {
width: 96%;
}
#stations,
#audience,
.sour-ctrl input {
text-align: left;
}
#station {
cursor: pointer;
}
#station-container.open {
max-height: 30rem;
height: auto;
-webkit-transition: max-height 0.2s;
}
#station-container.open #where .caret {
transform: rotate(90deg);
transform-origin: 0 50%;
-webkit-transform: rotate(90deg);
-webkit-transition: -webkit-transform 0.2s;
} }
} }

View File

@ -1,9 +1,16 @@
//
// fonts first
//
@import 'fonts' @import 'fonts'
.iden .iden
.audi .audi
.time .time
#length #length
#where
#who
.station
font-family "scp" font-family "scp"
.join-ctrl input .join-ctrl input
@ -22,18 +29,30 @@ body
.time .time
font-size .6rem font-size .6rem
letter-spacing 0 letter-spacing 0
.time
font-weight 200 font-weight 200
#length
font-weight 500
input.join input.join
.iden .iden
.audi .audi
#station #station
font-size .7rem font-size .7rem
.iden
font-weight 600
html html
body body
font-size 18px font-size 18px
//
// containers
//
body body
background-color #fefefe background-color #fefefe
padding 0 padding 0
@ -43,125 +62,161 @@ body
display none display none
#c #c
top 0
background-color #fff
#stations-container
position absolute position absolute
top 1rem top 0rem
left 50% left 50%
width 24rem width 58rem
margin-left -12rem margin-left -29rem
font-size 4rem margin-bottom 12rem
#station-container #station-container
position fixed position fixed
top 0 width 58rem
left 50% max-height 2.7rem
width 28rem background-color white
max-height 2.6rem border-bottom .3rem solid black
padding-bottom 1rem
overflow hidden overflow hidden
margin-left -14rem z-index 10
-webkit-transition max-height .2s
#station #station-container
padding-top 1rem padding-top 1rem
background-color #f5f5f5 min-width 30rem
border-bottom 3px solid #ededed text-align right
transition max-height 0.15s ease-out
#station-container:hover #writing-container
max-height 12rem bottom 4rem
transition max-height 0.25s ease-in
#stations-container
#messages-container
vertical-align top
#messaging-container
position absolute
top 4rem
left 50%
width 24rem
margin-left -12rem
margin-bottom 4rem
#station > div
display inline-block
#station-meta
margin-right 1rem
margin-bottom 1rem margin-bottom 1rem
#sources-container #messages-container
width 6rem vertical-align top
float right margin-top 4rem
margin 1rem -6rem 0 0
#members //
margin-left 2rem // components
//
#station .iden .caret
display block .circle
.station
display inline-block display inline-block
width 9rem
margin-bottom .3rem
cursor pointer
font-weight 200
#stations .station .caret
display block width 0
width 24rem height 0
border-top 6px solid transparent
.station .name border-right 6px solid transparent
padding .3rem
border-bottom 6px solid transparent border-bottom 6px solid transparent
border-left 6px solid #000
margin-top 2px
.station .name:hover .circle
background-color #f5f5f5 width 6px
border-bottom 6px solid #ededed height 6px
border 3px solid black
border-radius 6px
margin-top 2px
.station > div //
// station
//
#station-container #where .caret
-webkit-transform rotate(0deg)
-webkit-transform-origin 0 50%
-webkit-transition -webkit-transform .2s
#head
width 100%
height 4rem
#station-container h1
font-weight 500
font-size .6rem
letter-spacing .06rem
display inline-block display inline-block
line-height 1.2rem
.toggle #audience
width .4rem #who
height .4rem width 34.6rem
border 2px solid #000
margin-right .6rem
.toggle.active #stations
background-color #000 #where
width 17.3rem
#stations
#audience
#head > div
display inline-block
text-align right
vertical-align top
#head > div
height 2rem
margin-top 1.5rem
#where .caret
border-left-color red
margin-left 1rem
#where > span
#who > span
vertical-align top
#who > span
margin-left 1rem
#members > div
display block
#members > div div
display inline-block
vertical-align bottom
#members .audi
margin-right .3rem
#members .iden
min-width 10rem
.station div
display inline-block
.station .remove .station .remove
display none opacity 0
float right cursor pointer
margin-left 1rem width .6rem
margin-right .6rem
font-weight 600 font-weight 600
color #ff0000 color #ff0000
.station:hover .remove .station:hover .remove
display inline opacity 1
#sources-container .station // add source
font-family "scp"
font-weight 500
text-transform lowercase
// hate this.
.sour-ctrl
margin-bottom .16rem
.join-ctrl input
.sour-ctrl input .sour-ctrl input
font-family "scp"
border none border none
font-weight 400 font-weight 400
text-align right
line-height 1rem
outline none
cursor pointer
.sour-ctrl input::-webkit-input-placeholder .sour-ctrl input::-webkit-input-placeholder
font-family "bau" font-family "scp"
font-size 1rem font-size 1rem
font-weight 200 font-weight 600
margin-left .6rem margin-left .6rem
color #0003FF color #000
.sour-ctrl input:focus::-webkit-input-placeholder
color white
//
// messages
//
.message .message
padding-top .3rem padding-top .3rem
@ -176,8 +231,9 @@ body
#messages .message:hover .time #messages .message:hover .time
opacity 1 opacity 1
.time #messages .message .ship
margin-right .6rem #messages .message .audi > div
cursor pointer
.member .member
width 12rem width 12rem
@ -186,55 +242,95 @@ body
#messages #messages
height auto height auto
.message.pending
color #ccc
.message.say .mess
font-style italic
a
text-decoration underline
color inherit
.mess .mess
.iden .iden
.attr > div
#station .member div #station .member div
#writing #writing
display inline-block display inline-block
.iden > div
display inline
.mess .mess
#writing #writing
#length #length
vertical-align top vertical-align top
.attr > div
max-width 16rem
.attr .attr
color #D7D7D7 text-align right
display inline-block
margin-right .3rem
min-width 16rem
.attr .iden .attr .iden
color #000 margin-left .3rem
.attr > div .audi
white-space nowrap
.audi > div
margin-right .3rem margin-right .3rem
max-width 8rem
.iden > div
max-width 10rem
.iden > div
.audi > div
display inline-block
background-color white
overflow hidden
white-space nowrap
text-overflow ellipsis
-webkit-transition max-width .2s
.audi > div:last-child
margin-right 0
.iden > div:hover
.audi > div:hover
position relative
-webkit-transition max-width .2s
.mess .mess
font-size .9rem font-size .9rem
line-height 1.6rem
letter-spacing .03rem letter-spacing .03rem
word-wrap break-word word-wrap break-word
max-width 31rem margin-left .3rem
.ship .mess
font-weight 600 #writing
.iden > div:hover
.audi > div:hover
max-width 30rem
.ship.talk:before //
content "..." // writing
margin-left -1.3rem //
margin-right .3rem
width 1rem
margin-top -.4rem
vertical-align middle
display inline-block
line-height .2rem
letter-spacing -.1rem
#writing-container #writing
bottom 4rem font-size .9rem
margin-bottom 1rem min-height 1.6rem
float left min-width 1.3rem
outline none
background-color #eee
padding .3rem .1rem
margin-left .2rem
margin-top -.3rem
#writing:focus
background-color #fff
.writing .writing
padding-top .3rem padding-top .3rem
@ -244,60 +340,29 @@ body
margin-left 1rem margin-left 1rem
margin-top 1.2rem margin-top 1.2rem
#writing .writing .iden
font-size .9rem display block
min-height 1.6rem text-align right
line-height 1.6rem width 100%
min-width 1.3rem
padding 0 .writing .iden .ship
outline none margin-right .3rem
#audi
display inline-block
background-color #eee background-color #eee
padding .3rem .1rem
#writing:focus margin-top -.3rem
background-color #fff margin-right -.2rem
#station h1
display inline-block
margin 0
font-weight 200
font-size 2rem
text-transform lowercase
input.join
font-size 4rem
background-color #fff
outline none outline none
width 24rem overflow hidden
#station input.join .valid-false
font-family "scp" color #ff2f2f
font-size .7rem
line-height 1rem
width 12rem
input.join::-webkit-input-placeholder //
color #0003FF // scrolling
//
input.join:focus::-webkit-input-placeholder
color #fff
.pending
color #ccc
a.up
height 2rem
margin-top .6rem
vertical-align middle
display inline-block
.arow-up
display inline-block
margin 0 .5rem 0 .5rem
width 0
height 0
border-left 9px solid transparent
border-right 9px solid transparent
border-bottom 9px solid #000
#scrolling #scrolling
display none display none
@ -314,66 +379,4 @@ a.up
font-size .8rem font-size .8rem
text-transform uppercase text-transform uppercase
@media (max-width: 40rem) @import 'mobile'
#c
left 0
margin-left 0
width 24rem
#messages-container
#writing-container
margin-left 1rem
#stations-container
#station-container
position relative
float left
#stations-container
width 8rem
#station-container
left auto
.station
width 5rem
.attr
display block
text-align left
width 2rem
margin-right 1rem
.message
height 1.6rem
.stations
.iden
#station
font-size .5rem
.station .remove
display inline
font-size .6rem
line-height .6rem
.ship.talk:before
margin-left -.3rem
margin-right 0
.attr
width 4rem
.iden > div
display block
.attr > .time
display none
.mess
max-width 12rem
margin-bottom 1rem
#writing
max-width 12rem

View File

@ -0,0 +1,91 @@
/* computers --------*/
@media only screen and (min-width: 1024px)
#station-container:hover
max-height 30rem
height auto
-webkit-transition max-height .2s
#station-container:hover #where .caret
transform rotate(90deg)
transform-origin 0 50%
-webkit-transform rotate(90deg)
-webkit-transition -webkit-transform .2s
/* laptops / small screens ----------- */
@media only screen and (max-width: 1170px)
#station-container.open
max-height 30rem
height auto
-webkit-transition max-height .2s
#station-container.open #where .caret
transform rotate(90deg)
transform-origin 0 50%
-webkit-transform rotate(90deg)
-webkit-transition -webkit-transform .2s
#c
#station-container
width 96%
left 0
margin-left 2%
margin-right 2%
.mess
#writing
max-width 40%
line-height 1.2rem
.attr
#stations
#where
width 20%
min-width 20%
#audience
#who
width 60%
#writing
padding .1rem
#station-container.m-down
#station-container.m-up
position absolute
#station-container.m-down.m-fixed
position fixed
top 0
/* tablets + phones ----------- */
// @media only screen and (min-width: 320px) and (max-width: 1024px)
/* phones portrait and landscape ----------- */
@media only screen and (min-device-width: 320px) and (max-device-width: 480px)
.mess
#writing
max-width 70%
line-height 1.2rem
#stations
#audience
width 96%
#stations
#audience
.sour-ctrl input
text-align left
#station
cursor pointer
#station-container.open
max-height 30rem
height auto
-webkit-transition max-height .2s
#station-container.open #where .caret
transform rotate(90deg)
transform-origin 0 50%
-webkit-transform rotate(90deg)
-webkit-transition -webkit-transform .2s

View File

@ -1,7 +1,5 @@
MessageDispatcher = require '../dispatcher/Dispatcher.coffee' MessageDispatcher = require '../dispatcher/Dispatcher.coffee'
# hm
module.exports = module.exports =
loadMessages: (grams,get) -> loadMessages: (grams,get) ->
MessageDispatcher.handleServerAction MessageDispatcher.handleServerAction
@ -29,12 +27,11 @@ module.exports =
type:"messages-fetch" type:"messages-fetch"
window.chat.MessagePersistence.get station,start,end window.chat.MessagePersistence.get station,start,end
sendMessage: (station,message,audience) -> sendMessage: (message,audience) ->
serial = window.util.uuid32() serial = window.util.uuid32()
if station[0] isnt "~" then station = "~"+window.urb.ship+"/"+station audience.push window.util.mainStationPath window.urb.user
audience = _.uniq audience
if audience.length is 0 then audience.push station
_audi = {} _audi = {}
for k,v of audience for k,v of audience
@ -53,10 +50,17 @@ module.exports =
bouquet:[] bouquet:[]
speech: speech:
lin: lin:
say:false say:true
txt:message txt:message
date: Date.now() date: Date.now()
if message[0] is "@"
_message.thought.statement.speech.lin.txt = _message.thought.statement.speech.lin.txt.slice(1).trim()
_message.thought.statement.speech.lin.say = false
if window.urb.util.isURL(message)
_message.thought.statement.speech = {url: message}
MessageDispatcher.handleViewAction MessageDispatcher.handleViewAction
type:"message-send" type:"message-send"
message:_message message:_message

View File

@ -17,6 +17,11 @@ module.exports =
type:"station-set-audience" type:"station-set-audience"
audience:audience audience:audience
setValidAudience: (valid) ->
StationDispatcher.handleViewAction
type:"station-set-valid-audience"
valid:valid
toggleAudience: (station) -> toggleAudience: (station) ->
StationDispatcher.handleViewAction StationDispatcher.handleViewAction
type:"station-audience-toggle" type:"station-audience-toggle"
@ -53,11 +58,10 @@ module.exports =
type:"stations-load" type:"stations-load"
stations:stations stations:stations
loadMembers: (station,members) -> loadMembers: (members) ->
StationDispatcher.handleServerAction StationDispatcher.handleServerAction
type:"members-load" type:"members-load"
members:members members:members
station:station
createStation: (station) -> createStation: (station) ->
StationDispatcher.handleViewAction StationDispatcher.handleViewAction

View File

@ -1,13 +1,13 @@
moment = require 'moment-timezone' moment = require 'moment-timezone'
recl = React.createClass recl = React.createClass
[div,input,textarea] = [React.DOM.div,React.DOM.input,React.DOM.textarea] [div,br,input,textarea,a] = [React.DOM.div,React.DOM.br,React.DOM.input,React.DOM.textarea,React.DOM.a]
MessageStore = require '../stores/MessageStore.coffee'
StationStore = require '../stores/StationStore.coffee'
MessageActions = require '../actions/MessageActions.coffee' MessageActions = require '../actions/MessageActions.coffee'
MessageStore = require '../stores/MessageStore.coffee'
StationActions = require '../actions/StationActions.coffee' StationActions = require '../actions/StationActions.coffee'
Member = require './MemberComponent.coffee' StationStore = require '../stores/StationStore.coffee'
Member = require './MemberComponent.coffee'
Message = recl Message = recl
lz: (n) -> if n<10 then "0#{n}" else "#{n}" lz: (n) -> if n<10 then "0#{n}" else "#{n}"
@ -19,27 +19,40 @@ Message = recl
s = @lz d.getSeconds() s = @lz d.getSeconds()
"~#{h}.#{m}.#{s}" "~#{h}.#{m}.#{s}"
_handleAudi: (e) ->
audi = _.map $(e.target).closest('.audi').find('div'), (div) -> return $(div).text()
@props._handleAudi audi
_handlePm: (e) ->
return if not @props._handlePm
user = $(e.target).closest('.iden').text().slice(1)
@props._handlePm user
render: -> render: ->
# pendingClass = if @props.pending isnt "received" then "pending" else "" # pendingClass = if @props.pending isnt "received" then "pending" else ""
delivery = _.uniq _.pluck @props.thought.audience, "delivery" delivery = _.uniq _.pluck @props.thought.audience, "delivery"
pendingClass = if delivery.indexOf("received") isnt -1 then "received" else "pending" klass = if delivery.indexOf("received") isnt -1 then " received" else " pending"
if @props.thought.statement.speech?.lin?.say is false then klass += " say"
if pendingClass is "pending" if @props.thought.statement.speech?.url then klass += " url"
console.log @props.thought
console.log delivery
name = if @props.name then @props.name else "" name = if @props.name then @props.name else ""
audi = _.remove _.keys(@props.thought.audience), (stat) => audi = _.keys @props.thought.audience
stat isnt "~"+window.urb.ship+"/"+@props.station audi = _.without audi,window.util.mainStationPath window.urb.user
audi = audi.join " " audi = window.util.clipAudi audi
audi = audi.map (_audi) -> (div {}, _audi)
div {className:"message "+pendingClass}, [ if @props.thought.statement.speech?.lin?.txt then txt = @props.thought.statement.speech.lin.txt
if @props.thought.statement.speech?.url
url = @props.thought.statement.speech.url.url
txt = (a {href:url,target:"_blank"}, url)
div {className:"message #{klass}"}, [
(div {className:"attr"}, [ (div {className:"attr"}, [
(Member {ship:@props.ship}, "") div {onClick:@_handleAudi,className:"audi"}, audi
div {className:"audi"}, "#{audi}" (div {onClick:@_handlePm}, (React.createElement Member,{ship:@props.ship}))
div {className:"time"}, @convTime @props.thought.statement.date div {className:"time"}, @convTime @props.thought.statement.date
]) ])
div {className:"mess"}, @props.thought.statement.speech.lin.txt div {className:"mess"}, txt
] ]
module.exports = recl module.exports = recl
@ -51,7 +64,7 @@ module.exports = recl
last:MessageStore.getLast() last:MessageStore.getLast()
fetching:MessageStore.getFetching() fetching:MessageStore.getFetching()
listening:MessageStore.getListening() listening:MessageStore.getListening()
station:StationStore.getStation() station:window.util.mainStation()
stations:StationStore.getStations() stations:StationStore.getStations()
configs:StationStore.getConfigs() configs:StationStore.getConfigs()
typing:MessageStore.getTyping() typing:MessageStore.getTyping()
@ -78,7 +91,8 @@ module.exports = recl
componentDidMount: -> componentDidMount: ->
MessageStore.addChangeListener @_onChangeStore MessageStore.addChangeListener @_onChangeStore
StationStore.addChangeListener @_onChangeStore StationStore.addChangeListener @_onChangeStore
if @state.station and @state.listening.indexOf(@state.station) is -1 if @state.station and
@state.listening.indexOf(@state.station) is -1
MessageActions.listenStation @state.station MessageActions.listenStation @state.station
checkMore = @checkMore checkMore = @checkMore
$(window).on 'scroll', checkMore $(window).on 'scroll', checkMore
@ -87,9 +101,8 @@ module.exports = recl
componentDidUpdate: -> componentDidUpdate: ->
$window = $(window) $window = $(window)
if @lastLength if @lastLength
h = $('.message').height() * (@length-@lastLength) st = $window.height()
st = $window.scrollTop() $window.scrollTop st
$window.scrollTop st+h
@lastLength = null @lastLength = null
else else
if $('#writing-container').length > 0 if $('#writing-container').length > 0
@ -101,17 +114,25 @@ module.exports = recl
_onChangeStore: -> @setState @stateFromStore() _onChangeStore: -> @setState @stateFromStore()
_handlePm: (user) ->
audi = [
window.util.mainStationPath(user)
window.util.mainStationPath(window.urb.user)
]
if user is window.urb.user then audi.pop()
StationActions.setAudience audi
_handleAudi: (audi) -> StationActions.setAudience audi
render: -> render: ->
station = @state.station station = @state.station
_station = "~"+window.urb.ship+"/"+station _station = "~"+window.urb.ship+"/"+station
sources = _.clone @state.configs[@state.station]?.sources ? [] sources = _.clone @state.configs[@state.station]?.sources ? []
sources.push _station sources.push _station
_messages = _.filter @state.messages, (_message) -> _messages = @state.messages
audience = _.keys(_message.thought.audience)
_.intersection(sources,audience).length > 0
_messages = _.sortBy _messages, (_message) -> _messages = _.sortBy _messages, (_message) ->
_message.pending = _message.thought.audience[station] _message.pending = _message.thought.audience[station]
_message.thought.statement.time _message.thought.statement.date
@last = _messages[_messages.length-1] @last = _messages[_messages.length-1]
@length = _messages.length @length = _messages.length
@ -122,5 +143,7 @@ module.exports = recl
messages = _messages.map (_message) => messages = _messages.map (_message) =>
_message.station = @state.station _message.station = @state.station
Message _message, "" _message._handlePm = @_handlePm
_message._handleAudi = @_handleAudi
React.createElement Message,_message
div {id: "messages"}, messages div {id: "messages"}, messages

View File

@ -1,15 +0,0 @@
recl = React.createClass
[div,input,textarea] = [React.DOM.div,React.DOM.input,React.DOM.textarea]
StationComponent = require './StationComponent.coffee'
MessagesComponent = require './MessagesComponent.coffee'
WritingComponent = require './WritingComponent.coffee'
module.exports = recl
render: ->
div {id:"d"}, "asdf"
# div {id:"d"}, [
# (div {id:'station-container'}, (StationComponent {}, ""))
# (div {id:'messages-container'}, (MessagesComponent {}, ""))
# (div {id:'writing-container'}, (WritingComponent {}, ""))
# ]

View File

@ -15,7 +15,7 @@ module.exports = recl
stateFromStore: -> { stateFromStore: -> {
audi:StationStore.getAudience() audi:StationStore.getAudience()
members:StationStore.getMembers() members:StationStore.getMembers()
station:StationStore.getStation() station:window.util.mainStation()
stations:StationStore.getStations() stations:StationStore.getStations()
configs:StationStore.getConfigs() configs:StationStore.getConfigs()
typing:StationStore.getTyping() typing:StationStore.getTyping()
@ -35,14 +35,15 @@ module.exports = recl
componentWillUnmount: -> componentWillUnmount: ->
StationStore.removeChangeListener @_onChangeStore StationStore.removeChangeListener @_onChangeStore
_toggleAudi: (e) ->
$e = $(e.target).closest('.station')
station = $e.find('.path').text()
StationActions.toggleAudience station
_onChangeStore: -> _onChangeStore: ->
@setState @stateFromStore() @setState @stateFromStore()
_toggleOpen: (e) ->
if $(e.target).closest('.sour-ctrl').length > 0
return
$("#station-container").toggleClass 'open'
_keyUp: (e) -> _keyUp: (e) ->
if e.keyCode is 13 if e.keyCode is 13
v = @$input.val() v = @$input.val()
@ -51,51 +52,50 @@ module.exports = recl
_sources.push v _sources.push v
StationActions.setSources @state.station,_sources StationActions.setSources @state.station,_sources
@$input.val('') @$input.val('')
@$input.blur()
_remove: (e) -> _remove: (e) ->
e.stopPropagation() e.stopPropagation()
e.preventDefault() e.preventDefault()
_station = $(e.target).attr "data-station" _station = $(e.target).attr "data-station"
_sources = _.clone @state.configs[@state.station].sources _sources = _.clone @state.configs[@state.station].sources
_sources.slice _sources.indexOf(_station),1 _sources.splice _sources.indexOf(_station),1
StationActions.setSources @state.station,_sources StationActions.setSources @state.station,_sources
render: -> render: ->
parts = [] parts = []
members = [] members = []
if @state.station and @state.members[@state.station] if @state.station and @state.members
members = _.map @state.members[@state.station], (state,member) -> members = _.map @state.members, (stations,member) ->
Member {ship:member,presence:state.presence} audi = _.map stations,(presence,station) -> (div {className:"audi"}, station)
(div {}, [audi,(React.createElement Member, {ship:member})])
else else
members = "" members = ""
sourceInput = [(input {className:"join",onKeyUp:@_keyUp,placeholder:"+"}, "")] sourceInput = [(input {className:"join",onKeyUp:@_keyUp,placeholder:"+"}, "")]
sourceCtrl = div {className:"sour-ctrl"}, sourceInput sourceCtrl = div {className:"sour-ctrl"},sourceInput
sources = [] sources = []
if @state.station and @state.configs[@state.station] if @state.station and @state.configs[@state.station]
_remove = @_remove _remove = @_remove
_sources = _.clone @state.configs[@state.station].sources _sources = _.clone @state.configs[@state.station].sources
_sources.push "twitter/hoontap"
sources = _.map _sources,(source) => sources = _.map _sources,(source) =>
toggleClass = "toggle " (div {className:"station"}, [
if @state.audi.indexOf(source) isnt -1 then toggleClass += "active" (div {className:"remove",onClick:_remove,"data-station":source},"×"),
(div {className:"station",onClick:@_toggleAudi}, [ (div {className:"path"}, source)
(div {className:toggleClass})
(div {className:"path"}, source),
(div {className:"remove",onClick:_remove,"data-station":source},"×")
]) ])
else else
sources = "" sources = ""
station = [] head = (div {id:"head"},
station.push (a {className:"up",href:"\#/"}, [(div {className:"arow-up"}, "")]) [(div {id:"where"},["/talk",(div {className:"caret"},"")]),
station.push (h1 {},@state.station) (div {id:"who"},[(div {className:"circle"},""),"~#{window.urb.user}"])
station.push (div {id:"members"},members) ]
)
parts.push (div {id:"station-container"}, (div {id:"station-meta"},station)) parts.push head
parts.push (div {id:"sources-container"}, [(div {class:"sources-list"},sources),sourceCtrl]) parts.push (div {id:"stations"}, [(h1 {}, "Listening to"),(div {},sources),sourceCtrl])
parts.push (div {id:"audience"}, (div {},[(h1 {}, "Talking to"),(div {id:"members"},members)]))
div {id:"station"},parts div {id:"station",onClick:@_toggleOpen},parts

View File

@ -7,15 +7,15 @@ StationActions = require '../actions/StationActions.coffee'
module.exports = recl module.exports = recl
stateFromStore: -> { stateFromStore: -> {
stations: StationStore.getStations() stations: StationStore.getStations()
station: StationStore.getStation() station: "~zod/court"
} }
getInitialState: -> @stateFromStore() getInitialState: -> @stateFromStore()
componentDidMount: -> componentDidMount: ->
@$el = $(@getDOMNode()) @$el = $ @getDOMNode()
@$add = $('#stations .add') @$add = $ '#stations .add'
@$input = @$el.find('input') @$input = @$el.find 'input'
StationStore.addChangeListener @_onChangeStore StationStore.addChangeListener @_onChangeStore
componentWillUnmount: -> componentWillUnmount: ->

View File

@ -1,10 +1,11 @@
recl = React.createClass recl = React.createClass
[div,input,textarea] = [React.DOM.div,React.DOM.input,React.DOM.textarea] [div,br,input,textarea] = [React.DOM.div,React.DOM.br,React.DOM.input,React.DOM.textarea]
MessageActions = require '../actions/MessageActions.coffee' MessageActions = require '../actions/MessageActions.coffee'
MessageStore = require '../stores/MessageStore.coffee'
StationActions = require '../actions/StationActions.coffee' StationActions = require '../actions/StationActions.coffee'
StationStore = require '../stores/StationStore.coffee' StationStore = require '../stores/StationStore.coffee'
Member = require './MemberComponent.coffee' Member = require './MemberComponent.coffee'
module.exports = recl module.exports = recl
set: -> set: ->
@ -13,12 +14,16 @@ module.exports = recl
get: -> get: ->
if window.localStorage then window.localStorage.getItem 'writing' if window.localStorage then window.localStorage.getItem 'writing'
stateFromStore: -> { stateFromStore: ->
audi:StationStore.getAudience() s =
members:StationStore.getMembers() audi:StationStore.getAudience()
typing:StationStore.getTyping() ludi:MessageStore.getLastAudience()
station:StationStore.getStation() members:StationStore.getMembers()
} typing:StationStore.getTyping()
valid:StationStore.getValidAudience()
s.audi = _.without s.audi, window.util.mainStationPath window.urb.user
s.ludi = _.without s.ludi, window.util.mainStationPath window.urb.user
s
getInitialState: -> @stateFromStore() getInitialState: -> @stateFromStore()
@ -35,16 +40,39 @@ module.exports = recl
@typing true @typing true
sendMessage: -> sendMessage: ->
MessageActions.sendMessage @state.station,@$writing.text(),@state.audi if @_validateAudi() is false
$('#audi').focus()
return
if @state.audi.length is 0 and $('#audi').text().trim().length > 0
audi = @state.ludi
@_setAudi()
else
audi = @state.audi
audi = window.util.expandAudi audi
MessageActions.sendMessage @$writing.text().trim(),audi
@$length.text "0/69" @$length.text "0/69"
@$writing.text('') @$writing.text('')
@set() @set()
@typing false @typing false
_keyDown: (e) -> _audiKeyDown: (e) ->
if e.keyCode is 13 if e.keyCode is 13
e.preventDefault() e.preventDefault()
@sendMessage() setTimeout () ->
$('#writing').focus()
,0
return false
_writingKeyUp: (e) ->
if not window.urb.util.isURL @$writing.text()
@$length.toggleClass('valid-false',(@$writing.text().length > 62))
_writingKeyDown: (e) ->
if e.keyCode is 13
txt = @$writing.text()
e.preventDefault()
if (txt.length > 0 and txt.length < 63) or window.urb.util.isURL @$writing.text()
@sendMessage()
return false return false
@_input() @_input()
@set() @set()
@ -52,21 +80,50 @@ module.exports = recl
_input: (e) -> _input: (e) ->
text = @$writing.text() text = @$writing.text()
length = text.length length = text.length
geturl = new RegExp "(^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))", "g" # geturl = new RegExp "(^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))", "g"
urls = text.match(geturl) # urls = text.match(geturl)
if urls isnt null and urls.length > 0 # if urls isnt null and urls.length > 0
for url in urls # for url in urls
length -= url.length # length -= url.length
length += 10 # length += 10
@$length.text "#{length}/69" @$length.text "#{length}/62"
if length >= 69
@$writing.text(@$writing.text().substr(0,69))
@cursorAtEnd()
e.preventDefault() if e
return false
_setFocus: -> @$writing.focus() _setFocus: -> @$writing.focus()
_validateAudiPart: (a) ->
if a[0] isnt "~"
return false
if a.indexOf("/") isnt -1
_a = a.split("/")
if _a[1].length is 0
return false
ship = _a[0]
else
ship = a
if ship.length < 3
return false
return true
_validateAudi: ->
v = $('#audi').text()
v = v.trim()
if v.length is 0
return true
v = v.split " "
for a in v
a = a.trim()
valid = @_validateAudiPart(a)
valid
_setAudi: ->
valid = @_validateAudi()
StationActions.setValidAudience valid
if valid is true
v = $('#audi').text()
v = v.split " "
v = window.util.expandAudi v
StationActions.setAudience v
getTime: -> getTime: ->
d = new Date() d = new Date()
seconds = d.getSeconds() seconds = d.getSeconds()
@ -85,6 +142,7 @@ module.exports = recl
componentDidMount: -> componentDidMount: ->
window.util.sendMessage = @sendMessage window.util.sendMessage = @sendMessage
StationStore.addChangeListener @_onChangeStore StationStore.addChangeListener @_onChangeStore
MessageStore.addChangeListener @_onChangeStore
@$el = $ @getDOMNode() @$el = $ @getDOMNode()
@$length = $('#length') @$length = $('#length')
@$writing = $('#writing') @$writing = $('#writing')
@ -108,12 +166,21 @@ module.exports = recl
ship = if iden then iden.ship else user ship = if iden then iden.ship else user
name = if iden then iden.name else "" name = if iden then iden.name else ""
k = "writing" audi = if @state.audi.length is 0 then @state.ludi else @state.audi
k+= " hidden" if not @state?.station audi = window.util.clipAudi audi
div {className:k,onClick:@_setFocus}, [ k = "writing"
div {className:k}, [
(div {className:"attr"}, [ (div {className:"attr"}, [
(Member iden, "") (div {
id:"audi"
className:"audi valid-#{@state.valid}"
contentEditable:true
onKeyDown: @_audiKeyDown
onBlur:@_setAudi
}, audi.join(" "))
(React.createElement Member, iden)
(div {className:"time"}, @getTime()) (div {className:"time"}, @getTime())
]) ])
(div { (div {
@ -123,8 +190,9 @@ module.exports = recl
onBlur: @_blur onBlur: @_blur
onInput: @_input onInput: @_input
onPaste: @_input onPaste: @_input
onKeyDown: @_keyDown onKeyDown: @_writingKeyDown
onKeyUp: @_writingKeyUp
onFocus: @cursorAtEnd onFocus: @cursorAtEnd
}, "") }, "")
div {id:"length"}, "0/69" div {id:"length"}, "0/62"
] ]

View File

@ -1,111 +1,186 @@
$(() -> $(() ->
StationActions = require './actions/StationActions.coffee' StationActions = require './actions/StationActions.coffee'
rend = React.render rend = React.render
window.chat = {} window.chat = {}
window.chat.MessagePersistence = require './persistence/MessagePersistence.coffee' window.chat.MessagePersistence = require './persistence/MessagePersistence.coffee'
window.chat.StationPersistence = require './persistence/StationPersistence.coffee' window.chat.StationPersistence = require './persistence/StationPersistence.coffee'
window.util = window.util =
mainStation: -> mainStations: ["court","floor","porch"]
switch window.urb.user.length
when 3
return "court"
when 5
return "floor"
when 13
return "porch"
create: (name) -> mainStationPath: (user) -> "~#{user}/#{window.util.mainStation(user)}"
window.chat.StationPersistence.createStation name, (err,res) ->
subscribe: (name) -> mainStation: (user) ->
window.chat.StationPersistence.addSource "main",window.urb.ship,["~zod/#{name}"] if not user then user = window.urb.user
switch user.length
when 3
return "court"
when 6
return "floor"
when 13
return "porch"
uuid32: -> clipAudi: (audi) ->
str = "0v" audi = audi.join " "
str += Math.ceil(Math.random()*8)+"." ms = window.util.mainStationPath window.urb.user
for i in [0..5] regx = new RegExp "/#{ms}","g"
_str = Math.ceil(Math.random()*10000000).toString(32) audi = audi.replace regx,""
_str = ("00000"+_str).substr(-5,5) audi.split " "
str += _str+"."
str.slice(0,-1)
populate: (station,number) -> expandAudi: (audi) ->
c = 0 audi = audi.join " "
send = -> ms = window.util.mainStationPath window.urb.user
if c < number if audi.indexOf(ms) is -1
c++ if audi.length > 0
else audi += " "
console.log 'done' audi += "#{ms}"
return true audi.split " "
_audi = {}
_audi[station] = "pending"
_message =
serial:window.util.uuid32()
audience:_audi
statement:
speech:
say:"Message "+c
time: Date.now()
now: Date.now()
window.chat.MessagePersistence.sendMessage _message,send
send()
getScroll: -> create: (name) ->
@writingPosition = $('#messaging-container').outerHeight(true)+$('#messaging-container').offset().top-$(window).height() window.chat.StationPersistence.createStation name, (err,res) ->
#@writingPosition = $('#writing-container').position().top-$(window).height()+$('#writing-container').outerHeight(true)
setScroll: -> subscribe: (name) ->
window.util.getScroll() window.chat.StationPersistence.addSource "main",window.urb.ship,["~zod/#{name}"]
$(window).scrollTop(window.util.writingPosition)
checkScroll: -> uuid32: ->
if not window.util.writingPosition str = "0v"
window.util.getScroll() str += Math.ceil(Math.random()*8)+"."
if $(window).scrollTop() < window.util.writingPosition for i in [0..5]
$('body').addClass 'scrolling' _str = Math.ceil(Math.random()*10000000).toString(32)
_str = ("00000"+_str).substr(-5,5)
str += _str+"."
str.slice(0,-1)
populate: (station,number) ->
c = 0
send = ->
if c < number
c++
else else
$('body').removeClass 'scrolling' console.log 'done'
return true
_audi = {}
_audi[station] = "pending"
_message =
serial:window.util.uuid32()
audience:_audi
statement:
speech:
say:"Message "+c
time: Date.now()
now: Date.now()
window.chat.MessagePersistence.sendMessage _message,send
send()
$(window).on 'scroll', window.util.checkScroll getScroll: ->
@writingPosition = $('#c').outerHeight(true)+$('#c').offset().top-$(window).height()
window.chat.StationPersistence.listen() setScroll: ->
window.util.getScroll()
$(window).scrollTop($("#c").height())
StationComponent = require './components/StationComponent.coffee' checkScroll: ->
StationsComponent = require './components/StationsComponent.coffee' if not window.util.writingPosition
MessagesComponent = require './components/MessagesComponent.coffee' window.util.getScroll()
WritingComponent = require './components/WritingComponent.coffee' if $(window).scrollTop() < window.util.writingPosition
$('body').addClass 'scrolling'
else
$('body').removeClass 'scrolling'
$c = $('#c') # checkScroll = ->
# if $(window).scrollTop() > 20
# $('#nav').addClass 'scrolling'
# else
# $('#nav').removeClass 'scrolling'
# setInterval checkScroll, 500
clean = -> so = {}
React.unmountComponentAtNode $('#stations-container')[0] so.ls = $(window).scrollTop()
React.unmountComponentAtNode $('#station-parts-container')[0] so.cs = $(window).scrollTop()
React.unmountComponentAtNode $('#writing-container')[0] so.w = null
React.unmountComponentAtNode $('#messages-container')[0] so.$d = $('#nav > div')
setSo = ->
so.$n = $('#station-container')
so.w = $(window).width()
so.h = $(window).height()
so.dh = $("#c").height()
so.nh = so.$n.outerHeight(true)
setSo()
setInterval setSo,200
routes = $(window).on 'resize', (e) ->
'': -> if so.w > 1170
clean() so.$n.removeClass 'm-up m-down m-fixed'
$c.html "<div id='stations-container'></div>"
rend (StationsComponent {}, ""),$('#stations-container')[0]
'/:station': (station) ->
clean()
StationActions.switchStation station
$c.html ""
$c.append("<div id='messaging-container'></div>")
$d = $('#messaging-container')
$d.append("<div id='messages-container'></div>")
$d.append("<div id='writing-container'></div>")
$d.append("<div id='station-parts-container'></div>")
$c.append("<div id='scrolling'>BOTTOM</div>")
rend (StationComponent {}, ""),$('#station-parts-container')[0]
rend (MessagesComponent {}, ""),$('#messages-container')[0]
rend (WritingComponent {}, ""),$('#writing-container')[0]
router = Router routes ldy = 0
if not window.location.hash then window.location.hash = "/"
router.init() $(window).on 'scroll', (e) ->
so.cs = $(window).scrollTop()
if so.w > 1170
so.$n.removeClass 'm-up m-down m-fixed'
if so.w < 1170
dy = so.ls-so.cs
if so.cs <= 0
so.$n.removeClass 'm-up'
so.$n.addClass 'm-down m-fixed'
return
if so.cs+so.h > so.dh then return
if so.$n.hasClass 'm-fixed' and
so.w < 1024
so.$n.css left:-1*$(window).scrollLeft()
if dy > 0 and ldy > 0
if not so.$n.hasClass 'm-down'
so.$n.removeClass('m-up').addClass 'm-down'
top = so.cs-so.nh
if top < 0 then top = 0
so.$n.offset top:top
if so.$n.hasClass('m-down') and
not so.$n.hasClass('m-fixed') and
so.$n.offset().top >= so.cs
so.$n.addClass 'm-fixed'
so.$n.attr {style:''}
if dy < 0 and ldy < 0
if not so.$n.hasClass 'm-up'
so.$n.removeClass 'open'
so.$n.removeClass('m-down m-fixed').addClass 'm-up'
so.$n.attr {style:''}
top = so.cs
sto = so.$n.offset().top
if top < 0 then top = 0
if top > sto and top < sto+so.nh then top = sto
so.$n.offset top:top
ldy = dy
so.ls = so.cs
$(window).on 'scroll', window.util.checkScroll
window.chat.StationPersistence.listen()
StationComponent = require './components/StationComponent.coffee'
MessagesComponent = require './components/MessagesComponent.coffee'
WritingComponent = require './components/WritingComponent.coffee'
$c = $('#c')
clean = ->
React.unmountComponentAtNode $('#station-container')[0]
React.unmountComponentAtNode $('#messages-container')[0]
React.unmountComponentAtNode $('#writing-container')[0]
$c.append "<div id='station-container'></div>"
$c.append "<div id='messages-container'></div>"
$c.append "<div id='writing-container'></div>"
$c.append "<div id='scrolling'>BOTTOM</div>"
rend (React.createElement(StationComponent, {})),$('#station-container')[0]
rend (React.createElement(MessagesComponent, {})),$('#messages-container')[0]
rend (React.createElement(WritingComponent, {})),$('#writing-container')[0]
) )

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,10 @@
{ {
"name": "urbit-radio", "name": "urbit-radio",
"version": "0.0.0", "version": "0.0.0",
"repository": {
"type":"git",
"url":"https://github.com/urbit/urbit"
},
"description": "urbit radio frontend", "description": "urbit radio frontend",
"main": "main.js", "main": "main.js",
"dependencies": { "dependencies": {

View File

@ -2,11 +2,20 @@ MessageActions = require '../actions/MessageActions.coffee'
module.exports = module.exports =
listenStation: (station,since) -> listenStation: (station,since) ->
console.log 'listen station'
console.log arguments
$this = this
window.urb.subscribe { window.urb.subscribe {
appl:"rodeo" appl:"talk"
path:"/f/#{station}/#{since}" path:"/f/#{station}/#{since}"
}, (err,res) -> }, (err,res) ->
console.log('m subscription updates') if err or not res.data
console.log '/f/ err!'
console.log err
console.log res
$this.listenStation station,since
return
console.log('/f/')
console.log(res.data) console.log(res.data)
if res.data.ok is true if res.data.ok is true
MessageActions.listeningStation station MessageActions.listeningStation station
@ -14,16 +23,22 @@ module.exports =
MessageActions.loadMessages res.data.grams MessageActions.loadMessages res.data.grams
get: (station,start,end) -> get: (station,start,end) ->
end = window.urb.util.numDot end
start = window.urb.util.numDot start
window.urb.subscribe { window.urb.subscribe {
appl:"rodeo" appl:"talk"
path:"/f/#{station}/#{end}/#{start}" path:"/f/#{station}/#{end}/#{start}"
}, (err,res) -> }, (err,res) ->
console.log 'get' if err or not res.data
console.log '/f/ /e/s err'
console.log err
return
console.log '/f/ /e/s'
console.log res console.log res
if res.data?.grams?.tele if res.data?.grams?.tele
MessageActions.loadMessages res.data.grams,true MessageActions.loadMessages res.data.grams,true
window.urb.unsubscribe { window.urb.unsubscribe {
appl:"rodeo" appl:"talk"
path:"/f/#{station}/#{end}/#{start}" path:"/f/#{station}/#{end}/#{start}"
}, (err,res) -> }, (err,res) ->
console.log 'done' console.log 'done'
@ -31,8 +46,8 @@ module.exports =
sendMessage: (message,cb) -> sendMessage: (message,cb) ->
window.urb.send { window.urb.send {
appl:"rodeo" appl:"talk"
mark:"rodeo-command" mark:"talk-command"
data: data:
publish: [ publish: [
message message

View File

@ -3,8 +3,8 @@ StationActions = require '../actions/StationActions.coffee'
module.exports = module.exports =
createStation: (name,cb) -> createStation: (name,cb) ->
window.urb.send { window.urb.send {
appl:"rodeo" appl:"talk"
mark:"rodeo-command" mark:"talk-command"
data: data:
design: design:
party:name party:name
@ -16,8 +16,8 @@ module.exports =
removeStation: (name,cb) -> removeStation: (name,cb) ->
window.urb.send { window.urb.send {
appl:"rodeo" appl:"talk"
mark:"rodeo-command" mark:"talk-command"
data: data:
design: design:
party:name party:name
@ -26,8 +26,8 @@ module.exports =
setSources: (station,ship,sources) -> setSources: (station,ship,sources) ->
send = send =
appl:"rodeo" appl:"talk"
mark:"rodeo-command" mark:"talk-command"
data: data:
design: design:
party:station party:station
@ -36,39 +36,52 @@ module.exports =
caption:"" caption:""
cordon:{posture:"white", list:[]} cordon:{posture:"white", list:[]}
window.urb.send send, (err,res) -> window.urb.send send, (err,res) ->
console.log 'add source updates' console.log 'talk-command'
console.log arguments console.log arguments
members: -> members: ->
window.urb.subscribe { window.urb.subscribe {
appl:"rodeo" appl:"talk"
path:"/a/court" path:"/a/court"
}, (err,res) -> }, (err,res) ->
console.log 'membership updates' if err or not res
console.log '/a/ err'
console.log err
return
console.log '/a/'
console.log res.data console.log res.data
if res.data?.group?.global if res.data?.group?.global
StationActions.loadMembers res.data.group.global StationActions.loadMembers res.data.group.global
listen: -> listen: ->
window.urb.subscribe { window.urb.subscribe {
appl:"rodeo" appl:"talk"
path:"/" path:"/"
}, (err,res) -> }, (err,res) ->
console.log 'house updates' if err or not res.data
console.log '/ err'
console.log err
return
console.log '/'
console.log res.data console.log res.data
if res.data.house if res.data.house
StationActions.loadStations res.data.house StationActions.loadStations res.data.house
listenStation: (station) -> listenStation: (station) ->
window.urb.subscribe { window.urb.subscribe {
appl:"rodeo" appl:"talk"
path:"/ax/#{station}" path:"/ax/#{station}"
}, (err,res) -> }, (err,res) ->
console.log('station subscription updates') if err or not res
console.log '/ax/ err'
console.log err
return
console.log('/ax/')
console.log(res.data) console.log(res.data)
if res.data.ok is true if res.data.ok is true
StationActions.listeningStation station StationActions.listeningStation station
if res.data.group?.local if res.data.group
StationActions.loadMembers station,res.data.group.local res.data.group.global[window.util.mainStationPath(window.urb.user)] = res.data.group.local
if res.data.config StationActions.loadMembers res.data.group.global
StationActions.loadConfig station,res.data.config if res.data.cabal?.loc
StationActions.loadConfig station,res.data.cabal.loc

View File

@ -33,6 +33,11 @@ MessageStore = _.merge new EventEmitter,{
getTyping: -> _typing getTyping: -> _typing
getLastAudience: ->
if _.keys(_messages).length is 0 then return []
messages = _.sortBy _messages, (_message) -> _message.thought.statement.time
_.keys messages[messages.length-1].thought.audience
setTyping: (state) -> _typing = state setTyping: (state) -> _typing = state
setListening: (station) -> setListening: (station) ->

View File

@ -1,14 +1,16 @@
EventEmitter = require('events').EventEmitter EventEmitter = require('events').EventEmitter
StationDispatcher = require '../dispatcher/Dispatcher.coffee' StationDispatcher = require '../dispatcher/Dispatcher.coffee'
_audience = [] _audience = []
_members = {} _members = {}
_stations = [] _stations = []
_listening = [] _listening = []
_station = null _station = null
_config = {} _config = {}
_typing = {} _typing = {}
_validAudience = true
StationStore = _.merge new EventEmitter,{ StationStore = _.merge new EventEmitter,{
removeChangeListener: (cb) -> @removeListener "change", cb removeChangeListener: (cb) -> @removeListener "change", cb
@ -21,6 +23,10 @@ StationStore = _.merge new EventEmitter,{
setAudience: (audience) -> _audience = audience setAudience: (audience) -> _audience = audience
getValidAudience: -> _validAudience
setValidAudience: (valid) -> _validAudience = valid
toggleAudience: (station) -> toggleAudience: (station) ->
if _audience.indexOf(station) isnt -1 if _audience.indexOf(station) isnt -1
_audience.splice _audience.indexOf(station), 1 _audience.splice _audience.indexOf(station), 1
@ -35,14 +41,12 @@ StationStore = _.merge new EventEmitter,{
getMember: (ship) -> {ship:ship} getMember: (ship) -> {ship:ship}
changeMember: (dir,name,ship) -> loadMembers: (members) ->
if dir is "out" _members = {}
_members = _.filter _members, (_member) -> for station,list of members
return (_member.ship isnt ship) for member,presence of list
if dir is "in" _members[member] = {} if not _members[member]
_members.push {name:name, ship:ship} _members[member][station] = presence
loadMembers: (station,members) -> _members[station] = members
getMembers: -> _members getMembers: -> _members
@ -94,6 +98,10 @@ StationStore.dispatchToken = StationDispatcher.register (payload) ->
StationStore.setAudience action.audience StationStore.setAudience action.audience
StationStore.emitChange() StationStore.emitChange()
break break
when 'station-set-valid-audience'
StationStore.setValidAudience action.valid
StationStore.emitChange()
break
when 'station-switch' when 'station-switch'
StationStore.setAudience [] StationStore.setAudience []
StationStore.setStation action.station StationStore.setStation action.station
@ -103,7 +111,7 @@ StationStore.dispatchToken = StationDispatcher.register (payload) ->
StationStore.setListening action.station StationStore.setListening action.station
StationStore.emitChange() StationStore.emitChange()
break break
when "config-load" when "config-load" #[name:'loadConfig', args:['station', 'config']]
StationStore.loadConfig action.station,action.config StationStore.loadConfig action.station,action.config
StationStore.emitChange() StationStore.emitChange()
break break
@ -111,7 +119,10 @@ StationStore.dispatchToken = StationDispatcher.register (payload) ->
StationStore.loadStations action.stations StationStore.loadStations action.stations
StationStore.emitChange() StationStore.emitChange()
break break
when "stations-leave" when "stations-leave" # stations-leave:[{name:'loadStations' args:['stations']} ['unsetStation' 'station']]
# ...
# for command in actionVtable[action.type]
# StationStore[command[0]].apply(command[1..].map(argname -> action[argname]))
StationStore.loadStations action.stations StationStore.loadStations action.stations
StationStore.unsetStation action.station StationStore.unsetStation action.station
StationStore.emitChange() StationStore.emitChange()
@ -121,7 +132,7 @@ StationStore.dispatchToken = StationDispatcher.register (payload) ->
StationStore.emitChange() StationStore.emitChange()
break break
when "members-load" when "members-load"
StationStore.loadMembers action.station,action.members StationStore.loadMembers action.members
StationStore.emitChange() StationStore.emitChange()
break break
when "typing-set" when "typing-set"

View File

@ -35,7 +35,7 @@ module.exports = recl
dt = @ts - Number Date.now() dt = @ts - Number Date.now()
setPath: (href,hist) -> setPath: (href,hist) ->
if hist isnt false then history.pushState {}, "", "/gen/docs/tree"+href if hist isnt false then history.pushState {}, "", window.tree.basepath href
TreeActions.setCurr href TreeActions.setCurr href
goTo: (path) -> goTo: (path) ->
@ -47,7 +47,7 @@ module.exports = recl
checkURL: -> checkURL: ->
if @state.url isnt window.location.pathname if @state.url isnt window.location.pathname
@setPath window.location.pathname.replace("/gen/docs/tree",""),false @setPath (window.tree.fragpath window.location.pathname),false
setTitle: -> setTitle: ->
title = $('#cont h1').first().text() title = $('#cont h1').first().text()
@ -86,7 +86,7 @@ module.exports = recl
@goTo @state.next @goTo @state.next
$('body').on 'click', 'a', (e) => $('body').on 'click', 'a', (e) =>
href = $(e.target).closest('a').attr 'href' href = $(e.target).closest('a').attr('href')
if href[0] is "/" if href[0] is "/"
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
@ -103,14 +103,15 @@ module.exports = recl
render: -> render: ->
parts = [] parts = []
if @state.pare if @state.pare
parts.push (div {id:"up"},(a {key:"arow-up",href:@state.pare,className:"arow-up"},"")) href = window.tree.basepath @state.pare
parts.push (div {id:"up"},(a {key:"arow-up",href:href,className:"arow-up"},""))
if @state.prev or @state.next if @state.prev or @state.next
_parts = [] _parts = []
if @state.prev if @state.prev
href = window.tree.basepath @state.prev href = window.tree.basepath window.tree.basepath @state.prev
_parts.push (a {key:"arow-prev",href:href,className:"arow-prev"},"") _parts.push (a {key:"arow-prev",href:href,className:"arow-prev"},"")
if @state.next if @state.next
href = window.tree.basepath @state.next href = window.tree.basepath window.tree.basepath @state.next
_parts.push (a {key:"arow-next",href:href,className:"arow-next"},"") _parts.push (a {key:"arow-next",href:href,className:"arow-next"},"")
parts.push (div {id:"sides"}, _parts) parts.push (div {id:"sides"}, _parts)
@ -128,7 +129,8 @@ module.exports = recl
c = "active" c = "active"
ci = k ci = k
k++ k++
(div {className:c}, (a {key:i+"-a",href:up+"/"+i,onClick:@_click}, i)) href = window.tree.basepath up+"/"+i
(div {className:c}, (a {key:i+"-a",href:href,onClick:@_click}, i))
offset = 0 offset = 0
if ci > 0 then offset = 0 if ci > 0 then offset = 0
s = {marginTop:((ci*-24)-offset)+"px"} s = {marginTop:((ci*-24)-offset)+"px"}

View File

@ -1,4 +1,4 @@
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/actions/TreeActions.coffee":[function(require,module,exports){ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var TreeDispatcher, TreePersistence; var TreeDispatcher, TreePersistence;
TreeDispatcher = require('../dispatcher/Dispatcher.coffee'); TreeDispatcher = require('../dispatcher/Dispatcher.coffee');
@ -72,7 +72,7 @@ module.exports = {
},{"../dispatcher/Dispatcher.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/dispatcher/Dispatcher.coffee","../persistence/TreePersistence.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/persistence/TreePersistence.coffee"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/AnchorComponent.coffee":[function(require,module,exports){ },{"../dispatcher/Dispatcher.coffee":7,"../persistence/TreePersistence.coffee":12}],2:[function(require,module,exports){
var TreeActions, TreeStore, a, div, recl, ref; var TreeActions, TreeStore, a, div, recl, ref;
TreeStore = require('../stores/TreeStore.coffee'); TreeStore = require('../stores/TreeStore.coffee');
@ -122,7 +122,7 @@ module.exports = recl({
}, },
setPath: function(href, hist) { setPath: function(href, hist) {
if (hist !== false) { if (hist !== false) {
history.pushState({}, "", "/gen/docs/tree" + href); history.pushState({}, "", window.tree.basepath(href));
} }
return TreeActions.setCurr(href); return TreeActions.setCurr(href);
}, },
@ -138,7 +138,7 @@ module.exports = recl({
}, },
checkURL: function() { checkURL: function() {
if (this.state.url !== window.location.pathname) { if (this.state.url !== window.location.pathname) {
return this.setPath(window.location.pathname.replace("/gen/docs/tree", ""), false); return this.setPath(window.tree.fragpath(window.location.pathname), false);
} }
}, },
setTitle: function() { setTitle: function() {
@ -206,17 +206,18 @@ module.exports = recl({
var _parts, ci, curr, href, k, obj, offset, p, parts, s, sibs, up; var _parts, ci, curr, href, k, obj, offset, p, parts, s, sibs, up;
parts = []; parts = [];
if (this.state.pare) { if (this.state.pare) {
href = window.tree.basepath(this.state.pare);
parts.push(div({ parts.push(div({
id: "up" id: "up"
}, a({ }, a({
key: "arow-up", key: "arow-up",
href: this.state.pare, href: href,
className: "arow-up" className: "arow-up"
}, ""))); }, "")));
if (this.state.prev || this.state.next) { if (this.state.prev || this.state.next) {
_parts = []; _parts = [];
if (this.state.prev) { if (this.state.prev) {
href = window.tree.basepath(this.state.prev); href = window.tree.basepath(window.tree.basepath(this.state.prev));
_parts.push(a({ _parts.push(a({
key: "arow-prev", key: "arow-prev",
href: href, href: href,
@ -224,7 +225,7 @@ module.exports = recl({
}, "")); }, ""));
} }
if (this.state.next) { if (this.state.next) {
href = window.tree.basepath(this.state.next); href = window.tree.basepath(window.tree.basepath(this.state.next));
_parts.push(a({ _parts.push(a({
key: "arow-next", key: "arow-next",
href: href, href: href,
@ -252,11 +253,12 @@ module.exports = recl({
ci = k; ci = k;
} }
k++; k++;
href = window.tree.basepath(up + "/" + i);
return div({ return div({
className: c className: c
}, a({ }, a({
key: i + "-a", key: i + "-a",
href: up + "/" + i, href: href,
onClick: _this._click onClick: _this._click
}, i)); }, i));
}; };
@ -291,7 +293,7 @@ module.exports = recl({
},{"../actions/TreeActions.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/actions/TreeActions.coffee","../stores/TreeStore.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/stores/TreeStore.coffee"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/BodyComponent.coffee":[function(require,module,exports){ },{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":13}],3:[function(require,module,exports){
var TreeActions, TreeStore, div, input, load, recl, ref, textarea; var TreeActions, TreeStore, div, input, load, recl, ref, textarea;
TreeStore = require('../stores/TreeStore.coffee'); TreeStore = require('../stores/TreeStore.coffee');
@ -356,7 +358,7 @@ module.exports = recl({
},{"../actions/TreeActions.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/actions/TreeActions.coffee","../stores/TreeStore.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/stores/TreeStore.coffee","./LoadComponent.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/LoadComponent.coffee"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/KidsComponent.coffee":[function(require,module,exports){ },{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":13,"./LoadComponent.coffee":6}],4:[function(require,module,exports){
var TreeActions, TreeStore, a, div, hr, li, recl, ref, ul; var TreeActions, TreeStore, a, div, hr, li, recl, ref, ul;
TreeStore = require('../stores/TreeStore.coffee'); TreeStore = require('../stores/TreeStore.coffee');
@ -423,7 +425,7 @@ module.exports = recl({
},{"../actions/TreeActions.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/actions/TreeActions.coffee","../stores/TreeStore.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/stores/TreeStore.coffee"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/ListComponent.coffee":[function(require,module,exports){ },{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":13}],5:[function(require,module,exports){
var TreeActions, TreeStore, a, div, h1, li, load, recl, ref, ul; var TreeActions, TreeStore, a, div, h1, li, load, recl, ref, ul;
TreeStore = require('../stores/TreeStore.coffee'); TreeStore = require('../stores/TreeStore.coffee');
@ -514,7 +516,7 @@ module.exports = recl({
},{"../actions/TreeActions.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/actions/TreeActions.coffee","../stores/TreeStore.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/stores/TreeStore.coffee","./LoadComponent.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/LoadComponent.coffee"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/LoadComponent.coffee":[function(require,module,exports){ },{"../actions/TreeActions.coffee":1,"../stores/TreeStore.coffee":13,"./LoadComponent.coffee":6}],6:[function(require,module,exports){
var div, input, recl, ref, textarea; var div, input, recl, ref, textarea;
recl = React.createClass; recl = React.createClass;
@ -552,7 +554,7 @@ module.exports = recl({
},{}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/dispatcher/Dispatcher.coffee":[function(require,module,exports){ },{}],7:[function(require,module,exports){
var Dispatcher; var Dispatcher;
Dispatcher = require('flux').Dispatcher; Dispatcher = require('flux').Dispatcher;
@ -574,7 +576,7 @@ module.exports = _.extend(new Dispatcher(), {
},{"flux":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/node_modules/flux/index.js"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/main.coffee":[function(require,module,exports){ },{"flux":9}],8:[function(require,module,exports){
var rend; var rend;
rend = React.render; rend = React.render;
@ -732,7 +734,7 @@ $(function() {
},{"./actions/TreeActions.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/actions/TreeActions.coffee","./components/AnchorComponent.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/AnchorComponent.coffee","./components/BodyComponent.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/BodyComponent.coffee","./components/KidsComponent.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/KidsComponent.coffee","./components/ListComponent.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/components/ListComponent.coffee","./persistence/TreePersistence.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/persistence/TreePersistence.coffee"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/node_modules/flux/index.js":[function(require,module,exports){ },{"./actions/TreeActions.coffee":1,"./components/AnchorComponent.coffee":2,"./components/BodyComponent.coffee":3,"./components/KidsComponent.coffee":4,"./components/ListComponent.coffee":5,"./persistence/TreePersistence.coffee":12}],9:[function(require,module,exports){
/** /**
* Copyright (c) 2014, Facebook, Inc. * Copyright (c) 2014, Facebook, Inc.
* All rights reserved. * All rights reserved.
@ -744,7 +746,7 @@ $(function() {
module.exports.Dispatcher = require('./lib/Dispatcher') module.exports.Dispatcher = require('./lib/Dispatcher')
},{"./lib/Dispatcher":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/node_modules/flux/lib/Dispatcher.js"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/node_modules/flux/lib/Dispatcher.js":[function(require,module,exports){ },{"./lib/Dispatcher":10}],10:[function(require,module,exports){
/* /*
* Copyright (c) 2014, Facebook, Inc. * Copyright (c) 2014, Facebook, Inc.
* All rights reserved. * All rights reserved.
@ -996,7 +998,7 @@ var _prefix = 'ID_';
module.exports = Dispatcher; module.exports = Dispatcher;
},{"./invariant":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/node_modules/flux/lib/invariant.js"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/node_modules/flux/lib/invariant.js":[function(require,module,exports){ },{"./invariant":11}],11:[function(require,module,exports){
/** /**
* Copyright (c) 2014, Facebook, Inc. * Copyright (c) 2014, Facebook, Inc.
* All rights reserved. * All rights reserved.
@ -1051,7 +1053,7 @@ var invariant = function(condition, format, a, b, c, d, e, f) {
module.exports = invariant; module.exports = invariant;
},{}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/persistence/TreePersistence.coffee":[function(require,module,exports){ },{}],12:[function(require,module,exports){
var TreeActions; var TreeActions;
TreeActions = require('../actions/TreeActions.coffee'); TreeActions = require('../actions/TreeActions.coffee');
@ -1073,7 +1075,7 @@ module.exports = {
},{"../actions/TreeActions.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/actions/TreeActions.coffee"}],"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/stores/TreeStore.coffee":[function(require,module,exports){ },{"../actions/TreeActions.coffee":1}],13:[function(require,module,exports){
var EventEmitter, MessageDispatcher, TreeStore, _cont, _curr, _load, _snip, _tree; var EventEmitter, MessageDispatcher, TreeStore, _cont, _curr, _load, _snip, _tree;
EventEmitter = require('events').EventEmitter; EventEmitter = require('events').EventEmitter;
@ -1284,7 +1286,7 @@ module.exports = TreeStore;
},{"../dispatcher/Dispatcher.coffee":"/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/dispatcher/Dispatcher.coffee","events":"/usr/local/lib/node_modules/watchify/node_modules/browserify/node_modules/events/events.js"}],"/usr/local/lib/node_modules/watchify/node_modules/browserify/node_modules/events/events.js":[function(require,module,exports){ },{"../dispatcher/Dispatcher.coffee":7,"events":14}],14:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors. // Copyright Joyent, Inc. and other Node contributors.
// //
// Permission is hereby granted, free of charge, to any person obtaining a // Permission is hereby granted, free of charge, to any person obtaining a
@ -1344,10 +1346,8 @@ EventEmitter.prototype.emit = function(type) {
er = arguments[1]; er = arguments[1];
if (er instanceof Error) { if (er instanceof Error) {
throw er; // Unhandled 'error' event throw er; // Unhandled 'error' event
} else {
throw TypeError('Uncaught, unspecified "error" event.');
} }
return false; throw TypeError('Uncaught, unspecified "error" event.');
} }
} }
@ -1589,4 +1589,4 @@ function isUndefined(arg) {
return arg === void 0; return arg === void 0;
} }
},{}]},{},["/Users/galen/Documents/src/urbit-dev/urb/zod/docs/pub/tree/src/js/main.coffee"]); },{}]},{},[8]);

View File

@ -0,0 +1,12 @@
# installing
`npm install`
# building
in `src/js/`:
`watchify -v -t coffeeify -o main.js main.coffee`
in `src/css/`:
`stylus -w main.styl`

View File

@ -1,45 +0,0 @@
::
:::: /hook/core/radio/sur
::
|%
++ audience (map station delivery) :: destination/state
++ atlas (map ship status) :: presence map
++ command :: effect on party
$% [%design (pair span (unit config))] :: configure/destroy
[%publish (list thought)] :: originate
[%review (list thought)] :: deliver
[%ping (map station presence)] :: declare status
== ::
++ config :: party configuration
$: sources=(set station) :: pulls from
cordon=(each (set ship) (set ship)) :: white/blacklist
== ::
++ cousin (pair ship span) :: domestic flow
++ delivery ?(%pending %received %rejected %released) :: delivery state
++ human :: human identifier
$: true=(unit (trel ,@t (unit ,@t) ,@t)) :: true name
hand=(unit ,@t) :: handle
== ::
++ partner :: foreign flow
$% [%twitter p=@t] :: twitter
== ::
++ presence ?(%hear %talk) :: status type
++ report :: unified rush/rust
$% [%house (set span)] :: meta-changes
[%grams (pair ,@ud (list telegram))] :: thoughts
[%group (pair atlas (map station atlas))] :: presence
[%config config] :: reconfigure
== ::
++ serial ,@uvH :: unique identity
++ station (each cousin partner) :: interlocutor
++ status (pair presence human) :: participant
++ speech :: party action
$% [%own p=@t] :: @ or /me
[%exp p=@t q=(unit tank)] :: program output
[%say p=@t] :: normal line
[%inv p=ship q=span] :: invite to
== ::
++ statement (pair ,@da speech) :: when this
++ telegram (pair ship thought) :: who which whom what
++ thought (trel serial audience statement) :: which whom what
--

116
main/sur/sole/core.hook Normal file
View File

@ -0,0 +1,116 @@
::
:::: /hook/core/sole/sur
!:
|%
++ sole-action :: sole to app
$% :: [%abo ~] :: reset interaction
[%det sole-change] :: command line edit
[%ret ~] :: submit and clear
== ::
++ sole-buffer (list ,@c) :: command state
++ sole-change :: network change
$: ler=sole-clock :: destination clock
haw=@uvH :: source hash
ted=sole-edit :: state change
== ::
++ sole-dialog :: standard dialog
|* out=$+(* *) :: output structure
$+(sole-input (sole-result out)) :: output function
:: ::
++ sole-result :: conditional result
|* out=$+(* *) :: output structure
$|(@ud (sole-product out)) :: error position
:: ::
++ sole-product :: success result
|* out=$+(* *) ::
%+ pair (list tank) ::
%+ each (unit out) :: ~ is abort
(pair sole-prompt (sole-dialog out)) :: ask and continue
:: ::
++ sole-so :: construct result
|* pro=* ::
[p=*(list tank) q=[%& p=[~ u=pro]]] ::
:: ::
++ sole-yo :: add output tank
|* [tan=tank res=(sole-result)] ::
?@ res res ::
[p=[i=tan t=p.res] q=q.res] ::
:: ::
++ sole-lo :: construct prompt
|* [pom=sole-prompt mor=(sole-dialog)] ::
[p=*(list tank) q=[%| p=pom q=mor]] ::
:: ::
++ sole-no :: empty result
[p=*(list tank) q=~] ::
:: ::
++ sole-go :: parse by rule
|* [sef=_rule fun=$+(* *)] ::
|= txt=sole-input ::
=+ vex=(sef [0 0] txt) ::
?: |(!=((lent txt) q.p.vex) ?=(~ q.vex)) ::
q.p.vex ::
(fun p.u.q.vex) ::
:: ::
++ sole-clock ,[own=@ud his=@ud] :: vector clock
++ sole-edit :: shared state change
$% [%del p=@ud] :: delete one at
[%ins p=@ud q=@c] :: insert at
[%mor p=(list sole-edit)] :: combination
[%nop ~] :: no-op
[%set p=sole-buffer] :: discontinuity
== ::
++ sole-effect :: app to sole
$% [%bel ~] :: beep
[%blk p=@ud q=@c] :: blink/match char at
[%clr ~] :: clear screen
[%det sole-change] :: edit command
[%err p=@ud] :: error point
[%mor p=(list sole-effect)] :: multiple effects
[%nex ~] :: save, clear command
[%pro sole-prompt] :: set prompt
[%sag p=path q=*] :: save to jamfile
[%sav p=path q=@] :: save to file
[%tan p=(list tank)] :: classic tank
:: [%taq p=tanq] :: modern tank
[%txt p=tape] :: text line
== ::
++ sole-command :: command state
$: pos=@ud :: cursor position
say=sole-share :: cursor
== ::
++ sole-prompt :: prompt definition
$: vis=? :: command visible
tag=term :: history mode
cad=tape :: caption
== ::
++ sole-input tape :: prompt input
++ sole-share :: symmetric state
$: ven=sole-clock :: our vector clock
leg=(list sole-edit) :: unmerged edits
buf=sole-buffer :: sole state
== ::
++ dill-belt :: sole input
$% [%aro p=?(%d %l %r %u)] :: arrow key
[%bac ~] :: true backspace
[%cru p=@tas q=(list tank)] :: echo error
[%ctl p=@] :: control-key
[%del ~] :: true delete
[%met p=@] :: meta-key
[%ret ~] :: return
[%rez p=@ud q=@ud] :: resize, cols, rows
[%txt p=(list ,@c)] :: utf32 text
[%yow p=gill] :: connect to app
== ::
++ dill-blit :: sole output
$% [%bel ~] :: make a noise
[%clr ~] :: clear the screen
[%hop p=@ud] :: set cursor position
[%mor p=(list dill-blit)] :: multiple blits
[%pro p=(list ,@c)] :: show as cursor/line
[%qit ~] :: close console
[%out p=(list ,@c)] :: send output line
[%sag p=path q=*] :: save to jamfile
[%sav p=path q=@] :: save to file
== ::
++ gill (pair ship term) :: general contact
--

View File

@ -1 +0,0 @@
,[~]

View File

@ -1,8 +1,7 @@
:: ::
:::: /hook/core/rodeo/sur :::: /hook/core/talk/sur
!: !:
|% |%
++ ache |*([a=$+(* *) b=$+(* *)] $%([| p=b] [& p=a])) :: PM 314
++ audience (map partner (pair envelope delivery)) :: destination/state ++ audience (map partner (pair envelope delivery)) :: destination/state
++ atlas (map ship status) :: presence map ++ atlas (map ship status) :: presence map
++ bouquet (set flavor) :: complete aroma ++ bouquet (set flavor) :: complete aroma
@ -11,6 +10,10 @@
[%publish (list thought)] :: originate [%publish (list thought)] :: originate
[%review (list thought)] :: deliver [%review (list thought)] :: deliver
== :: == ::
++ cabal :: metaconfiguration
$: loc=config :: local config
ham=(map station config) :: neighborhood configs
==
++ config :: party configuration ++ config :: party configuration
$: sources=(set partner) :: pulls from $: sources=(set partner) :: pulls from
caption=cord :: about caption=cord :: about
@ -34,32 +37,32 @@
$% [%twitter p=@t] :: twitter $% [%twitter p=@t] :: twitter
== :: == ::
++ posture :: security posture ++ posture :: security posture
$? %black :: public $? %black :: channel
%white :: private %white :: village
%green :: readonly %green :: journal
%brown :: writeonly %brown :: mailbox
== :: == ::
++ presence ?(%gone %hear %talk) :: status type ++ presence ?(%gone %hear %talk) :: status type
++ register (pair atlas (map partner atlas)) :: ping me, ping srcs ++ register (pair atlas (map partner atlas)) :: ping me, ping srcs
++ report :: radio update ++ shelf (map span (pair posture cord)) :: ship shape
$% [%config config] :: reconfigure ++ report :: talk update
$% [%cabal cabal] :: config neighborhood
:: [%folder (list report)] :: multiple :: [%folder (list report)] :: multiple
[%grams (pair ,@ud (list telegram))] :: beginning, thoughts [%grams (pair ,@ud (list telegram))] :: beginning, thoughts
[%group register] :: presence [%group register] :: presence
[%house (map span (pair posture cord))] :: station set [%house shelf] :: station set
== :: == ::
++ speech :: narrative action ++ speech :: narrative action
:: XX unify %own and %say to %lin
::
$% [%lan p=span q=@t] :: local announce $% [%lan p=span q=@t] :: local announce
[%exp p=@t] :: hoon line [%exp p=@t] :: hoon line
[%non ~] :: no content (yo) [%non ~] :: no content (yo)
[%ext p=@tas q=*] :: extended action [%ext p=@tas q=*] :: extended action
[%fat p=torso q=speech] :: attachment [%fat p=torso q=speech] :: attachment
:: [%inv p=station] :: invite to station :: [%inv p=station] :: invite to station
[%url p=purl] :: parsed url
[%ire p=serial q=speech] :: in-reply-to [%ire p=serial q=speech] :: in-reply-to
[%lin p=? q=@t] :: no=@, text line [%lin p=? q=@t] :: no=@, text line
[%mor p=(list speech)] :: XX deleteme [%mor p=(list speech)] :: multiplex
== :: == ::
++ serial ,@uvH :: unique identity ++ serial ,@uvH :: unique identity
++ partner (each station passport) :: interlocutor ++ partner (each station passport) :: interlocutor

View File

@ -17,11 +17,11 @@
;head ;head
;title: urbit Tree ;title: urbit Tree
;meta(name "viewport", content "width=device-width, initial-scale=1"); ;meta(name "viewport", content "width=device-width, initial-scale=1");
;link(type "text/css", rel "stylesheet", href "/gen/docs/pub/tree/src/css/main.css"); ;link(type "text/css", rel "stylesheet", href "/docs/pub/tree/src/css/main.css");
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"); ;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js");
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"); ;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js");
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/react/0.12.2/react.js"); ;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/react/0.12.2/react.js");
;script(type "text/javascript", src "/gen/docs/pub/tree/src/js/main.js"); ;script(type "text/javascript", src "/docs/pub/tree/src/js/main.js");
== ==
;body ;body
;script(type "text/javascript"):""" ;script(type "text/javascript"):"""