Skip to content

Instantly share code, notes, and snippets.

@Joxebus
Last active June 14, 2021 16:44
Show Gist options
  • Save Joxebus/f47ecdfb80865080739411215756554a to your computer and use it in GitHub Desktop.
Save Joxebus/f47ecdfb80865080739411215756554a to your computer and use it in GitHub Desktop.
Categories samples
import groovy.time.TimeCategory
use(TimeCategory) {
Date date = new Date("12/10/2008")
Date datePlus10Min = date + 30.minutes
Date dateMinus1Year = date - 1.years
Date datePlus10Hours = date + 10.hours
println date // now
println datePlus10Min // now + 10 min
println dateMinus1Year // a year ago
println datePlus10Hours // a year from now
println "*"*30
Date thirtyMinutesFromNow = 30.minutes.from.now // now + 30 min
Date thirtyMinutesAgo = 1.hours.ago // now - 1 hour
println thirtyMinutesFromNow
println thirtyMinutesAgo
}
class NumberCategory {
static boolean isOdd(Integer self) {
(self % 2) != 0
}
static int triple(Integer self) {
self * 3
}
}
use(NumberCategory) {
(1..30).each { number ->
if(number.isOdd()) {
println "$number is odd"
}
println "$number multiplied by 3 is ${number.triple()}"
}
}
@Category(Integer)
class NumberCategory {
boolean isOdd() {
(this % 2) != 0
}
int triple() {
this * 3
}
}
use(NumberCategory) {
(1..30).each { number ->
if(number.isOdd()) {
println "$number is odd"
}
println "$number multiplied by 3 is ${number.triple()}"
}
}
class TextCategory {
private static String regex = /http[s]?:\/\/[-A-Za-z0-9.\/_-]*[-A-Za-z0-9._-]/
static boolean isUrl(String self) {
self ==~ regex
}
static int countUrls(String self) {
self.split(' ').count{ isUrl(it) }
}
static List<String> collectUrls(String self) {
(self =~ regex).collect()
}
}
String sampleText = """Lorem ipsum dolor sit amet, consectetur adipiscing elit http://google.com.mx Integer
pharetra elit a elit molestie vehicula. Sed in eros mi. Aliquam massa elit, iaculis eget velit non,
malesuada elementum nisl. Cras urna sem, ornare quis turpis id, https://youtube.com facilisis ultrices massa. Duis sit amet
pretium ligula. Curabitur in libero vehicula, facilisis diam eget, maximus velit. Vestibulum ut orci at
velit vulputate placerat https://github.com Nunc varius a arcu nec lacinia. Vestibulum et magna http://facebook.com et metus
venenatis suscipit."""
use(TextCategory) {
List urls = sampleText.collectUrls()
int urlsCount = sampleText.countUrls()
assert urls.size() == urlsCount
println """
URLs count: $urlsCount
URLs: $urls
"""
}
abstract class To {
Number number
To(Number number) { this.number = number }
Number getMeters() {
throw new UnsupportedOperationException("Not supported for meters")
}
Number getCentimeters() {
throw new UnsupportedOperationException("Not supported for centimeters")
}
}
class Meter {
Number number
To getTo() {
new To(number) {
@Override
Number getCentimeters() {
this.number * 100
}
}
}
}
class Centimeter{
Number number
To getTo() {
new To(number) {
@Override
Number getMeters() {
this.number / 100
}
}
}
}
class NumberConversor {
static Meter getMeters(Number self) {
new Meter(number:self)
}
static Centimeter getCentimeters(Number self) {
new Centimeter(number:self)
}
}
use(NumberConversor) {
println 1.meters.to.centimeters
println 240.centimeters.to.meters
}
trait To {
Number number
To getTo() {
throw new UnsupportedOperationException("Not implemented")
}
Number getMeters() {
throw new UnsupportedOperationException("Not supported for meters")
}
Number getCentimeters() {
throw new UnsupportedOperationException("Not supported for centimeters")
}
}
class Meter implements To {
@Override
To getTo() {
new Centimeter(number:number*100)
}
@Override
Number getMeters() {
this.number
}
}
class Centimeter implements To {
@Override
To getTo() {
new Meter(number:number/100)
}
@Override
Number getCentimeters() {
this.number
}
}
class NumberConversor {
static Meter getMeters(Number self) {
new Meter(number:self)
}
static Centimeter getCentimeters(Number self) {
new Centimeter(number:self)
}
}
use(NumberConversor) {
println 1.meters.to.centimeters
println 240.centimeters.to.meters
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment