initial framework added
[fp1415-soccerfun.git] / src / StdLibExt / StdEnvExt.dcl
1 definition module StdEnvExt
2
3 /** Collection of generally useful functions that are not related to SoccerFun.
4 */
5 import StdEnv
6 import StdMaybe
7
8 /** const2 a _ _ = a
9 is a frequently occurring version of the const function.
10 */
11 const2 :: !.a .b .c -> .a
12
13 /** iterateSt f x
14 is the state based version of iterate (StdList):
15 iterateSt f x_0
16 [y_1,y_2,y_3,y_4...]
17 where
18 (y_i,x_i) = f x_i
19 */
20 iterateSt :: !(s -> (a,s)) !s -> [a]
21
22 /** iterateStn n f x
23 is the finite version of iterateSt.
24 */
25 iterateStn :: !Int !(s -> (a,s)) !s -> (![a],!s)
26
27 /** State strict versions of seq and seqList:
28 */
29 sseq :: ![.(.s -> .s)] !.s -> .s
30 sseqList:: ![St .s .a] !.s -> (![.a],!.s)
31
32 /** apply x [f_0 ... f_n] = [f_0 x, ..., f_n x]
33 */
34 apply :: a ![a->.b] -> [.b]
35
36 /** State passing version of map:
37 */
38 mapSt :: !(.(.a,.s) -> .(.b,.s)) !(![.a],.s) -> (![.b],.s)
39
40 /** Strict state passing version of map:
41 */
42 smapSt :: !(.(.a,.s) -> .(.b,.s)) !(![.a],!.s) -> (![.b],!.s)
43
44 /** singleOutElems [a_1..a_n] = [(a_1,[a_2..a_n]),(a_2,[a_1,a_3..a_n])..(a_n,[a_1..a_(n-1)])]
45 */
46 singleOutElems :: ![a] -> [(a,[a])]
47
48 /** hdtl [a:as] = (a,as)
49 */
50 hdtl :: ![a] -> (a,[a])
51
52 /** isSingleton [_] = True;
53 isSingleton _ = False.
54 */
55 isSingleton :: ![a] -> Bool
56
57 /** filterSt cond xs st
58 filters all elements from xs using a state parameter st that is threaded along.
59 */
60 filterSt :: (a .s -> (Bool,.s)) !.[a] !.s -> (.[a],.s)
61
62 /** spanfilter cond xs = (filter cond xs, filter (not o cond) xs)
63 spanfilterSt cond xs st
64 same, but with state parameter st that is threaded along.
65 */
66 spanfilter :: (a -> Bool) !.[a] -> (.[a],.[a])
67 spanfilterSt :: (a .s -> (Bool,.s)) !.[a] .s -> (.(.[a],.[a]),.s)
68
69 /** find1 cond (A ++ [a] ++ B) = a
70 where for each x in A: not (cond x) /\ cond a
71 */
72 find1 :: !(a -> Bool) ![a] -> a
73
74 /** break cond (A ++ B ++ C) = (A,B,C)
75 where for each x in A: not (cond x) /\
76 for each x in B: (cond x) /\
77 if C=[x:_]: not (cond x)
78 */
79 break :: !(a -> Bool) ![a] -> (![a],![a],![a])
80
81 /** break1 cond (A ++ [B] ++ C) = (A,B,C)
82 where for each x in A: not (cond x) /\
83 (cond B) /\
84 if C=[x:_]: not (cond x)
85 */
86 break1 :: !(a -> Bool) ![a] -> (![a],!a,![a])
87
88 /** unbreak (a,b,c) = a ++ b ++ c
89 */
90 unbreak :: !(![a],![a],![a]) -> [a]
91
92 /** unbreak1 (a,b,c) = a ++ [b] ++ c
93 */
94 unbreak1 :: !(![a],!a,![a]) -> [a]
95
96 /** [a_1..x..a_n] ?? x = i
97 where
98 a_j <> x for all j<i
99 a_j == x for j==i
100
101 [a_1..x..a_n] ??? c = i
102 where
103 not (c a_j) for all j<i
104 (c a_j) for j==i
105 */
106 (??) infixl 9 :: ![a] !a -> Int | == a
107 (???)infixl 9 :: ![a] !(a -> Bool) -> Int
108
109 /** weave [a_1..a_n] [b_1..b_m]
110 = [a_1,b_1, a_2,b_2, ... ]
111 */
112 weave :: ![a] [a] -> [a]
113
114 /** unweave [a_1,a_2..a_n]
115 = ([a_1,a_3..],[a_2,a_4..])
116 */
117 unweave :: ![a] -> ([a],[a])
118
119 /** unweave_n n [a_1..a_n, a_{n+1}..a_{2n} ..]
120 = [[a_1,a_{n+1}..],[a_2,a_{n+2}..] ..]
121 */
122 unweave_n :: !Int [a] -> [[a]]
123
124 /** Immediate instances of toString for (,), (,,) and Maybe
125 */
126 instance toString (a,b) | toString a & toString b
127 instance toString (a,b,c) | toString a & toString b & toString c
128 instance toString (Maybe a) | toString a
129
130 /** Useful string concatenation function
131 */
132 (<+++) infixl :: !String !a -> String | toString a
133 (+++>) infixr :: !a !String -> String | toString a
134
135 /** showList inf [x_0 ... x_n] = "<x_0><inf>...<inf><x_n>"
136 showListF inf f [x_0 ... x_n] = "<f x_0><inf>...<inf><f x_n>"
137 */
138 showList :: !String !.[a] -> String | toString a
139 showListF :: !String !(a -> String) !.[a] -> String
140
141 /** Association lists a la Haskell.
142 */
143 :: AssocList k v :== [ (!k,v)]
144
145 /** lookup k [...(k,v)...] = Just v
146 lookup k _ = Nothing
147 */
148 lookup :: !k !(AssocList k v) -> Maybe v | Eq k
149
150 /** lookup _ k [...(k,v)...] = v
151 lookup v k _ = v
152 */
153 lookupd :: v !k !(AssocList k v) -> v | Eq k
154
155 /** keymember k [...(k,v)...] = True
156 keymember _ _ = False
157 */
158 keymember :: !k !(AssocList k v) -> Bool | Eq k
159
160 /** addkeyvalue (k,v) [...(k,_)...] = [...(k,v)...]
161 addkeyvalue _ assocl = assocl ++ [(k,v)]
162 */
163 addkeyvalue :: !(!k,v) !(AssocList k v) -> AssocList k v | Eq k
164
165 /** updkeyvalue k f [...(k,v)...] = [...(k,f v)...]
166 updkeyvalue _ _ assocl = assocl
167 */
168 updkeyvalue :: !k !(v -> v) !(AssocList k v) -> AssocList k v | Eq k
169
170 /** deletekeyvalue k [...(k,v)...] = [... ...]
171 deletekeyvalue _ assocl = assocl
172 */
173 deletekeyvalue :: !k !(AssocList k v) -> AssocList k v | Eq k
174
175 /** isAllMember xs ys is true iff all elements of xs are member of ys.
176 */
177 isAllMember :: ![a] [a] -> Bool | Eq a
178
179 /** zipWith f as bs = [f a_0 b_0, f a_1 b_1, ..., f a_n b_n]
180 */
181 zipWith :: (a b -> c) ![a] ![b] -> [c]
182
183 /** setbetween x low up
184 returns x iff low <= x <= up
185 returns low iff low > x
186 returns up iff x > up
187 */
188 setbetween :: !a !a !a -> a | Ord a
189
190 /** isbetween x low up
191 returns True iff low <= x <= up
192 */
193 isbetween :: !a !a !a -> Bool | Ord a
194
195 /** minmax (a,b) = (a,b) if a<=b; (b,a) otherwise
196 */
197 minmax :: !(!a,!a) -> (!a,!a) | Ord a
198
199 /** swap (a,b) = (b,a)
200 */
201 swap :: !(.a,.b) -> (.b,.a)
202
203 /** modulo Int
204 */
205 instance mod Int
206
207 /** foldl1 f xs folds f to the left over non-empty list xs.
208 */
209 foldl1 :: !(a -> a -> a) ![a] -> a
210
211 /** foldr1 f xs folds f to the right over non-empty list xs.
212 */
213 foldr1 :: !(a -> a -> a) ![a] -> a
214
215 /* removeQuotes str removes all quotes and slashes from str.
216 */
217 removeQuotes :: !{#Char} -> String
218
219 /** stringStarts str prefix yields true iff str = prefix +++ s for some s.
220 */
221 stringStarts :: !String !String -> Bool
222
223 /** removePrefix str prefix yields (Just s) iff str = prefix +++ s, and Nothing otherwise.
224 */
225 removePrefix :: !String !String -> Maybe String
226
227 replaceInString :: !String !String !String -> String
228
229 /** other a yields the only other value of a domain that consists of two values.
230 */
231 class other a :: !a -> a
232
233 /** isSorted [x_0..x_n] holds iff x_i <= x_{i+1} for each x_i in [x_0..x_{n-1}].
234 */
235 isSorted :: ![a] -> Bool | Ord a
236
237 /** perhaps p Nothing = False, and perhaps p (Just a) = p a
238 */
239 perhaps :: !(a -> Bool) !(Maybe a) -> Bool
240
241 /** instance ~ Bool = not
242 */
243 instance ~ Bool
244
245 /** instance fromString Int = toInt
246 */
247 instance fromString Int
248
249 /** better class definitions of the trigonometry functions:
250 */
251 class sinus a :: !a -> Real
252 class cosinus a :: !a -> Real
253 class tangens a :: !a -> Real
254 class arcsinus a :: !Real -> a
255 class arccosinus a :: !Real -> a
256 class arctangens a :: !Real -> a
257
258 instance sinus Real
259 instance cosinus Real
260 instance tangens Real
261 instance arcsinus Real
262 instance arccosinus Real
263 instance arctangens Real