module shallow import StdEnv import Data.Array import Data.Maybe :: In a b = In infix 0 a b (<$>) infixl 4 (<$>) f Nothing = Nothing (<$>) f (Just a) = Just (f a) pure a = Just a (<*>) infixl 4 (<*>) Nothing _ = Nothing (<*>) (Just f) ma = f <$> ma (>>=) infixl 1 (>>=) (Just x) k = k x (>>=) _ _ = Nothing var :: ((Maybe a) -> In a (Maybe b)) -> Maybe b var def = let (i In b) = def (pure i) in b lit :: .a -> Maybe .a lit a = pure a (+.) infixl 6 :: (Maybe a) (Maybe a) -> Maybe a | + a (+.) l r = (+) <$> l <*> r (++.) infixr 5 :: (Maybe (arr a)) (Maybe (arr a)) -> Maybe (arr a) | Array arr a (++.) l r = appendArr <$> l <*> r (!.) infixl 8 :: (Maybe (arr a)) (Maybe Int) -> Maybe a | Array arr a (!.) a i = a >>= \a->i >>= \i->if (i < 0 || i >= size a) Nothing (Just a.[i]) (=.) infixl 9 :: (Maybe *(arr a)) (Maybe Int, Maybe a) -> (Maybe *(arr a)) | Array arr a (=.) a (i, e) = a >>= \a->i >>= \i->if (i < 0 || i >= size a) Nothing (update a i <$> e) //Start = both (var \v=arr {!1,2,3} In v ++. arr {!4,5,6}) //Start = runPrinter (var \v=arr {!1,2,3} In v ++. arr {!4,5,6}) Start = ( "\n" // , var \v={!1,2,3} In v ++. v =. (lit 0, lit 42) , "\n" , var \v={!1,2,3} In v ++. lit {!4,5,6} =. (lit 0, lit 42) , "\n" , var \v={!1,2,3} In v ++. lit {!4,5,65} , "\n" , var \v={!1,2,3} In lit {!4,5,6} ++. v , "\n" // , runMaybe (var \up0=(\a->a =. (lit 0, lit 0)) In up0 (lit {!4,5,6})) )