mirror of
https://github.com/IBM/fp-go.git
synced 2025-06-17 00:07:49 +02:00
93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
// 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 array
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
F "github.com/IBM/fp-go/function"
|
|
I "github.com/IBM/fp-go/number/integer"
|
|
O "github.com/IBM/fp-go/option"
|
|
"github.com/IBM/fp-go/ord"
|
|
S "github.com/IBM/fp-go/string"
|
|
)
|
|
|
|
type user struct {
|
|
name string
|
|
age O.Option[int]
|
|
}
|
|
|
|
func (user user) GetName() string {
|
|
return user.name
|
|
}
|
|
|
|
func (user user) GetAge() O.Option[int] {
|
|
return user.age
|
|
}
|
|
|
|
// Example_sort adapts examples from [https://github.com/inato/fp-ts-cheatsheet#sort-elements-with-ord]
|
|
func Example_sort() {
|
|
|
|
strings := From("zyx", "abc", "klm")
|
|
|
|
sortedStrings := F.Pipe1(
|
|
strings,
|
|
Sort(S.Ord),
|
|
) // => ['abc', 'klm', 'zyx']
|
|
|
|
// reverse sort
|
|
reverseSortedStrings := F.Pipe1(
|
|
strings,
|
|
Sort(ord.Reverse(S.Ord)),
|
|
) // => ['zyx', 'klm', 'abc']
|
|
|
|
// sort Option
|
|
optionalNumbers := From(O.Some(1337), O.None[int](), O.Some(42))
|
|
|
|
sortedNums := F.Pipe1(
|
|
optionalNumbers,
|
|
Sort(O.Ord(I.Ord)),
|
|
)
|
|
|
|
// complex object with different rules
|
|
byName := F.Pipe1(
|
|
S.Ord,
|
|
ord.Contramap(user.GetName),
|
|
) // ord.Ord[user]
|
|
|
|
byAge := F.Pipe1(
|
|
O.Ord(I.Ord),
|
|
ord.Contramap(user.GetAge),
|
|
) // ord.Ord[user]
|
|
|
|
sortedUsers := F.Pipe1(
|
|
From(user{name: "a", age: O.Of(30)}, user{name: "d", age: O.Of(10)}, user{name: "c"}, user{name: "b", age: O.Of(10)}),
|
|
SortBy(From(byAge, byName)),
|
|
)
|
|
|
|
fmt.Println(sortedStrings)
|
|
fmt.Println(reverseSortedStrings)
|
|
fmt.Println(sortedNums)
|
|
fmt.Println(sortedUsers)
|
|
|
|
// Output:
|
|
// [abc klm zyx]
|
|
// [zyx klm abc]
|
|
// [None[int] Some[int](42) Some[int](1337)]
|
|
// [{c {false 0}} {b {true 10}} {d {true 10}} {a {true 30}}]
|
|
|
|
}
|