Skip to content

Commit

Permalink
Merge pull request #163 from aplavin/moreoptics
Browse files Browse the repository at this point in the history
more function optics
  • Loading branch information
jw3126 authored Jul 31, 2024
2 parents 4c297d1 + bb39276 commit 6087e2f
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/functionlenses.jl
Original file line number Diff line number Diff line change
Expand Up @@ -138,12 +138,14 @@ function set(x, ::typeof(abs), y)
s = sign(x)
iszero(s) ? y * one(x) : y * s
end
set(x, ::typeof(abs2), y) = set(x, abs, y)

set(x, ::typeof(mod2pi), y) = set(x, @optic(mod(_, 2π)), y)
set(x, f::Base.Fix2{typeof(fld)}, y) = set(x, @optic(first(fldmod(_, f.x))), y)
set(x, f::Base.Fix2{typeof(mod)}, y) = set(x, @optic(last(fldmod(_, f.x))), y)
set(x, f::Base.Fix2{typeof(div)}, y) = set(x, @optic(first(divrem(_, f.x))), y)
set(x, f::Base.Fix2{typeof(rem)}, y) = set(x, @optic(last(divrem(_, f.x))), y)
set(x, f::Base.Fix2{typeof(mod),<:AbstractUnitRange}, y) = @set mod($x - first(f.x), length(f.x)) + first(f.x) = y

set(x::AbstractString, f::Base.Fix1{typeof(parse), Type{T}}, y::T) where {T} = string(y)

Expand Down Expand Up @@ -171,6 +173,7 @@ delete(s::AbstractString, o::typeof(last)) = chop(s; head=0, tail=1)
delete(s::AbstractString, o::Base.Fix2{typeof(first)}) = chop(s; head=o.x, tail=0)
delete(s::AbstractString, o::Base.Fix2{typeof(last)}) = chop(s; head=0, tail=o.x)

set(s::AbstractString, o::typeof(chomp), v) = endswith(s, '\n') ? v * '\n' : v
if VERSION >= v"1.8"
set(s::AbstractString, o::Base.Fix2{typeof(chopsuffix), <:AbstractString}, v) =
endswith(s, o.x) ? v * o.x : v
Expand Down
4 changes: 4 additions & 0 deletions test/test_extensions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ VERSION >= v"1.9-" && @testset "IntervalSets" begin
@test 2 === @set 2 |> mod(_, 20..23) = 20
@test 33 === @set 32 |> mod(_, 20..23) = 21
test_getset_laws(@optic(mod(_, 5..8)), 20, 6, 5)

@test_throws Exception mod(3, 1..0)
@test_throws Exception @set mod($3, 1..0) = 1
@test_throws Exception @set mod($3, 1..5) = 10
end

@testset "StaticArrays" begin
Expand Down
17 changes: 17 additions & 0 deletions test/test_functionlenses.jl
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,19 @@ end
test_getset_laws(o, x, 10, 20; cmp=isapprox)
@inferred set(x, o, 10)
end

@testset for (rng, x, y) in [
(0:3, 2, 1),
(0:3, 32, 1),
(20:23, 2, 20),
(20:23, 32, 21),
(5:8, 20, 6),
]
test_getset_laws((@o mod(_, rng)), x, y, y+1)
end
@test_throws Exception mod(3, 1:0)
@test_throws Exception @set mod($3, 1:0) = 1
@test_throws Exception @set mod($3, 1:5) = 10

x = 3 + 4im
@test @set(abs(-2u"m") = 1u"m") === -1u"m"
Expand All @@ -272,6 +285,7 @@ end
@test set(0+0im, abs, 10) == 10
@test set(0+1e-100im, abs, 10) == 10im
@test_throws DomainError @set(abs(x) = -10)
test_getset_laws(abs2, 1+2im, 3, 4, cmp=())

# composition
o = @optic 1/(1 + exp(-_))
Expand Down Expand Up @@ -362,6 +376,9 @@ end
test_getset_laws(@optic(lstrip(==(' '), _)), " abc ", "def", "")
test_getset_laws(@optic(rstrip(==(' '), _)), " abc ", "def", "")
test_getset_laws(@optic(strip(==(' '), _)), " abc ", "def", "")
test_getset_laws(chomp, "abc", "def", "")
test_getset_laws(chomp, "abc\n", "def", "")
test_getset_laws(chomp, "abc\n\n", "def\n", "")

if VERSION >= v"1.8"
test_getset_laws(@optic(chopprefix(_, "def")), "def abc", "xyz", "")
Expand Down

0 comments on commit 6087e2f

Please sign in to comment.