Library zoo_parabs.vertex__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_parabs.pool.
Require Import zoo_saturn.stack_mpmc_2.
Require Import zoo_std.clist.
Require Import zoo.options.

Notation "'vertexู task'" := (
  in_type "zoo_parabs.vertex.t" 0
)(in custom zoo_field
).
Notation "'vertexู preds'" := (
  in_type "zoo_parabs.vertex.t" 1
)(in custom zoo_field
).
Notation "'vertexู succs'" := (
  in_type "zoo_parabs.vertex.t" 2
)(in custom zoo_field
).

Definition vertexู create : val :=
  ๐—ณ๐˜‚๐—ป "task" โ†’
    ๐—น๐—ฒ๐˜ "task" =
      ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "task" ๐˜„๐—ถ๐˜๐—ต
      | Some "task" โ†’
          "task"
      | None โ†’
          ๐—ณ๐˜‚๐—ป โŽฝ โ†’ true
      ๐—ฒ๐—ป๐—ฑ
    ๐—ถ๐—ป
    { "task", 1, stack_mpmc_2ู create () }.

Definition vertexู create' : val :=
  ๐—ณ๐˜‚๐—ป "task" โ†’
    vertexู create โ€˜Some( ๐—ณ๐˜‚๐—ป "ctx" โ†’ "task" "ctx" โฎ
                                                  true ).

Definition vertexู task : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    "t".{vertexู task}.

Definition vertexู set_task : val :=
  ๐—ณ๐˜‚๐—ป "t" "task" โ†’
    "t" <-{vertexู task} "task".

Definition vertexู precede : val :=
  ๐—ณ๐˜‚๐—ป "t1" "t2" โ†’
    ๐—น๐—ฒ๐˜ "succs1" = "t1".{vertexู succs} ๐—ถ๐—ป
    ๐—ถ๐—ณ ยฌ stack_mpmc_2ู is_closed "succs1" ๐˜๐—ต๐—ฒ๐—ป (
      ๐—ณ๐—ฎ๐—ฎ "t2".[vertexู preds] 1 โฎ
      ๐—ถ๐—ณ stack_mpmc_2ู push "succs1" "t2" ๐˜๐—ต๐—ฒ๐—ป (
        ๐—ณ๐—ฎ๐—ฎ "t2".[vertexู preds] (-1) โฎ
        ()
      )
    ).

#[local] Definition __zoo_recs_0 :=
  ( ๐—ฟ๐—ฒ๐—ฐ๐˜€ "release" "ctx" "t" โ†’
      ๐—ถ๐—ณ ๐—ณ๐—ฎ๐—ฎ "t".[vertexู preds] (-1) == 1 ๐˜๐—ต๐—ฒ๐—ป (
        "run" "ctx" "t"
      )
    ๐˜„๐—ถ๐˜๐—ต "run" "ctx" "t" โ†’
      poolู async "ctx"
        (๐—ณ๐˜‚๐—ป "ctx" โ†’
           "t" <-{vertexู preds} 1 โฎ
           ๐—ถ๐—ณ "t".{vertexู task} "ctx" ๐˜๐—ต๐—ฒ๐—ป (
             ๐—น๐—ฒ๐˜ "succs" =
               stack_mpmc_2ู close "t".{vertexู succs}
             ๐—ถ๐—ป
             clistู iter
               (๐—ณ๐˜‚๐—ป "succ" โ†’ "release" "ctx" "succ")
               "succs"
           ) ๐—ฒ๐—น๐˜€๐—ฒ (
             "release" "ctx" "t"
           ))
  )%zoo_recs.
Definition vertexู release :=
  ValRecs 0 __zoo_recs_0.
Definition vertexู run :=
  ValRecs 1 __zoo_recs_0.
#[global] Instance :
  AsValRecs' vertexู release 0 __zoo_recs_0 [
    vertexู release ;
    vertexู run
  ].
#[global] Instance :
  AsValRecs' vertexู run 1 __zoo_recs_0 [
    vertexู release ;
    vertexู run
  ].

Definition vertexู yield : val :=
  ๐—ณ๐˜‚๐—ป "vtx" "task" โ†’
    vertexู set_task "vtx" "task" โฎ
    false.