module Data.Extensible.Match (
Match(..)
, clause
, match
, mapMatch
, caseOf) where
import Data.Extensible.Internal
import Data.Extensible.Internal.Rig
import Data.Extensible.Product
import Data.Extensible.Sum
clause :: (x ∈ xs, Functor f) => ((h x -> a) -> f (h x -> a)) -> Match h a :* xs -> f (Match h a :* xs)
clause f = sector (fmap Match . f . runMatch)
mapMatch :: (a -> b) -> Match h a x -> Match h b x
mapMatch f (Match g) = Match (f . g)
match :: Match h a :* xs -> h :| xs -> a
match p (UnionAt pos h) = runMatch (hlookup pos p) h
caseOf :: h :| xs -> Match h a :* xs -> a
caseOf = flip match
infix 0 `caseOf`