9 | data BankersDeque a = BD Int (List a) Int (List a)
14 | check : Int -> List a -> Int -> List a -> BankersDeque a
15 | check lenf f lenr r =
16 | if lenf > c * lenr + 1 then
17 | let i = (lenf + lenr) `div` 2
19 | f' = take (cast i) f
20 | r' = r ++ reverse (drop (cast i) f)
22 | else if lenr > c * lenf + 1 then
23 | let j = (lenf + lenr) `div` 2
25 | r' = take (cast j) r
26 | f' = f ++ reverse (drop (cast j) r)
28 | else BD lenf f lenr r
32 | Deque BankersDeque where
33 | empty = BD 0 [] 0 []
34 | isEmpty (BD lenf f lenr r) = lenf + lenr == 0
36 | cons x (BD lenf f lenr r) = check (lenf + 1) (x :: f) lenr r
38 | head (BD lenf [] lenr [x]) = x
39 | head (BD lenf [] lenr r) = idris_crash "empty deque"
40 | head (BD lenf (x :: f') lenr r) = x
42 | tail (BD lenf [] lenr [x]) = empty
43 | tail (BD lenf [] lenr r) = idris_crash "empty deque"
44 | tail (BD lenf (x :: f') lenr r) = check (lenf - 1) f' lenr r
46 | snoc (BD lenf f lenr r) x = check lenf f (lenr + 1) (x :: r)
48 | last (BD lenf [x] lenr []) = x
49 | last (BD lenf f lenr []) = idris_crash "empty deque"
50 | last (BD lenf f lenr (x :: r')) = x
52 | init (BD lenf [x] lenr []) = empty
53 | init (BD lenf f lenr []) = idris_crash "empty deque"
54 | init (BD lenf f lenr (x :: r')) = check lenf f (lenr - 1) r'