defmodule Functor.Law do @moduledoc false use Monad.Operators # fmap id ≡ id @doc false def identity?(functor) do (& &1) <|> functor == functor end # fmap (f . g) ≡ fmap f . fmap g @doc false def composition?(functor, fun1, fun2) do (&fun1.(fun2.(&1))) <|> functor == fun1 <|> (fun2 <|> functor) end end