module Data.Monoid.Shrinkers where

import qualified Data.Monoid as O

last :: (a -> [a]) -> O.Last a -> [O.Last a]
last f (O.Last l) = case l of
  Nothing -> []
  Just a -> map O.Last $ Nothing : [Just x | x <- f a]

first :: (a -> [a]) -> O.First a -> [O.First a]
first f (O.First l) = case l of
  Nothing -> []
  Just a -> map O.First $ Nothing : [Just x | x <- f a]