packages feed

swarm-0.7.0.0: data/scenarios/Challenges/_friend/cat.sw

def forever : Cmd Unit -> Cmd Unit = \c. c ; forever c end

def repeat : Int -> Cmd Unit -> Cmd Unit =
  \n. \c. if (n == 0) {} {c ; repeat (n-1) c}
end

def elif = \t. \then. \else. {if t then else} end
def else = \t. t end

def abs = \n. if (n < 0) {-n} {n} end

def randdir : Cmd Dir =
  d <- random 4;
  pure (
    if (d == 0) {north}
    $ elif (d == 1) {east}
    $ elif (d == 2) {south}
    $ else {west}
  )
end

def chooseWait : Cmd Int =
  t <- random (16*2);
  pure (16 + t)
end

def wander =
  d <- randdir;
  turn d;
  dist <- random 2;
  try {repeat dist move} {};
  r <- random 5;
  if (r == 0) { say "meow" } {}
end

def disappointed = \cat. say "meow??"; cat end

def follow : Cmd Unit -> Actor -> Cmd Unit = \cat. \r.
  rLoc <- as r {whereami};
  match rLoc \rx. \ry.
  myLoc <- whereami;
  match myLoc \myx. \myy.
  let dx = rx - myx in
  let dy = ry - myy in
  if (abs dx > abs dy)
  { if (dx < 0) {turn west} {turn east} }
  { if (dy < 0) {turn south} {turn north} };
  if (abs dx != 0 || abs dy != 0) {try { move } { disappointed cat }} {};
  wait 4;
  follow cat r
end

def love = \cat.
  say "purr";
  fishGiver <- meet;
  case fishGiver
    (\_. disappointed cat)
    (\r. follow cat r)
end

def cat = \start. \fishCount. \waitTime.
  if (waitTime == 0) { wander; start } { wait 1 };
  n <- count "fish";
  if (n > fishCount)
  { say "yum!";
    if (n >= 3) { love start } { cat start n (waitTime - 1) }
  }
  { cat start fishCount (waitTime - 1) }
end

def startCat =
  n <- count "fish";
  w <- chooseWait;
  cat startCat n w
end;

startCat