+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}))
+ )