diff --git a/src/Bergamot/Search.elm b/src/Bergamot/Search.elm index 512aed7..fe0007c 100644 --- a/src/Bergamot/Search.elm +++ b/src/Bergamot/Search.elm @@ -1,4 +1,4 @@ -module Bergamot.Search exposing (..) +module Bergamot.Search exposing (Search, map, apply, andThen, pure, fail, interleave, one) type SearchStep a = Empty @@ -12,6 +12,24 @@ map f s () = Empty -> Empty Found a sp -> Found (f a) (map f sp) +apply : Search (a -> b) -> Search a -> Search b +apply sf sa () = + case sf () of + Empty -> Empty + Found f sfp -> interleave (map f sa) (apply sfp sa) () + +andThen : (a -> Search b) -> Search a -> Search b +andThen f sa () = + case sa () of + Empty -> Empty + Found a sap -> interleave (f a) (andThen f sap) () + +pure : a -> Search a +pure a () = Found a (\() -> Empty) + +fail : Search a +fail () = Empty + interleave : Search a -> Search a -> Search a interleave s1 s2 () = case s1 () of