-(!!?) :: Mat m n a -> (Int, Int) -> Maybe a
-(!!?) m@(Mat rows) (i, j)
- | i < 0 || j < 0 = Nothing
- | i > V.length rows = Nothing
- | otherwise = if j > V.length (row m j)
- then Nothing
- else Just $ (row m j) ! j
+--
+-- Examples:
+--
+-- >>> let m = fromList [[1,2],[3,4]] :: Mat2 Int
+-- >>> m !!? (-1,-1)
+-- Nothing
+-- >>> m !!? (-1,0)
+-- Nothing
+-- >>> m !!? (-1,1)
+-- Nothing
+-- >>> m !!? (0,-1)
+-- Nothing
+-- >>> m !!? (0,0)
+-- Just 1
+-- >>> m !!? (0,1)
+-- Just 2
+-- >>> m !!? (1,-1)
+-- Nothing
+-- >>> m !!? (1,0)
+-- Just 3
+-- >>> m !!? (1,1)
+-- Just 4
+-- >>> m !!? (2,-1)
+-- Nothing
+-- >>> m !!? (2,0)
+-- Nothing
+-- >>> m !!? (2,1)
+-- Nothing
+-- >>> m !!? (2,2)
+-- Nothing
+--
+(!!?) :: (Arity m, Arity n) => Mat m n a -> (Int, Int) -> Maybe a
+(!!?) matrix idx =
+ ifoldl2 f Nothing matrix
+ where
+ f k l found cur = if (k,l) == idx then (Just cur) else found