packages feed

haskellish 0.1.2 → 0.2.0

raw patch · 2 files changed

+120/−80 lines, 2 filesdep +mtlPVP ok

version bump matches the API change (PVP)

Dependencies added: mtl

API changes (from Hackage documentation)

- Language.Haskellish: askSpan :: Haskellish Span
- Language.Haskellish: instance GHC.Base.Alternative Language.Haskellish.Haskellish
- Language.Haskellish: instance GHC.Base.Applicative Language.Haskellish.Haskellish
- Language.Haskellish: instance GHC.Base.Functor Language.Haskellish.Haskellish
- Language.Haskellish: instance GHC.Base.Monad Language.Haskellish.Haskellish
- Language.Haskellish: instance GHC.Base.MonadPlus Language.Haskellish.Haskellish
+ Language.Haskellish: exp :: Haskellish st (Exp SrcSpanInfo)
+ Language.Haskellish: haskellishError :: String -> Haskellish st a
+ Language.Haskellish: instance Control.Monad.Error.Class.MonadError GHC.Base.String (Language.Haskellish.Haskellish st)
+ Language.Haskellish: instance Control.Monad.State.Class.MonadState st (Language.Haskellish.Haskellish st)
+ Language.Haskellish: instance GHC.Base.Alternative (Language.Haskellish.Haskellish st)
+ Language.Haskellish: instance GHC.Base.Applicative (Language.Haskellish.Haskellish st)
+ Language.Haskellish: instance GHC.Base.Functor (Language.Haskellish.Haskellish st)
+ Language.Haskellish: instance GHC.Base.Monad (Language.Haskellish.Haskellish st)
+ Language.Haskellish: instance GHC.Base.MonadPlus (Language.Haskellish.Haskellish st)
+ Language.Haskellish: listExpressions :: Exp SrcSpanInfo -> Either String [Exp SrcSpanInfo]
+ Language.Haskellish: span :: Haskellish st Span
- Language.Haskellish: Haskellish :: (Exp SrcSpanInfo -> Either String a) -> Haskellish a
+ Language.Haskellish: Haskellish :: (st -> Exp SrcSpanInfo -> Either String (a, st)) -> Haskellish st a
- Language.Haskellish: [runHaskellish] :: Haskellish a -> Exp SrcSpanInfo -> Either String a
+ Language.Haskellish: [runHaskellish] :: Haskellish st a -> st -> Exp SrcSpanInfo -> Either String (a, st)
- Language.Haskellish: asRightSection :: Haskellish (a -> b -> c) -> Haskellish b -> Haskellish (a -> c)
+ Language.Haskellish: asRightSection :: Haskellish st (a -> b -> c) -> Haskellish st b -> Haskellish st (a -> c)
- Language.Haskellish: data Haskellish a
+ Language.Haskellish: data Haskellish st a
- Language.Haskellish: identifier :: Haskellish String
+ Language.Haskellish: identifier :: Haskellish st String
- Language.Haskellish: integer :: Haskellish Integer
+ Language.Haskellish: integer :: Haskellish st Integer
- Language.Haskellish: list :: Haskellish a -> Haskellish [a]
+ Language.Haskellish: list :: Haskellish st a -> Haskellish st [a]
- Language.Haskellish: listOfDoStatements :: Haskellish a -> Haskellish [a]
+ Language.Haskellish: listOfDoStatements :: Haskellish st a -> Haskellish st [a]
- Language.Haskellish: rational :: Haskellish Rational
+ Language.Haskellish: rational :: Haskellish st Rational
- Language.Haskellish: rationalOrInteger :: Haskellish Rational
+ Language.Haskellish: rationalOrInteger :: Haskellish st Rational
- Language.Haskellish: reserved :: String -> Haskellish ()
+ Language.Haskellish: reserved :: String -> Haskellish st ()
- Language.Haskellish: reverseApplication :: Haskellish a -> Haskellish (a -> b) -> Haskellish b
+ Language.Haskellish: reverseApplication :: Haskellish st a -> Haskellish st (a -> b) -> Haskellish st b
- Language.Haskellish: string :: Haskellish String
+ Language.Haskellish: string :: Haskellish st String
- Language.Haskellish: tuple :: Haskellish a -> Haskellish b -> Haskellish (a, b)
+ Language.Haskellish: tuple :: Haskellish st a -> Haskellish st b -> Haskellish st (a, b)

Files

Language/Haskellish.hs view
@@ -1,26 +1,39 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+ module Language.Haskellish where -import Language.Haskell.Exts+import Language.Haskell.Exts as Exts import Control.Applicative import Control.Monad+import Control.Monad.State+import Control.Monad.Except import Data.Either (isRight) import Data.Maybe (catMaybes)  -data Haskellish a = Haskellish { runHaskellish :: Exp SrcSpanInfo -> Either String a }+data Haskellish st a = Haskellish { runHaskellish :: st -> Exp SrcSpanInfo -> Either String (a,st) } +exp :: Haskellish st (Exp SrcSpanInfo)+exp = Haskellish (\st e -> return (e,st)) -instance Functor Haskellish where-  fmap f x = Haskellish (fmap f . runHaskellish x)+haskellishError :: String -> Haskellish st a+haskellishError x = Haskellish (\_ _ -> Left x) +instance Functor (Haskellish st) where+  fmap f x = Haskellish (\st e -> do+    (x',st') <- runHaskellish x st e+    Right (f x',st')+    ) -instance Applicative Haskellish where-  pure x = Haskellish (const (Right x))-  f <*> x = Haskellish (\e -> do -- ie. in (Either String) monad++instance Applicative (Haskellish st) where+  pure x = Haskellish (\st _ -> Right (x,st))+  f <*> x = Haskellish (\st e -> do     (e1,e2) <- applicationExpressions e-    f' <- runHaskellish f e1-    x' <- runHaskellish x e2-    return (f' x')+    (f',st') <- runHaskellish f st e1+    (x',st'') <- runHaskellish x st' e2+    Right (f' x',st'')     )  @@ -35,92 +48,110 @@ applicationExpressions _ = Left ""  -instance Alternative Haskellish where-  empty = Haskellish (const (Left ""))-  a <|> b = Haskellish (\e -> do-    let a' = runHaskellish a e-    if isRight a' then a' else runHaskellish b e+instance Alternative (Haskellish st) where+  empty = Haskellish (\_ _ -> Left "")+  a <|> b = Haskellish (\st e -> do+    let a' = runHaskellish a st e+    if isRight a' then a' else runHaskellish b st e     )  -instance Monad Haskellish where-  x >>= f = Haskellish (\e -> do-    x' <- runHaskellish x e-    runHaskellish (f x') e+instance Monad (Haskellish st) where+  x >>= f = Haskellish (\st e -> do+    (x',st') <- runHaskellish x st e+    runHaskellish (f x') st' e     ) -instance MonadPlus Haskellish where++instance MonadPlus (Haskellish st) where   mzero = empty   mplus = (<|>)  -identifier :: Haskellish String -- note: we don't distinguish between identifiers and symbols-identifier = Haskellish f-  where f (Paren _ x) = f x-        f (Var _ (UnQual _ (Ident _ x))) = Right x-        f (Var _ (UnQual _ (Symbol _ x))) = Right x-        f _ = Left ""+instance MonadState st (Haskellish st) where+  get = Haskellish (\st e -> return (st,st))+  put st = Haskellish (\_ e -> return ((),st)) -reserved :: String -> Haskellish ()-reserved x = Haskellish (\e -> do -- in (Either String)-   e' <- runHaskellish identifier e-   if e' == x then Right () else Left ""++instance MonadError String (Haskellish st) where+  throwError x = Haskellish (\_ _ -> Left x)+  catchError x f = Haskellish (\st e -> do+    let x' = runHaskellish x st e+    case x' of+      Left err -> runHaskellish (f err) st e+      Right (x'',st') -> Right (x'',st')+    )+++identifier :: Haskellish st String -- note: we don't distinguish between identifiers and symbols+identifier = Haskellish (\st e -> f st e)+  where f st (Paren _ x) = f st x+        f st (Var _ (UnQual _ (Ident _ x))) = Right (x,st)+        f st (Var _ (UnQual _ (Symbol _ x))) = Right (x,st)+        f _ _ = Left ""++reserved :: String -> Haskellish st ()+reserved x = Haskellish (\st e -> do+   (e',_) <- runHaskellish identifier st e+   if e' == x then Right ((),st) else Left ""    ) -string :: Haskellish String-string = Haskellish f-  where f (Paren _ x) = f x-        f (Lit _ (String _ x _)) = Right x-        f _ = Left ""+string :: Haskellish st String+string = Haskellish (\st e -> f st e)+  where f st (Paren _ x) = f st x+        f st (Lit _ (String _ x _)) = Right (x,st)+        f _ _ = Left "" -integer :: Haskellish Integer-integer = Haskellish f-  where f (Paren _ x) = f x-        f (NegApp _ (Lit _ (Int _ x _))) = Right (x * (-1))-        f (Lit _ (Int _ x _)) = Right x-        f _ = Left ""+integer :: Haskellish st Integer+integer = Haskellish (\st e -> f st e)+  where f st (Paren _ x) = f st x+        f st (NegApp _ (Lit _ (Int _ x _))) = Right (x * (-1),st)+        f st (Lit _ (Int _ x _)) = Right (x,st)+        f _ _ = Left "" -rational :: Haskellish Rational-rational = Haskellish f-  where f (Paren _ x) = f x-        f (NegApp _ (Lit _ (Frac _ x _))) = Right (x * (-1))-        f (Lit _ (Frac _ x _)) = Right x-        f _ = Left ""+rational :: Haskellish st Rational+rational = Haskellish (\st e -> f st e)+  where f st (Paren _ x) = f st x+        f st (NegApp _ (Lit _ (Frac _ x _))) = Right (x * (-1),st)+        f st (Lit _ (Frac _ x _)) = Right (x,st)+        f _ _ = Left "" -rationalOrInteger :: Haskellish Rational-rationalOrInteger = Haskellish f-  where f (Paren _ x) = f x-        f (NegApp _ (Lit _ (Frac _ x _))) = Right (x * (-1))-        f (Lit _ (Frac _ x _)) = Right x-        f (NegApp _ (Lit _ (Int _ x _))) = Right (fromIntegral $ x * (-1))-        f (Lit _ (Int _ x _)) = Right $ fromIntegral x-        f _ = Left ""+rationalOrInteger :: Haskellish st Rational+rationalOrInteger = rational <|> fromIntegral <$> integer -list :: Haskellish a -> Haskellish [a]-list p = Haskellish (\e -> f e >>= mapM (runHaskellish p))+list :: Haskellish st a -> Haskellish st [a]+list p = Haskellish (\st e -> do+  xs <- listExpressions e+  foldM f ([],st) xs+  )   where-    f (Paren _ x) = f x-    f (List _ xs) = Right xs-    f _ = Left ""+    f (ys,st) x = do+      (y,st') <- runHaskellish p st x+      return (ys ++ [y],st') -tuple :: Haskellish a -> Haskellish b -> Haskellish (a,b)-tuple p1 p2 = Haskellish (\e -> do+listExpressions :: Exp SrcSpanInfo -> Either String [Exp SrcSpanInfo]+listExpressions (Paren _ x) = listExpressions x+listExpressions (List _ xs) = Right xs+listExpressions _ = Left ""++tuple :: Haskellish st a -> Haskellish st b -> Haskellish st (a,b)+tuple p1 p2 = Haskellish (\st e -> do   (a,b) <- f e-  a' <- runHaskellish p1 a-  b' <- runHaskellish p2 b-  return (a',b')+  (a',st') <- runHaskellish p1 st a+  (b',st'') <- runHaskellish p2 st' b+  return ((a',b'),st'')   )   where     f (Paren _ x) = f x     f (Tuple _ Boxed (a:b:[])) = Right (a,b)     f _ = Left "" -asRightSection :: Haskellish (a -> b -> c) -> Haskellish b -> Haskellish (a -> c)-asRightSection opP bP = Haskellish (\e -> do+asRightSection :: Haskellish st (a -> b -> c) -> Haskellish st b -> Haskellish st (a -> c)+asRightSection opP bP = Haskellish (\st e -> do   (opExp,bExp) <- f e-  op' <- runHaskellish opP opExp-  b <- runHaskellish bP bExp-  return $ flip op' b+  (op',st') <- runHaskellish opP st opExp+  (b,st'') <- runHaskellish bP st' bExp+  return (flip op' b,st'')   )   where     f (Paren _ x) = f x@@ -136,13 +167,21 @@     f _ = Nothing collectDoStatements _ = [] -listOfDoStatements :: Haskellish a -> Haskellish [a]-listOfDoStatements p = Haskellish (\e -> mapM (runHaskellish p) $ collectDoStatements e)+listOfDoStatements :: Haskellish st a -> Haskellish st [a]+listOfDoStatements p = Haskellish (\st e -> do+  let xs = collectDoStatements e+  foldM f ([],st) xs+  )+  where+    f (ys,st) x = do+      (y,st') <- runHaskellish p st x+      return (ys ++ [y],st') + type Span = ((Int,Int),(Int,Int)) -askSpan :: Haskellish Span-askSpan = Haskellish $ return . expToSpan+span :: Haskellish st Span+span = Haskellish (\st e -> return (expToSpan e,st))  expToSpan :: Exp SrcSpanInfo -> Span expToSpan (Var x _) = srcSpanInfoToSpan x@@ -166,10 +205,10 @@     ex = srcSpanEndColumn $ srcInfoSpan x     ey = srcSpanEndLine $ srcInfoSpan x -reverseApplication :: Haskellish a -> Haskellish (a -> b) -> Haskellish b-reverseApplication x f = Haskellish (\e -> do+reverseApplication :: Haskellish st a -> Haskellish st (a -> b) -> Haskellish st b+reverseApplication x f = Haskellish (\st e -> do   (e1,e2) <- applicationExpressions e-  x' <- runHaskellish x e1-  f' <- runHaskellish f e2-  return (f' x')+  (x',st') <- runHaskellish x st e1+  (f',st'') <- runHaskellish f st' e2+  return (f' x',st'')   )
haskellish.cabal view
@@ -1,5 +1,5 @@ name:                haskellish-version:             0.1.2+version:             0.2.0 synopsis:            For parsing Haskell-ish languages homepage:            http://github.com/dktr0/Haskellish license:             BSD3@@ -27,6 +27,7 @@   Build-depends:       base >=4.8 && <5     , haskell-src-exts >=1.17.1 && <1.23+    , mtl >= 2.2.2 && <2.3  source-repository head   type:     git