phino 0.0.0.20 → 0.0.0.21
raw patch · 4 files changed
+22/−16 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Yaml: Match :: String -> Expression -> Condition
+ Yaml: Matches :: String -> Expression -> Condition
Files
- phino.cabal +1/−1
- src/Condition.hs +14/−8
- src/Yaml.hs +4/−4
- test/ConditionSpec.hs +3/−3
phino.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.0 name: phino-version: 0.0.0.20+version: 0.0.0.21 license: MIT synopsis: Command-Line Manipulator of 𝜑-Calculus Expressions description: Please see the README on GitHub at <https://github.com/objectionary/phino#readme>
src/Condition.hs view
@@ -7,11 +7,14 @@ import Ast import Builder (buildAttribute, buildBinding)+import Control.Exception (SomeException (SomeException), evaluate)+import Control.Exception.Base (try) import Data.Aeson (FromJSON) import qualified Data.ByteString.Char8 as B import qualified Data.Map.Strict as M import Functions (buildTermFromFunction) import GHC.IO (unsafePerformIO)+import Logger (logDebug) import Matcher import Misc (allPathsIn, btsToUnescapedStr) import Pretty (prettyExpression, prettySubsts)@@ -137,10 +140,10 @@ onTau <- meetCondition' (Y.XI texpr) subst pure [subst | not (null onExpr) && not (null onTau)] meetCondition' (Y.XI (ExDispatch expr _)) subst = meetCondition' (Y.XI expr) subst-meetCondition' (Y.Match pat (ExMeta meta)) (Subst mp) = case M.lookup meta mp of- Just (MvExpression expr _) -> meetCondition' (Y.Match pat expr) (Subst mp)+meetCondition' (Y.Matches pat (ExMeta meta)) (Subst mp) = case M.lookup meta mp of+ Just (MvExpression expr _) -> meetCondition' (Y.Matches pat expr) (Subst mp) _ -> pure []-meetCondition' (Y.Match pat expr) subst = do+meetCondition' (Y.Matches pat expr) subst = do (TeBytes tgt) <- buildTermFromFunction "dataize" [Y.ArgExpression expr] subst (Program expr) matched <- match (B.pack pat) (B.pack (btsToUnescapedStr tgt)) pure [subst | matched]@@ -151,11 +154,14 @@ meetCondition :: Y.Condition -> [Subst] -> IO [Subst] meetCondition _ [] = pure [] meetCondition cond (subst : rest) = do- first <- meetCondition' cond subst- next <- meetCondition cond rest- if null first- then pure next- else pure (head first : next)+ met <- try (meetCondition' cond subst) :: IO (Either SomeException [Subst])+ case met of+ Right first -> do+ next <- meetCondition cond rest+ if null first+ then pure next+ else pure (head first : next)+ Left _ -> meetCondition cond rest -- Returns Just [...] if -- 1. program matches pattern and
src/Yaml.hs view
@@ -94,10 +94,10 @@ pure (In attr bd) _ -> fail "'in' expects exactly two arguments", do- vals <- v .: "match"+ vals <- v .: "matches" case vals of- [pat, exp] -> Match <$> parseJSON pat <*> parseJSON exp- _ -> fail "'match' expects exactly two arguments"+ [pat, exp] -> Matches <$> parseJSON pat <*> parseJSON exp+ _ -> fail "'matches' expects exactly two arguments" ] ) @@ -142,7 +142,7 @@ | Eq Comparable Comparable | NF Expression | XI Expression- | Match String Expression+ | Matches String Expression deriving (Generic, Show) data ExtraArgument
test/ConditionSpec.hs view
@@ -7,17 +7,17 @@ module ConditionSpec where import Ast (Expression, Program (Program))-import Condition (meetCondition) import Control.Monad import Data.Aeson import Data.Yaml qualified as Y import GHC.Generics-import Matcher (matchProgram) import Misc-import Pretty (prettySubsts) import System.FilePath import Test.Hspec (Spec, describe, expectationFailure, it, runIO) import Yaml qualified+import Matcher+import Condition+import Pretty data ConditionPack = ConditionPack { expression :: Expression,