diff options
author | Tom Smeding <tom@tomsmeding.com> | 2024-11-09 11:15:06 +0100 |
---|---|---|
committer | Tom Smeding <tom@tomsmeding.com> | 2024-11-09 11:15:06 +0100 |
commit | 992249ebf159ba3783a9345430013e52294c26aa (patch) | |
tree | 2d1a8324310aebd60062fdb7d9ba785fe0298d0c /src/Interpreter.hs | |
parent | cbe6472a14cc0887295034bb29546dd1a1f083fd (diff) |
Maximum/minimum
Diffstat (limited to 'src/Interpreter.hs')
-rw-r--r-- | src/Interpreter.hs | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/Interpreter.hs b/src/Interpreter.hs index 47514ae..3c1aad0 100644 --- a/src/Interpreter.hs +++ b/src/Interpreter.hs @@ -103,13 +103,25 @@ interpret'Rec env = \case arr <- interpret' env e let STArr _ (STScal t) = typeOf e sh `ShCons` n = arrayShape arr - numericIsNum t $ arrayGenerateM sh $ \idx -> return $ sum [arrayIndex arr (idx `IxCons` i) | i <- [0 .. n - 1]] + numericIsNum t $ return $ arrayGenerate sh $ \idx -> sum [arrayIndex arr (idx `IxCons` i) | i <- [0 .. n - 1]] EUnit _ e -> arrayGenerateLinM ShNil (\_ -> interpret' env e) EReplicate1Inner _ a b -> do n <- fromIntegral @Int64 @Int <$> interpret' env a arr <- interpret' env b let sh = arrayShape arr - arrayGenerateM (sh `ShCons` n) (\(idx `IxCons` _) -> return (arrayIndex arr idx)) + return $ arrayGenerate (sh `ShCons` n) (\(idx `IxCons` _) -> arrayIndex arr idx) + EMaximum1Inner _ e -> do + arr <- interpret' env e + let STArr _ (STScal t) = typeOf e + sh `ShCons` n = arrayShape arr + numericIsNum t $ return $ + arrayGenerate sh (\idx -> maximum [arrayIndex arr (idx `IxCons` i) | i <- [0 .. n-1]]) + EMinimum1Inner _ e -> do + arr <- interpret' env e + let STArr _ (STScal t) = typeOf e + sh `ShCons` n = arrayShape arr + numericIsNum t $ return $ + arrayGenerate sh (\idx -> minimum [arrayIndex arr (idx `IxCons` i) | i <- [0 .. n-1]]) EConst _ _ v -> return v EIdx0 _ e -> (`arrayIndexLinear` 0) <$> interpret' env e EIdx1 _ a b -> arrayIndex1 <$> interpret' env a <*> (fromIntegral @Int64 @Int <$> interpret' env b) |