shithub: MicroHs

Download patch

ref: a16c884ed8631365a4e96e5c552120e5fc748435
parent: 1ea602aafb8fde4afd5c0f7dbbdb673627782b4d
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Sat Feb 3 17:11:29 EST 2024

Temporary Read class.

--- a/lib/Text/Read.hs
+++ b/lib/Text/Read.hs
@@ -1,6 +1,58 @@
 module Text.Read(
-  Read(..)
+  ReadS,
+  Read(..),
   read,
   readMaybe,
-  ReadS,
+  readParen,
   ) where
+import Primitives
+import Control.Error
+import Control.Monad
+import Data.Char
+import Data.Bool_Type
+import Data.Eq
+import Data.List_Type
+import Data.Maybe_Type
+
+type String = [Char]
+
+type ReadS a = String -> [(a, String)]
+
+class Read a where
+  readsPrec    :: Int -> ReadS a
+  readList     :: ReadS [a]
+
+read :: forall a . Read a => String -> a
+read s =
+  case readsPrec 0 s of
+    [(a, [])] -> a
+    _         -> error "read: failed"
+
+readMaybe :: forall a . Read a => String -> Maybe a
+readMaybe s =
+  case readsPrec 0 s of
+    [(a, [])] -> Just a
+    _         -> Nothing
+
+readParen :: forall a . Bool -> ReadS a -> ReadS a
+readParen b g =
+  if b then mandatory else optional
+  where
+    optional :: ReadS a
+    optional r = g r ++ mandatory r
+    mandatory :: ReadS a
+    mandatory r = do
+      -- XXX compiler broken ('(',s) <- lex r
+      (lp,s) <- lex r
+      guard (lp == '(')
+      (x,t) <- optional s
+      -- (')',u) <- lex t
+      (rp,u) <- lex t
+      guard (rp == ')')
+      return (x,u)
+
+-- Really bad lexer
+lex :: ReadS Char
+lex "" = []
+lex (c:cs) | isSpace c = lex cs
+           | True = [(c, cs)]
--