From e6426c90c0c896405fa628887846a295b2b0238c Mon Sep 17 00:00:00 2001 From: Carsten Leue Date: Fri, 1 Dec 2023 09:38:30 +0100 Subject: [PATCH] fix: add WithResource to IO and IOOption (#90) Signed-off-by: Dr. Carsten Leue --- io/generic/resource.go | 30 ++++++++++++++++++++++++++++++ io/resource.go | 27 +++++++++++++++++++++++++++ iooption/generic/resource.go | 31 +++++++++++++++++++++++++++++++ iooption/resource.go | 27 +++++++++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 io/generic/resource.go create mode 100644 io/resource.go create mode 100644 iooption/generic/resource.go create mode 100644 iooption/resource.go diff --git a/io/generic/resource.go b/io/generic/resource.go new file mode 100644 index 0000000..f857146 --- /dev/null +++ b/io/generic/resource.go @@ -0,0 +1,30 @@ +// Copyright (c) 2023 IBM Corp. +// All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package generic + +import ( + F "github.com/IBM/fp-go/function" +) + +// WithResource constructs a function that creates a resource, then operates on it and then releases the resource +func WithResource[ + GA ~func() A, + GR ~func() R, + GANY ~func() ANY, + R, A, ANY any](onCreate GR, onRelease func(R) GANY) func(func(R) GA) GA { + // simply map to implementation of bracket + return F.Bind13of3(Bracket[GR, GA, GANY, R, A, ANY])(onCreate, F.Ignore2of2[A](onRelease)) +} diff --git a/io/resource.go b/io/resource.go new file mode 100644 index 0000000..0322a80 --- /dev/null +++ b/io/resource.go @@ -0,0 +1,27 @@ +// Copyright (c) 2023 IBM Corp. +// All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package io + +import ( + G "github.com/IBM/fp-go/io/generic" +) + +// WithResource constructs a function that creates a resource, then operates on it and then releases the resource +func WithResource[ + R, A, ANY any](onCreate IO[R], onRelease func(R) IO[ANY]) func(func(R) IO[A]) IO[A] { + // just dispatch + return G.WithResource[IO[A], IO[R], IO[ANY]](onCreate, onRelease) +} diff --git a/iooption/generic/resource.go b/iooption/generic/resource.go new file mode 100644 index 0000000..02dc4f4 --- /dev/null +++ b/iooption/generic/resource.go @@ -0,0 +1,31 @@ +// Copyright (c) 2023 IBM Corp. +// All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package generic + +import ( + F "github.com/IBM/fp-go/function" + O "github.com/IBM/fp-go/option" +) + +// WithResource constructs a function that creates a resource, then operates on it and then releases the resource +func WithResource[ + GA ~func() O.Option[A], + GR ~func() O.Option[R], + GANY ~func() O.Option[ANY], + R, A, ANY any](onCreate GR, onRelease func(R) GANY) func(func(R) GA) GA { + // simply map to implementation of bracket + return F.Bind13of3(Bracket[GR, GA, GANY, R, A, ANY])(onCreate, F.Ignore2of2[O.Option[A]](onRelease)) +} diff --git a/iooption/resource.go b/iooption/resource.go new file mode 100644 index 0000000..5634d18 --- /dev/null +++ b/iooption/resource.go @@ -0,0 +1,27 @@ +// Copyright (c) 2023 IBM Corp. +// All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package iooption + +import ( + G "github.com/IBM/fp-go/iooption/generic" +) + +// WithResource constructs a function that creates a resource, then operates on it and then releases the resource +func WithResource[ + R, A, ANY any](onCreate IOOption[R], onRelease func(R) IOOption[ANY]) func(func(R) IOOption[A]) IOOption[A] { + // just dispatch + return G.WithResource[IOOption[A], IOOption[R], IOOption[ANY]](onCreate, onRelease) +}