ushalow
[clean-tests.git] / doublylinked / test.icl
1 module test
2
3 :: DList a = Nil | Cons a (Link (DList a))
4 :: Link a = {prev :: a, next :: a}
5
6 fromList :: ([a] -> DList a)
7 fromList = go Nil
8 where
9 go :: (DList a) [a] -> DList a
10 go prev [] = Nil
11 go prev [a:as] =
12 let head = Cons a {prev=prev,next=tail}
13 tail = go head as
14 in head
15
16 toList :: (DList a) -> [a]
17 toList Nil = []
18 toList (Cons el {next}) = [el:toList next]
19
20 nil :: DList a
21 nil = Nil
22
23 (:!) infixr 0 :: a (DList a) -> DList a
24 (:!) elh Nil = Cons elh {prev=nil,next=nil}
25 (:!) elh (Cons elt link) =
26 let tail = Cons elt {link & prev=head}
27 head = Cons elh {prev=nil,next=tail}
28 in head
29
30 Start =
31 (toList (1 :! 2 :! 3 :! nil)
32 ,toList (fromList [1,2,3])
33 )