urbit/pkg/base-dev/lib/sss.hoon

270 lines
7.8 KiB
Plaintext
Raw Normal View History

2023-02-01 19:05:18 +03:00
/- *sss
2023-02-15 17:54:06 +03:00
/+ *mip
2023-02-01 19:05:18 +03:00
::
|%
++ mk-subs |* [=(lake) paths=mold] -:+6:(da lake paths)
++ mk-pubs |* [=(lake) paths=mold] -:+6:(du lake paths)
++ mk-mar
|* =(lake)
|_ =(response:poke lake *)
++ grow
|%
++ noun response
--
++ grab
|%
++ noun (response:poke lake *)
--
++ grad %noun
--
++ lake-mark
|= =mark
^+ mark
2023-02-01 23:52:30 +03:00
?> =('sss-' (end [3 4] mark))
2023-02-01 19:05:18 +03:00
(cut 3 [4 (met 3 mark)] mark)
::
++ fled :: Like +sped but head is a path.
|= vax=vase
^- vase
:_ q.vax
%- ~(play ut p.vax)
=- [%wtgr [%wtts - [%& 2]~] [%$ 1]]
2023-02-15 17:54:06 +03:00
=/ pax ~| %path-none ;;(path -.q.vax)
2023-02-01 19:05:18 +03:00
|- ^- spec
?~ pax [%base %null]
[%bccl ~[[%leaf %ta -.pax] $(pax +.pax)]]
::
2023-02-15 17:54:06 +03:00
++ zoom |= =noun ~| %need-path $/sss/;;(path noun)
2023-02-01 19:05:18 +03:00
++ da
|* [=(lake) paths=mold]
=>
|%
2023-02-15 17:54:06 +03:00
+$ flow [=aeon fail=_| =rock:lake]
2023-02-01 19:05:18 +03:00
--
|_ [sub=(map [ship dude paths] flow) =bowl:gall result-type=type on-rock-type=type]
+$ from (on-rock:poke lake paths)
+$ into (response:poke lake paths)
+$ result (request:poke paths)
2023-02-15 17:54:06 +03:00
++ behn-s25
|= [=dude =aeon path=noun]
2023-02-01 19:05:18 +03:00
^- card:agent:gall
2023-02-15 17:54:06 +03:00
:* %pass (zoom sub/behn/(scot %p src.bowl)^dude^(scot %ud aeon)^path)
%arvo %b %wait (add ~s25 now.bowl)
==
++ pine |= [ship dude paths] (scry ~ +<)
++ surf pine
++ scry
|= [when=(unit aeon) who=ship which=dude where=paths]
^- card:agent:gall
=/ when ?~ when %~ (scot %ud u.when)
:* %pass (zoom request/scry/(scot %p who)^which^when^where)
%agent [who which]
2023-02-01 19:05:18 +03:00
%poke %sss-to-pub :- result-type ^- result
2023-02-15 17:54:06 +03:00
[where which ^when]
2023-02-01 19:05:18 +03:00
==
++ read
^- (map [ship dude paths] [fail=? rock:lake])
2023-02-01 19:05:18 +03:00
%- ~(run by sub)
|= =flow
2023-02-15 17:54:06 +03:00
[fail rock]:flow
2023-02-01 19:05:18 +03:00
::
++ chit
|= [[aeon=term ship=term dude=term path=paths] =sign:agent:gall]
^+ sub
?> ?=(%poke-ack -.sign)
?~ p.sign sub
%+ ~(jab by sub) [(slav %p ship) dude path]
|= =flow
2023-02-15 17:54:06 +03:00
?> =(aeon.flow (slav %ud aeon))
flow(fail &)
2023-02-01 19:05:18 +03:00
::
++ behn
2023-02-15 17:54:06 +03:00
|= [ship=term =dude aeon=term path=paths]
2023-02-01 19:05:18 +03:00
^- (list card:agent:gall)
2023-02-15 17:54:06 +03:00
=/ ship (slav %p ship)
2023-02-01 19:05:18 +03:00
?. (~(has by sub) ship dude path) ~
2023-02-15 17:54:06 +03:00
~[(scry `(slav %ud aeon) ship dude path)]
2023-02-01 19:05:18 +03:00
::
++ apply
|= res=(response:poke lake paths)
^- (quip card:agent:gall _sub)
2023-02-15 17:54:06 +03:00
?- type.res
%yore
:_ sub :_ ~
(pine src.bowl dude.res path.res)
2023-02-01 19:05:18 +03:00
::
2023-02-15 17:54:06 +03:00
%nigh
:_ sub :_ ~
(behn-s25 [dude aeon path]:res)
2023-02-01 19:05:18 +03:00
::
2023-02-15 17:54:06 +03:00
%scry
=* current [src.bowl dude.res path.res]
=/ [wave=(unit wave:lake) =flow]
=/ old=flow (~(gut by sub) current *flow)
?- what.res
%rock ?> (gte aeon.res aeon.old)
`[aeon.res | rock.res]
%wave ?> =(aeon.res +(aeon.old))
[`wave.res [aeon.res | (wash:lake rock.old wave.res)]]
==
2023-02-01 19:05:18 +03:00
:_ (~(put by sub) current flow)
2023-02-15 17:54:06 +03:00
%- flop
:~ (scry `+(aeon.res) src.bowl dude.res path.res)
:* %pass (zoom on-rock/(scot %ud aeon.flow)^(scot %p src.bowl)^dude.res^path.res)
2023-02-01 19:05:18 +03:00
%agent [our dap]:bowl
2023-02-15 17:54:06 +03:00
%poke %sss-on-rock on-rock-type ^- from
[path.res src.bowl dude.res rock.flow wave]
2023-02-01 19:05:18 +03:00
== ==
2023-02-15 17:54:06 +03:00
==
2023-02-01 19:05:18 +03:00
--
++ du
|* [=(lake) paths=mold]
=>
|%
+$ rule [rocks=_1 waves=_5]
+$ tide
$: rok=((mop aeon rock:lake) gte)
wav=((mop aeon wave:lake) lte)
rul=rule
2023-02-15 17:54:06 +03:00
mem=(mip aeon [ship dude] @da)
2023-02-01 19:05:18 +03:00
==
--
|_ [pub=(map paths tide) =bowl:gall result-type=type]
+* rok ((on aeon rock:lake) gte)
wav ((on aeon wave:lake) lte)
::
+$ into (request:poke paths)
+$ result (response:poke lake paths)
2023-02-15 17:54:06 +03:00
++ behn-s25
|= [=dude =aeon path=noun]
^- card:agent:gall
:* %pass (zoom pub/behn/(scot %p src.bowl)^dude^(scot %ud aeon)^path)
%arvo %b %wait (add ~s25 now.bowl)
==
++ behn-rest
|= [=ship =dude =aeon path=noun =@da]
^- card:agent:gall
:* %pass (zoom pub/behn/(scot %p ship)^dude^(scot %ud aeon)^path)
%arvo %b %rest da
==
2023-02-01 19:05:18 +03:00
++ rule
|= [path=paths =^rule]
^+ pub
%+ ~(jab by pub) path
|= =tide
2023-02-01 23:52:30 +03:00
(form tide(rul rule))
2023-02-01 19:05:18 +03:00
::
++ wipe
|= path=paths
^+ pub
%+ ~(jab by pub) path
|= =tide
2023-02-01 23:52:30 +03:00
%* . (form tide(rul [0 1]))
2023-02-01 19:05:18 +03:00
rul rul.tide
2023-02-01 23:52:30 +03:00
wav ~
2023-02-01 19:05:18 +03:00
==
2023-02-15 17:54:06 +03:00
++ behn
|= [ship=term =dude aeon=term path=paths]
^+ pub
%+ ~(jab by pub) path
|= =tide
^+ tide
tide(mem (~(del bi mem.tide) (slav %ud aeon) (slav %p ship) dude))
2023-02-01 23:52:30 +03:00
::
2023-02-15 17:54:06 +03:00
++ send
|= [=wave:lake =ship =dude =aeon path=paths]
^- card:agent:gall
=* mark (cat 3 %sss- name:lake)
:* %pass (zoom response/scry/(scot %p ship)^dude^(scot %ud aeon)^path)
%agent [ship dude]
%poke mark result-type ^- (response:poke lake paths)
[path dap.bowl aeon scry/wave/wave]
==
2023-02-01 19:05:18 +03:00
++ give
|= [path=paths =wave:lake]
2023-02-15 17:54:06 +03:00
^- (quip card:agent:gall _pub)
2023-02-01 19:05:18 +03:00
?~ ;;((soft ^path) path) ~| %need-path !!
=/ =tide (~(gut by pub) path *tide)
=/ next=aeon
2023-02-15 17:54:06 +03:00
.+ %+ max
2023-02-01 19:05:18 +03:00
(fall (bind (pry:rok rok.tide) head) 0)
(fall (bind (ram:wav wav.tide) head) 0)
2023-02-15 17:54:06 +03:00
::
:_ %+ ~(put by pub) path
=/ last=[=aeon =rock:lake] (fall (pry:rok rok.tide) *[key val]:rok)
=. wav.tide (put:wav wav.tide next wave)
=. mem.tide (~(del by mem.tide) next)
?. =(next (add aeon.last waves.rul.tide)) tide
(form tide)
::
%+ (corl zing turn) ~(tap by (~(gut by mem.tide) next ~))
|= [[=ship =dude] =@da]
^- (list card:agent:gall)
:~ (behn-rest ship dude next path da)
(send wave ship dude next path)
==
2023-02-01 23:52:30 +03:00
++ form
2023-02-01 19:05:18 +03:00
|= =tide
^+ tide
2023-02-01 23:52:30 +03:00
=/ max-rock=[=aeon =rock:lake] (fall (pry:rok rok.tide) *[key val]:rok)
=/ max-wave (fall (bind (ram:wav wav.tide) head) 0)
2023-02-01 19:05:18 +03:00
=. rok.tide
%+ gas:rok +<-:gas:rok
%- tab:rok :_ [~ +(rocks.rul.tide)]
2023-02-01 23:52:30 +03:00
?: ?| =(waves.rul.tide 0)
(lth max-wave (add aeon.max-rock waves.rul.tide))
==
rok.tide
%+ put:rok rok.tide
%+ roll (tab:wav wav.tide `aeon.max-rock max-wave)
|: [*[now=aeon =wave:lake] `[prev=aeon =rock:lake]`max-rock]
~| %aeon-awry
?> =(now +(prev))
[now (wash:lake rock wave)]
~| %rock-zero
2023-02-01 19:05:18 +03:00
tide(wav (lot:wav wav.tide (bind (ram:rok rok.tide) |=([r=@ *] (dec r))) ~))
::
++ read
^- (map paths rock:lake)
2023-02-01 19:05:18 +03:00
%- ~(run by pub)
|= =tide
=< rock
=/ snap=[=aeon =rock:lake] (fall (pry:rok rok.tide) *[key val]:rok)
%+ roll (tap:wav (lot:wav wav.tide `aeon.snap ~))
|= [[=aeon =wave:lake] =_snap]
?. =(aeon +(aeon.snap)) snap
[aeon (wash:lake rock.snap wave)]
::
++ apply
|= req=(request:poke paths)
2023-02-15 17:54:06 +03:00
|^ ^- (quip card:agent:gall _pub)
2023-02-01 19:05:18 +03:00
=/ =tide (~(gut by pub) path.req *tide)
2023-02-15 17:54:06 +03:00
?~ when.req
=/ last (fall (pry:rok rok.tide) *[=key =val]:rok)
:_ pub :_ ~
(mk-card key.last scry/rock/val.last)
?^ dat=(get:wav wav.tide u.when.req)
:_ pub :_ ~
(mk-card u.when.req scry/wave/u.dat)
?. (gth u.when.req key::(fall (ram:wav wav.tide) [key=+(u.when.req) **]))
:_ pub :_ ~
(mk-card u.when.req yore/~)
:- ~[(behn-s25 [dude u.when path]:req) (mk-card u.when.req nigh/~)]
%+ ~(put by pub) path.req
%= tide mem
%^ ~(put bi mem.tide) u.when.req [src.bowl dude.req]
(add ~s25 now.bowl)
==
2023-02-01 19:05:18 +03:00
::
2023-02-15 17:54:06 +03:00
++ mk-card
|= dat=_|2:*(response:poke lake paths)
=* mark (cat 3 %sss- name:lake)
=* when ?~(when.req %$ (scot %ud u.when.req))
:* %pass (zoom response/scry/(scot %p src.bowl)^dude.req^when^path.req)
%agent [src.bowl dude.req]
%poke mark result-type path.req dap.bowl dat
2023-02-01 19:05:18 +03:00
==
2023-02-15 17:54:06 +03:00
--
2023-02-01 19:05:18 +03:00
--
--