mirror of
https://github.com/IBM/fp-go.git
synced 2025-08-10 22:31:32 +02:00
fix: introduce stateless iterator
Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
This commit is contained in:
@@ -19,7 +19,7 @@ import (
|
||||
G "github.com/IBM/fp-go/context/readerioeither/generic"
|
||||
)
|
||||
|
||||
// WithContext wraps an existing ReaderIOEither and performs a context check for cancellation before delegating
|
||||
// WithContext wraps an existing [ReaderIOEither] and performs a context check for cancellation before delegating
|
||||
func WithContext[A any](ma ReaderIOEither[A]) ReaderIOEither[A] {
|
||||
return G.WithContext(ma)
|
||||
}
|
||||
|
1
context/readerioeither/data/file.txt
Normal file
1
context/readerioeither/data/file.txt
Normal file
@@ -0,0 +1 @@
|
||||
Carsten
|
@@ -23,7 +23,7 @@ import (
|
||||
EQ "github.com/IBM/fp-go/eq"
|
||||
)
|
||||
|
||||
// Eq implements the equals predicate for values contained in the IOEither monad
|
||||
// Eq implements the equals predicate for values contained in the [ReaderIOEither] monad
|
||||
func Eq[A any](eq EQ.Eq[ET.Either[error, A]]) func(context.Context) EQ.Eq[ReaderIOEither[A]] {
|
||||
return G.Eq[ReaderIOEither[A]](eq)
|
||||
}
|
||||
|
@@ -48,7 +48,7 @@ func Close[C io.Closer](c C) RIOE.ReaderIOEither[any] {
|
||||
|
||||
// ReadFile reads a file in the scope of a context
|
||||
func ReadFile(path string) RIOE.ReaderIOEither[[]byte] {
|
||||
return RIOE.WithResource[*os.File, []byte](Open(path), Close[*os.File])(func(r *os.File) RIOE.ReaderIOEither[[]byte] {
|
||||
return RIOE.WithResource[[]byte](Open(path), Close[*os.File])(func(r *os.File) RIOE.ReaderIOEither[[]byte] {
|
||||
return func(ctx context.Context) IOE.IOEither[error, []byte] {
|
||||
return IOE.MakeIO(func() ET.Either[error, []byte] {
|
||||
return file.ReadAll(ctx, r)
|
||||
|
@@ -20,7 +20,7 @@ import (
|
||||
)
|
||||
|
||||
// WithResource constructs a function that creates a resource, then operates on it and then releases the resource
|
||||
func WithResource[R, A, ANY any](onCreate ReaderIOEither[R], onRelease func(R) ReaderIOEither[ANY]) func(func(R) ReaderIOEither[A]) ReaderIOEither[A] {
|
||||
func WithResource[A, R, ANY any](onCreate ReaderIOEither[R], onRelease func(R) ReaderIOEither[ANY]) func(func(R) ReaderIOEither[A]) ReaderIOEither[A] {
|
||||
// wraps the callback functions with a context check
|
||||
return G.WithResource[ReaderIOEither[A]](onCreate, onRelease)
|
||||
}
|
||||
|
79
context/readerioeither/resource_test.go
Normal file
79
context/readerioeither/resource_test.go
Normal file
@@ -0,0 +1,79 @@
|
||||
// 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 readerioeither
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
B "github.com/IBM/fp-go/bytes"
|
||||
F "github.com/IBM/fp-go/function"
|
||||
IO "github.com/IBM/fp-go/io"
|
||||
IOE "github.com/IBM/fp-go/ioeither"
|
||||
)
|
||||
|
||||
var (
|
||||
openFile = F.Flow3(
|
||||
IOE.Eitherize1(os.Open),
|
||||
FromIOEither[*os.File],
|
||||
ChainFirstIOK(F.Flow2(
|
||||
(*os.File).Name,
|
||||
IO.Logf[string]("Opened file [%s]"),
|
||||
)),
|
||||
)
|
||||
)
|
||||
|
||||
func closeFile(f *os.File) ReaderIOEither[string] {
|
||||
return F.Pipe1(
|
||||
TryCatch(func(_ context.Context) func() (string, error) {
|
||||
return func() (string, error) {
|
||||
return f.Name(), f.Close()
|
||||
}
|
||||
}),
|
||||
ChainFirstIOK(IO.Logf[string]("Closed file [%s]")),
|
||||
)
|
||||
}
|
||||
|
||||
func ExampleWithResource() {
|
||||
|
||||
stringReader := WithResource[string](openFile("data/file.txt"), closeFile)
|
||||
|
||||
rdr := stringReader(func(f *os.File) ReaderIOEither[string] {
|
||||
return F.Pipe2(
|
||||
TryCatch(func(_ context.Context) func() ([]byte, error) {
|
||||
return func() ([]byte, error) {
|
||||
return io.ReadAll(f)
|
||||
}
|
||||
}),
|
||||
ChainFirstIOK(F.Flow2(
|
||||
B.Size,
|
||||
IO.Logf[int]("Read content of length [%d]"),
|
||||
)),
|
||||
Map(B.ToString),
|
||||
)
|
||||
})
|
||||
|
||||
contentIOE := F.Pipe2(
|
||||
context.Background(),
|
||||
rdr,
|
||||
IOE.ChainFirstIOK[error](IO.Printf[string]("Content: %s")),
|
||||
)
|
||||
|
||||
contentIOE()
|
||||
|
||||
// Output: Content: Carsten
|
||||
}
|
@@ -21,5 +21,6 @@ import (
|
||||
RE "github.com/IBM/fp-go/readerioeither"
|
||||
)
|
||||
|
||||
// ReaderIOEither is a specialization of the Reader monad for the typical golang scenario
|
||||
// ReaderIOEither is a specialization of the [RE.ReaderIOEither] monad for the typical golang scenario in which the
|
||||
// left value is an [error] and the context is a [context.Context]
|
||||
type ReaderIOEither[A any] RE.ReaderIOEither[context.Context, error, A]
|
||||
|
Reference in New Issue
Block a user