implementation module Regex import StdEnv import Data.Maybe import code from "cleanregex.o" instance zero Flags where zero = 0 :: Regex = { ptr :: Int // pointer to a pcre2_code object , str :: String // string representation } instance toRegex String where toRegex flags s # (ok,r) = c_compile s flags | ok <> 0 = Nothing | r == 0 = Nothing | otherwise = Just {ptr=r, str=s} where c_compile :: !String !Int -> (!Int,!Int) c_compile reg flags = code { ccall cleanrgx_compile "SI:VIp" } instance fromRegex String where fromRegex {str} = str instance toString Regex where toString r = fromRegex r instance fromString (Maybe Regex) where fromString s = toRegex zero s freeRegex :: !Regex -> String freeRegex {ptr,str} = free ptr str where free :: !Int !String -> String free ptr pass = code { ccall cleanrgx_free "p:V:S" } match :: !Regex !Flags !String -> Maybe Bool match {ptr} flags s = case match` ptr flags s of 0 = Just False 1 = Just True _ = Nothing where match` :: !Int !Int !String -> Int match` ptr flags s = code { ccall cleanrgx_exec "pIS:I" }