module Pointfree where

import Plugin.Pl.Common (mapTopLevel, mapTopLevel')
import Plugin.Pl.Optimize (optimize)
import Plugin.Pl.Parser (parsePF)
import Plugin.Pl.PrettyPrinter (prettyTopLevel)
import Plugin.Pl.Transform (transform)

import Data.Maybe (listToMaybe)

{- |
  >>> pointfree "I'm not a valid Haskell expression!"
  []
  >>> pointfree "sum xs = foldr (+) 0 xs"
  ["sum = id (fix (const (foldr (+) 0)))","sum = fix (const (foldr (+) 0))","sum = foldr (+) 0"]
-}
pointfree :: String -> [String]
pointfree :: String -> [String]
pointfree
  = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either
    (forall a b. a -> b -> a
const [])
    (forall a b. (a -> b) -> [a] -> [b]
map TopLevel -> String
prettyTopLevel forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *).
Functor f =>
(Expr -> f Expr) -> TopLevel -> f TopLevel
mapTopLevel' Expr -> [Expr]
optimize forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Expr -> Expr) -> TopLevel -> TopLevel
mapTopLevel Expr -> Expr
transform)
  forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either String TopLevel
parsePF

{- |
  >>> pointfree' "I'm not a valid Haskell expression!"
  Nothing
  >>> pointfree' "sum xs = foldr (+) 0 xs"
  Just "sum = foldr (+) 0"
-}
pointfree' :: String -> Maybe String
pointfree' :: String -> Maybe String
pointfree' = forall a. [a] -> Maybe a
listToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
pointfree