# FnChain

FnChain is an experimental helper I came up with when dealing with the following nesting closure:

```php
return $query
    ->where('is_enabled', true)
    ->where('available_from', '<=', DB::raw('NOW()'))
    ->where(
        fn (Builder $q) => $q
            ->whereNull('available_until')
            ->orWhere(
                fn (Builder $q) => $q
                    ->whereNotNull('available_until')
                    ->where('available_until', '>', DB::raw('NOW()'))
            )
    );
```

I want to avoid `fn (Builder $q) => $q`. With `FnChain`, above code can be rewritten to:

```php
return $query
    ->where('is_enabled', true)
    ->where('available_from', '<=', DB::raw('NOW()'))
    ->where(
        FnChain
            ::whereNull('available_until')
            ->orWhere(
                FnChain
                    ::whereNotNull('available_until')
                    ->where('available_until', '>', DB::raw('NOW()'))
                    ->toClosure()
            )
            ->toClosure()
    );
```

But the `toClosure` is anoying me, maybe we can use `Closure::fromCallable` to get ride of it?

```php
return $query
    ->where('is_enabled', true)
    ->where('available_from', '<=', DB::raw('NOW()'))
    ->where(Closure::fromCallable(
        FnChain
            ::whereNull('available_until')
            ->orWhere(Closure::fromCallable(
                FnChain
                    ::whereNotNull('available_until')
                    ->where('available_until', '>', DB::raw('NOW()'))
            ))
    ));
```

---

Source code of `FnChain` is available on this Gist: https://gist.github.com/binotaliu/5479edace5f1079f99751b633d460937

---

P.S.

After a while, I realize that the condition `available_until == null or (available_until != null && available_until > NOW())` can be simplified as `available_until == null or available_until > NOW()`. Anyway, this is just an experiment which tries to find a way in PHP to provide more readable code. (Although I don't think it actually improved readability. It's just a fun experiment.)
