nu met gratis de library waar de borige commit over ging
[cc1516.git] / yard.icl
1 implementation module yard
2
3 import StdTuple
4 from StdClass import Eq
5 import Data.Functor
6 import Control.Monad
7 import Control.Applicative
8 from Data.Func import $
9
10 runParser :: (Parser a b) [a] -> (Either Error b, [a])
11 runParser (Parser f) i = f i
12
13 instance Functor (Parser a) where
14 //fmap f m = liftM f m
15 fmap g p = Parser \i -> case runParser p i of
16 (Right r, rest) = (Right $ g r, rest)
17 (Left e, rest) = (Left e, rest)
18
19 instance Applicative (Parser a) where
20 pure a = Parser \i -> (Right a, i)
21 //(<*>) sf p = ap sf p
22 (<*>) pf p = Parser \i -> case runParser pf i of
23 (Right f, rest) = runParser (fmap f p) rest
24 (Left e, rest) = (Left e, rest)
25
26 instance Monad (Parser a) where
27 bind p f = Parser \i -> case runParser p i of
28 (Right r, rest) = runParser (f r) rest
29 (Left e, rest) = (Left e, rest)
30
31 //some, many, optional and l
32 instance Alternative (Parser a) where
33 empty = Parser \i -> (Left ParseException, i)
34 (<|>) p1 p2 = Parser \i -> case runParser p1 i of
35 (Right r, rest) = (Right r, rest)
36 (Left _, rest) = runParser p2 i
37
38 fail :: Parser a b
39 fail = empty
40
41 top :: Parser a a
42 top = Parser \i -> case i of
43 [] = (Left ParseException, [])
44 [x:xs] = (Right x, xs)
45
46 satisfy :: (a -> Bool) -> Parser a a
47 satisfy f = one >>= \r -> if (f r) (return r) fail
48
49 item :: a -> Parser a a | Eq a
50 item a = satisfy ((==)a)
51
52 list :: [a] -> Parser a [a] | Eq a
53 list as = mapM item as