-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBehaviourTree.elm
46 lines (40 loc) · 1.79 KB
/
BehaviourTree.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
module BehaviourTree exposing (..)
type Result = Running | Success | Failure
type alias Routine a = a -> (a, Result)
type Behaviour a
= Leaf (Routine a)
| Repeat (Behaviour a) (Behaviour a) -- original and current state
| Sequence (List (Behaviour a))
| Select (List (Behaviour a))
empty : Behaviour a
empty = Sequence []
repeat : Behaviour a -> Behaviour a
repeat b = Repeat b b
step : Behaviour a -> a -> (a, Result, Behaviour a)
step b_current data = case b_current of
Leaf routine -> let (output, result) = routine data in
(output, result, b_current)
Repeat b_original b_sub -> let (output, result, b_next) = step b_sub data in
case result of
Running -> (output, Running, Repeat b_original b_next)
Success -> (output, Running, Repeat b_original b_original)
Failure -> (output, Success, Repeat b_original b_next)
Sequence [] -> (data, Success, b_current)
Sequence (b_sub :: []) -> let (output, result, b_next) = step b_sub data in
case result of
Running -> (output, Running, Sequence [b_next])
Success -> (output, Success, Sequence [])
Failure -> (output, Failure, Sequence [b_next])
Sequence (b_sub :: bb) -> let (output, result, b_next) = step b_sub data in
case result of
Running -> (output, Running, Sequence (b_next :: bb))
Success -> (output, Running, Sequence bb)
Failure -> (output, Failure, Sequence (b_next :: bb))
Select [] -> (data, Failure, b_current)
Select (b_sub :: []) -> let (output, result, b_next) = step b_sub data in
(output, result, Select [b_next])
Select (b_sub :: bb) -> let (output, result, b_next) = step b_sub data in
case result of
Running -> (output, Running, Select (b_next :: bb))
Success -> (output, Success, Select (b_next :: bb))
Failure -> (output, Running, Select bb)